Javascript gapi&x2019;s auth弹出窗口立即关闭并失败,出现401错误

Javascript gapi&x2019;s auth弹出窗口立即关闭并失败,出现401错误,javascript,google-oauth,Javascript,Google Oauth,我正在为Google Calendar做一个Chrome扩展,在这里我需要向Google Cloud Endpoints服务器进行身份验证。为此,我使用Google API客户端JavaScript库,使用gapi.auth.authorize方法: var SCOPES = [ "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/calendar.readonly" ];

我正在为Google Calendar做一个Chrome扩展,在这里我需要向Google Cloud Endpoints服务器进行身份验证。为此,我使用Google API客户端JavaScript库,使用
gapi.auth.authorize
方法:

var SCOPES = [
  "https://www.googleapis.com/auth/userinfo.email",
  "https://www.googleapis.com/auth/calendar.readonly"
];

function login() {
  gapi.client.oauth2.userinfo.get().execute(function(response) {
    if (response.code) {
      console.log("cannot auth: " + response.code + " (" + response.message + ")");
    } else {
      console.log("authed " + response.email);
    }
  });
}

gapi.auth.authorize({
  client_id: CLIENT_ID,
  scope: SCOPES.join(" "),
  immediate: immediate
}, login);
现在,有时有效,有时无效。在这种情况下,会出现一个弹出窗口并立即关闭,
响应
对象包含:

{
  "code": 401,
  "message": "Invalid Credentials",
  "data": [
    {
      "domain": "global",
      "reason": "authError",
      "message": "Invalid Credentials",
      "locationType": "header",
      "location": "Authorization"
    }
  ],
  "error": {
    "code": 401,
    "message": "Invalid Credentials",
    "data": [
      {
        "domain": "global",
        "reason": "authError",
        "message": "Invalid Credentials",
        "locationType": "header",
        "location": "Authorization"
      }
    ]
  }
}

我一辈子都找不到错误的来源,也找不到为什么它只是偶尔发生。请注意,另一个Web应用程序使用完全相同的代码(包括客户端ID)并且工作完美。

对于chrome扩展,您应该查看我不能使用
chrome.identity
,因为我需要在扩展和Web应用程序之间共享令牌,而且
chrome.identity
需要另一种类型的客户端IDI。我已经看到一些旧的评论,认为gapi在chrome扩展中不受支持。至少,这是一个测试的边缘案例。你可能想重新考虑一下。我有一个应用程序,它在扩展中愉快地使用了chrome.identity,在web应用程序中与gapi共享,我没有任何共享问题。但是你不需要手动创建对API的请求吗?gapi似乎更容易处理资源……无论如何,你能给我一个共享
chrome.identity
和gapi令牌的例子吗?事实上,我以前试过,但没有成功。我不使用gapi客户端libs。我发现编写自己的RESTAPI调用要容易得多。在我的例子中,我使用AngularJS,因此我定义了$httpResource。令牌只是一个字符串,因此您可以以适合您的应用程序的任何方式共享它。
gapi.auth.authorize({
  client_id: CLIENT_ID,
  scope: SCOPES.join(" "),
  immediate: true
}, login);