working pausado para not habilitar funciona esta developer depurar depurador debugger javascript firefox-addon google-drive-sdk xul

javascript - pausado - firefox debugger not working



Accediendo a Google Drive desde una extensión de Firefox (2)

Aunque es posible, dependiendo del caso de uso, también podría ser de interés limitado.

Firefox se envía con un pequeño servidor http, solo los huesos. Se incluye con fines de prueba, pero esta no es una razón para pasarlo por alto.

Vamos a seguir la guía de inicio rápido para ejecutar una aplicación de Drive en Javascript

La parte difícil es configurar los URI de redireccionamiento y los orígenes de Javascript. Obviamente, la configuración correcta es http://localhost , pero ¿cómo puede estar seguro de que cada usuario tiene el puerto 80 disponible?

No puede y, a menos que tenga control sobre sus usuarios, no se garantiza que ningún puerto funcione para todos. Con esto en mente, elijamos el puerto 49870 y oremos.

Entonces, los URI de redirección y los orígenes de Javascript están configurados en http://localhost:49870

Suponiendo que usa Add-on SDK, guarde quickstart.html (recuerde agregar su ID de cliente) en el directorio de data de su extensión. Ahora edita tu main.js

const self = require("sdk/self"); const { Cc, Ci } = require("chrome"); const tabs = require("sdk/tabs"); const httpd = require("sdk/test/httpd"); var quickstart = self.data.load("quickstart.html"); var srv = new httpd.nsHttpServer(); srv.registerPathHandler("/gdrive", function handler(request, response){ response.setHeader("Content-Type", "text/html; charset=utf-8", false); let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); converter.charset = "UTF-8"; response.write(converter.ConvertFromUnicode(quickstart)); }) srv.start(49870); tabs.open("http://localhost:49870/gdrive"); exports.onUnload = function (reason) { srv.stop(function(){}); };

Tenga en cuenta que quickstart.html no se abre como un archivo local, con un resource: URI. La API de Drive no quiere eso. Se sirve en la url http://localhost:49870/gdrive . No hace falta decir que en lugar de html estático podemos usar una plantilla o cualquier otra cosa. También el http://localhost:49870/gdrive puede http://localhost:49870/gdrive con un PageMod regular.

No considero que esto sea una solución real. Es mejor que nada.

Intento acceder (CRUD) a Google Drive desde una extensión de Firefox. Las extensiones están codificadas en Javascript, pero ninguno de los dos SDK de JavaScript existentes parece encajar; el SDK del lado del cliente espera que esté disponible "ventana", que no es el caso en las extensiones, y el SDK del lado del servidor parece depender de las funciones específicas del nodo, ya que una secuencia de comandos que funciona en el nodo ya no funciona cuando cargo en cromo después de ejecutarlo a través de browserify. ¿Estoy atrapado usando llamadas REST sin formato? La secuencia de comandos del nodo que funciona se ve así:

var google = require(''googleapis''); var readlineSync = require(''readline-sync''); var CLIENT_ID = ''....'', CLIENT_SECRET = ''....'', REDIRECT_URL = ''urn:ietf:wg:oauth:2.0:oob'', SCOPE = ''https://www.googleapis.com/auth/drive.file''; var oauth2Client = new google.auth.OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL); var url = oauth2Client.generateAuthUrl({ access_type: ''offline'', // ''online'' (default) or ''offline'' (gets refresh_token) scope: SCOPE // If you only need one scope you can pass it as string }); var code = readlineSync.question(''Auth code? :''); oauth2Client.getToken(code, function(err, tokens) { console.log(''authenticated?''); // Now tokens contains an access_token and an optional refresh_token. Save them. if(!err) { console.log(''authenticated''); oauth2Client.setCredentials(tokens); } else { console.log(''not authenticated''); } });

Envuelvo el nodo GDrive SDK usando browserify en este script:

var Google = new function(){ this.api = require(''googleapis''); this.clientID = ''....''; this.clientSecret = ''....''; this.redirectURL = ''urn:ietf:wg:oauth:2.0:oob''; this.scope = ''https://www.googleapis.com/auth/drive.file''; this.client = new this.api.auth.OAuth2(this.clientID, this.clientSecret, this.redirectURL); } }

que luego se llama usar después de hacer clic en un botón (si el campo de texto no tiene código, inicia el navegador para obtener uno):

function authorize() { var code = document.getElementById("code").value.trim(); if (code === '''') { var url = Google.client.generateAuthUrl({access_type: ''offline'', scope: Google.scope}); var win = Components.classes[''@mozilla.org/appshell/window-mediator;1''].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow(''navigator:browser''); win.gBrowser.selectedTab = win.gBrowser.addTab(url); } else { Google.client.getToken(code, function(err, tokens) { if(!err) { Google.client.setCredentials(tokens); // store token alert(''Succesfully authorized''); } else { alert(''Not authorized: '' + err); // always ends here } }); } }

Pero esto produce el error Not authorized: Invalid protocol: https:


Desde aquí https://developer.mozilla.org/en/docs/Working_with_windows_in_chrome_code puedes probar window = window || content || {} window = window || content || {}

Use la API del cliente JavaScript y no el cliente node.js. Aunque browserify lo hará funcionar. Tendrás que exponer tu secreto de cliente en este último. El flujo de autenticación del lado del cliente es muy diferente al del lado del servidor. Consulte https://developers.google.com/accounts/docs/OAuth2

Habiendo dicho todo esto Realmente no es tan difícil implementar una aplicación con llamadas basadas en REST. Los métodos en todas las bibliotecas de clientes imitan las URL REST correspondientes. Puede configurar algunas funciones propias para gestionar solicitudes y respuestas, y el resto sentiría lo mismo.