Chrome 扩展 gmail API cookiePolicy?

Posted

技术标签:

【中文标题】Chrome 扩展 gmail API cookiePolicy?【英文标题】:Chrome extension gmail API cookiePolicy? 【发布时间】:2019-04-17 23:19:03 【问题描述】:

我正在构建一个 chrome 扩展程序,它将读取用户的电子邮件并检查它们是否存在拼写错误。但是,当尝试在我的 background.js 中对用户进行身份验证时,我遇到了这个错误:

uO 消息:“无效的 cookiePolicy”,堆栈: “gapi.auth2.ExternallyVisibleError:无效的cookieP ...在handleResponse (扩展::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>

ma​​nifest.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"
  

我现在非常迷茫,因为他们似乎并不是实现我在任何地方尝试做的事情的权威指南。有谁知道我可能做错了什么?

【问题讨论】:

我想参考这个SO post OP 解决了关于CORS 的问题并建议使用这个extension。 尝试将权限更改为"https://apis.google.com/" - 您无法在此处指定路径。 你见过this SO Q&A吗? callbackcallbackFunction 在您的代码中都未定义。你从不检查也不使用token @IvánNokonoko 我看到了。但我希望我的 chrome 扩展程序在用户的浏览器上运行,而不是在我托管的某个网络服务器上运行。 【参考方案1】:

您没有发布您的 manifest.json 文件,您将在其中设置 oauth2 credentials,所以我会尝试类似:

ma​​nifest.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);
    
;

而且你不需要加载谷歌API客户端,你可以通过XMLHttpRequests或者Fetch API访问Gmail's Restful API。

【讨论】:

【参考方案2】:

我曾经也遇到过那个 cookie 错误,但是对于 Chrome 扩展,我只知道如何从扩展选项卡中解压缩它们来加载它们。所以直接使用gapi对我来说从来没有用过。

正如 Ivan 所提到的,Chrome 扩展程序通过在清单中设置“oauth2”部分来“内置”这种支持。然后就可以像 Ivan 的例子那样直接用 Ajax 调用 API。

以 Ivan 的示例为基础,这是我获取联系人列表的工作代码。我还没有读取 XHR 对象,但 Fiddler 确认数据恢复正常,没有任何 cookie 或 CORS 错误。当然,请确保您在 console.developers.google.com 中启用这些 API。

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

【讨论】:

以上是关于Chrome 扩展 gmail API cookiePolicy?的主要内容,如果未能解决你的问题,请参考以下文章

用户通过 chrome 扩展加载时如何隐藏 gmail 收件箱菜单

带有 chrome 扩展的 cookie 或 localStorage

带有 chrome 扩展的 cookie 或 localStorage

在 Chrome 扩展中使用时,Fetch API 不发送会话 cookie

在 chrome 扩展中,如何从当前 chrome 用户以外的 gmail 用户获取访问令牌?

Chrome扩展程序(Angularjs)到Gmail附加组件(Appscript)