web-dev-qa-db-de.com

Chrome-Erweiterung für Google Mail-API-Cookies?

Ich baue eine Chrome-Erweiterung, die die E-Mails des Benutzers liest und sie auf Tippfehler überprüft. Beim Versuch, den Benutzer in meinem background.js zu authentifizieren, stelle ich diesen Fehler fest:

uO {Nachricht: "Ungültige CookiePolicy", Stack: "gapi.auth2.ExternallyVisibleError: Ungültiger CookieP ... bei handleResponse (Erweiterungen :: sendRequest: 67: 7)"}

So versuche ich sie zu authentifizieren:

background.js

var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = "https://apis.google.com/js/client.js?onload=callbackFunction";
head.appendChild(script);

chrome.identity.getAuthToken({interactive: true}, authorize);

function authorize(token) {
    gapi.auth.authorize({
        client_id: '800382879116-k3luktdc1lmb1e1fml8i8u.apps.googleusercontent.com',
        immediate: true,
        scope: 'https://www.googleapis.com/auth/gmail.readonly'
    },
    function(result){
        console.log(result);
        gapi.client.load('gmail', 'v1', callback);
    });
}

background.html

<!DOCTYPE html>
<html>
    <body>
        <script src='scripts/background.js'></script>
    </body>
</html>

manifest.json

  {
    "name": "Gmail Typo Analyzer",
    "version": "0.1",
    "description": "Gmail Typo Analyzer",
    "permissions": [
      "identity",
      "storage"
    ],
    "content_security_policy": "script-src 'self' https://apis.google.com; object-src 'self'",
    "oauth2": {
      "client_id": "82879116-k3luktdc1li8u.apps.googleusercontent.com",
      "scopes": [
          "https://www.googleapis.com/auth/gmail.readonly",
          "https://www.googleapis.com/auth/userinfo.email"
      ]
    },
    "browser_action": {
      "default_popup": "popup.html",
      "default_icon": "images/Icon_16.png"
    },
    "background": {
      "page": "background.html",
      "persistent": false
    },
    "icons": {
      "16": "images/Icon_16.png",
      "32": "images/Icon_32.png",
      "48": "images/Icon_48.png",
      "128": "images/Icon_128.png"
    },
    "manifest_version": 2,
    "key": "c0Kn5f+t92r4P8lmmoDlKtQ6X9Q42UfFtkkiSRBAVMPHnIHqOQvYC67VczJefSNTGpUYa8+wQDFoFj/clH9SfR+BvOGgI6BUVKBNGGoFS"
  }

Ich bin im Moment total verloren, da sie nicht als definitive Richtlinie zu verstehen sind, was ich erreichen möchte. Weiß jemand, was ich falsch machen könnte?

9
MarksCode

Sie haben Ihre manifest.json-Datei nicht gepostet, in der Sie die oauth2-Berechtigungsnachweise angeben würden, also würde ich Folgendes versuchen:

manifest.json

...
"oauth2" : "client_id": "800382879116-k3luktdc1lmb1e1fml8i8u.apps.googleusercontent.com",
           "scopes": [
               "https://www.googleapis.com/auth/gmail.readonly"
           ]
...

background.js

chrome.identity.getAuthToken({interactive: true}, authorize);

function authorize(token) {
    if (token) {
         //user has given authorization, use token for requests.
         //...
    } else {
         //no authorization received.
         console.log('No authorization. Error: ' + chrome.runtime.lastError);
    }
};

Sie müssen den Google API-Client nicht laden. Sie können auf Gmail Restful API mit XMLHttpRequests oder Fetch API zugreifen.

4
Iván Nokonoko

Ich habe auch diesen Cookie-Fehler erhalten, aber für Chrome-Erweiterungen weiß ich nur, wie man sie von der Erweiterungsregisterkarte aus lädt. Also hat die Verwendung von gapi für mich nie funktioniert.

Wie bereits erwähnt, haben Chrome-Erweiterungen diese Unterstützung "integriert", indem sie den Abschnitt "oauth2" im Manifest festlegen. Dann können Sie die APIs direkt mit Ajax aufrufen, wie beispielsweise bei Ivan.

Um auf Ivan's Beispiel zu bauen, ist dies mein Arbeitscode, um eine Liste von Kontakten zu erhalten. Ich habe noch nicht aus dem XHR-Objekt gelesen, aber Fiddler bestätigt, dass die Daten ohne Cookie- oder CORS-Fehler zurückkehren. Stellen Sie sicher, dass Sie diese APIs in console.developers.google.com aktivieren.

chrome.identity.getAuthToken({ interactive: true }, authorize);

function authorize(token) {
    if (token) {
        console.log(token);
        var xhr = new XMLHttpRequest();
        xhr.open('GET',
            "https://people.googleapis.com/v1/people/me/connections?personFields=names");
        xhr.setRequestHeader('Authorization',
            'Bearer ' + token);
        xhr.send();

        //user has given authorization, use token for requests.
        //...
    } else {
        console.log('No authorization. Error: ' + chrome.runtime.lastError);
    }
};
0
Sam Robertson