OAuth 2.0 使用 Google 客户端 JavaScript,权限被拒绝

OAuth 2.0 using Google Client for JavaScript, getting permission denied

好吧,这就是交易。我试图展示结合 BigQuery 和地图的非常基本的功能 API。所以,显然我需要 OAuth 2.0。 将 Google API 客户端库用于 JavaScript(又名 "gapi"),我正在使用以下代码。

var project_id = '***';
var client_id = '***';
var config = {
    'client_id': client_id,
    'scope': 'https://www.googleapis.com/auth/bigquery',
    'immediate': true
};
function auth() {
    gapi.client.setApiKey('***');
    gapi.auth.authorize(config, function() {
        gapi.client.load("bigquery", "v2");
    });
}

一切正常,直到我尝试使用与打开 BigQuery 项目时使用的 Gmail 帐户不同的 Gmail 帐户。 我收到 "permission denied" 错误。 该页面在线托管,已设置凭据以便重定向 URI 为空,并且 JavaScript 来源设置为我希望人们可以访问的 2 个网站。

我错过了什么?我只希望每个拥有 gmail 帐户的人都能够使用我的脚本,从我授予访问权限的那两个网站:(

权限被拒绝错误可能是因为您正在测试的 Google 帐户不是您的 BigQuery 项目的成员(角色:READER)。

这里有两个级别的授权: (1) 数据集。例如:当前用户是否允许访问此数据集中的 read/update 个表? (2) 项目。例如:谁的 free/billed 配额将被查询作业占用?

第一个很容易解决——您可以通过 "share dataset" 菜单分配特殊组 "authenticated users" 来制作数据集 public。

第二个更棘手 -- 您不能使用 reader 角色将世界添加到您的项目中。

因此,您不能(直接)向网络公开查询访问权限。

您有几个备选方案:

(1) 如果您只想与少数用户共享此网站,您可以将他们单独添加到您的项目中。

(2) 您可以要求用户提供他们自己的 BigQuery 项目用于计费目的。

这些都不能提供您可能想要的无缝体验,因此您可以考虑更复杂的选项:

(3) 您可以设置一个前端服务来验证您的帐户(或更好的服务帐户 [1])。 Google AppEngine 使这非常容易,但您可以在大多数托管环境中做到这一点。

--

[1] https://cloud.google.com/bigquery/authorization#service-accounts