"OAuth2 not granted or revoked" 尝试评估 Chrome 扩展中的免费试用时

"OAuth2 not granted or revoked" when trying to evaluate free trial in Chrome extension

我正在尝试为我的 Chrome 扩展提供免费试用期,并且一直在关注 Chrome documentation 如何实现这一点。

但是,当我的扩展加载时,后台脚本将以下错误记录到控制台:

Unchecked runtime.lastError while running identity.getAuthToken: OAuth2 not granted or revoked.

控制台指出对 chrome.identity.getAuthToken 的调用是罪魁祸首。这是我后台脚本中的相关代码:

var CWS_LICENSE_API_URL = 'https://www.googleapis.com/chromewebstore/v1.1/userlicenses/';

chrome.identity.getAuthToken({
    'interactive': false
}, function(token) {
    console.log('token', token);

    var req = new XMLHttpRequest();
    req.open('GET', CWS_LICENSE_API_URL + chrome.runtime.id);
    req.setRequestHeader('Authorization', 'Bearer ' + token);
    req.onreadystatechange = function() {
        if (req.readyState == 4) {
            var license = JSON.parse(req.responseText);
            console.log('license', license);
        }
    };
    req.send();
});

我的清单是这样设置的(为简洁起见省略了一些部分):

"manifest_version": 2,
"key": "kkkkkkkkkkkkkkk",

"background": {
    "scripts": [
        "background.js"
    ]
},
"permissions": [
    "storage",
    "identity",
    "https://www.googleapis.com/"
],
"oauth2": {
    "client_id": "cccccccccc.apps.googleusercontent.com",
    "scopes": [
        "https://www.googleapis.com/auth/chromewebstore.readonly"
    ]
}

这是我已经尝试或确认的:

  1. 客户端 ID 与使用我的扩展 ID 生成的 Google 开发人员控制台中的值匹配。
  2. Chrome 网上商店 API 在 Google 开发人员控制台中启用(它是唯一启用的 API)。
  3. 清单中的键与我将扩展程序放入网上商店后生成的值匹配。
  4. 在启用交互模式的情况下调用 getAuthToken 会导致相同的错误。
  5. 我将我的代码与 this example 进行了比较,并没有让我觉得有什么本质上的不同(尽管多一双眼睛来确认不会有什么坏处)。

以防万一,我在 Mac OS X 上使用 Chrome 42.0.2311.135(64 位)。

关于导致错误的原因以及我需要更改什么以使其消失以便我可以查找身份验证令牌和许可证的任何想法?

代码方面,唯一需要更改的是启用交互模式:

chrome.identity.getAuthToken({
    'interactive': true
}, function(token) {
    ...
});

还有一些 PEBCAK 问题正在发生。即:

  1. 交互式身份验证页面可能需要几秒钟才会出现。这似乎是一个带宽问题。这可能是 documentation 建议在某种用户交互时而不是在扩展首次加载时触发身份验证请求的部分原因。
  2. falsetrue 之间翻转交互并重新加载扩展程序不足以对功能进行测试。 getAuthToken 的结果被缓存。当我撤销授权然后刷新甚至删除并重新添加我的扩展程序时,相同的令牌会继续返回一段时间。在启用交互模式的情况下重新启动 Chrome 是我找到这个解决方案的原因。