web-dev-qa-db-fra.com

Chrome extension extension gmail API cookie?

Je construis une extension chrome qui va lire les emails de l'utilisateur et les vérifier pour les fautes de frappe. Cependant, lorsque j'essaie d'authentifier l'utilisateur dans mon fichier background.js, je rencontre cette erreur:

uO {message: "CookiePolicy invalide", empiler: "gapi.auth2.ExternallyVisibleError: cookieP non valide… à l'adresse Réponse_de_Reponse (extensions :: sendRequest: 67: 7)"}

Voici comment j'essaie de les authentifier:

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"
  }

Je suis super perdue en ce moment, car leur semble pas être un guide définitif pour atteindre ce que j'essaye de faire n'importe où. Est-ce que quelqu'un sait ce que je pourrais faire mal?

9
MarksCode

Vous n'avez pas posté votre fichier manifest.json, dans lequel vous auriez défini les informations d'identification oauth2 , donc j'essayerais quelque chose comme:

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);
    }
};

Et vous n'avez pas besoin de charger le client API Google, vous pouvez accéder à l'API Restful de Gmail avec XMLHttpRequests ou à Récupérer l'API .

4
Iván Nokonoko

J'avais aussi l'habitude d'avoir cette erreur de cookie, mais pour les extensions Chrome, je sais seulement comment les charger à partir de décompressé dans l'onglet Extensions. Donc, utiliser gapi directement n'a jamais fonctionné pour moi.

Comme Ivan l'a mentionné, les extensions Chrome ont cette prise en charge "intégrée" en définissant la section "oauth2" dans le manifeste. Ensuite, vous pouvez appeler les API directement avec Ajax comme dans l'exemple d'Ivan.

Pour reprendre l’exemple d’Ivan, voici mon code de travail permettant d’obtenir une liste de contacts. Je n'ai pas encore lu d'objet XHR, mais Fiddler confirme que les données sont correctement renvoyées sans erreur de cookie ou d'erreur CORS. Bien sûr, assurez-vous d'activer ces API dans console.developers.google.com.

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