首页 > 解决方案 > 数据洞察连接器无法获取 BigQuery 服务帐号的访问令牌:访问未授予或已过期

问题描述

我正在尝试创建一个社区连接器,以使用我作为 BigQuery 项目的所有者/数据查看器/作业用户连接的服务帐户将我在 BigQuery 中的数据库连接到数据工作室。我知道服务帐户在连接到 BigQuery 时可以正常工作,因为我已经在其他地方进行了测试。我几乎完全复制了本教程 ( https://developers.google.com/datastudio/solution/blocks/using-service-accounts ) 中的连接器代码,用我的查询替换了 SQL 字符串并添加了一些不同的查询参数。我还将服务帐户的凭据存储在我的脚本属性中,方法是粘贴 json 对象并将其存储为:

var service_account_creds_obj = {
    "type": "service_account",
    "project_id": ...
    ...
}
scriptProperties.setProperty('SERVICE_ACCOUNT_CREDS', JSON.stringify(service_account_creds_obj));

但是,当我的 getData 函数调用时,我总是卡在流程中getOauthService().getAccessToken(),而该函数永远不会成功返回。当我使用连接器创建报告时,我收到此错误:“访问未授予或已过期。” 我找不到 getAccessToken 的文档,而且我无法理解为什么它不会终止。我可以看到它没有返回,因为在该行之前显示了一个 console.log,但它永远不会到达下一行的日志。然后我的 try-catch 块捕获了我看到的错误。请注意,我的 getOauthService 函数与文档/教程示例中的函数完全相同,除了我在 createService 调用中使用了输入文本。输入文本不应该真的很重要,对吧?

拜托,我已经尝试调试了好几个小时,但是这方面的文档非常糟糕,而且很难调试,因为代码流是在后台处理的,并且堆栈驱动程序日志记录确实有问题。

标签: google-apps-scriptgoogle-bigquerygoogle-oauthgoogle-data-studioservice-accounts

解决方案


我发现了我的问题。上面发布的文档说将 OAuth2 范围设置为https://www.googleapis.com/auth/bigquery.readonly。但是,我天真地包括

"oauthScopes": ["https://www.googleapis.com/auth/bigquery.readonly"]

在我的清单文件中。同时,我从文档中复制的代码已经包含了这一行:

.setScope(['https://www.googleapis.com/auth/bigquery.readonly']);

所以我不确定为什么这会导致问题。但它一定阻止了 OAuth2.createService 函数正确设置。


推荐阅读