Chrome расширение gmail API cookiePolicy - PullRequest
0 голосов
/ 15 ноября 2018

Я создаю расширение Chrome, которое будет читать электронные письма пользователя и проверять их на предмет опечаток.Однако при попытке аутентификации пользователя в моем background.js я сталкиваюсь с этой ошибкой:

uO {message: "Invalid cookiePolicy", stack: "gapi.auth2.ExternallyVisibleError: Invalid cookieP… At handleResponse (extensions :: sendRequest: 67: 7) "}

Вот как я пытаюсь их аутентифицировать:

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

Я супер потерянПрямо сейчас, поскольку они, кажется, не являются окончательным руководством по достижению того, что я пытаюсь сделать где угодно.Кто-нибудь знает, что я могу делать не так?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Раньше я тоже получал эту ошибку, но для расширений Chrome я только знаю, как загрузить их из распакованного на вкладке Расширения.Поэтому использование gapi напрямую никогда не работало для меня.

Как уже упоминал Иван, в расширениях Chrome эта поддержка встроена путем установки раздела «oauth2» в манифесте.Затем вы можете напрямую вызывать API-интерфейсы с помощью Ajax, как в примере с Иваном.

Чтобы использовать пример Ивана, это мой рабочий код для получения списка контактов.Я еще не читал из объекта XHR, но Fiddler подтверждает, что данные возвращаются нормально, без каких-либо файлов cookie или ошибок CORS.Конечно, убедитесь, что вы включили эти API в 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 голосов
/ 23 ноября 2018

Вы не опубликовали свой manifest.json файл, в котором вы бы указали oauth2 учетные данные , поэтому я бы попробовал что-то вроде:

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

И вам не нужно загружать клиент Google API, вы можете получить доступ к Restful API Gmail с XMLHttpRequest s или Fetch API .

...