将范围广泛的委托与Google API一起使用时发生未经授权的客户端错误

时间:2019-04-11 06:43:22

标签: ruby google-api google-api-client google-authentication google-auth-library-ruby

我们正在将Google API Ruby客户端与域范围委派一起使用,以更新用户的联系人,解析电子邮件以将其与我们的数据库配对等。4月1日之前,一切正常,但是,此后我们得到了unauthorized_client错误响应。

Signet::AuthorizationError (Authorization failed.  Server message:)
{
  "error": "unauthorized_client",
  "error_description": "Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested."
}

我已经尝试了什么?

我尝试将google-api-ruby-clientgoogleauth宝石更新到最新版本。什么都没改变。

我还尝试(两次)生成新的服务帐户,使其启用DWD,并在G Suite管理控制台中使用服务帐户的客户端ID添加所需的范围。在管理控制台中添加范围后,我等待了24小时,但没有任何变化。

请注意,使用相同的设置,过去一切正常。

最低测试代码

这是引发错误的最少代码。

require 'googleauth'
require 'google/apis/gmail_v1'

creds = ENV['GOOGLE_SERVICE_ACCOUNT'] # JSON downloaded from cloud console
                                      # is saved in this ENV variable
creds_json = JSON.parse(creds)
creds_json_io = StringIO.new(creds_json.to_json)
auth = Google::Auth::ServiceAccountCredentials.make_creds(
  json_key_io: creds_json_io,
  scope: [Google::Apis::GmailV1::AUTH_GMAIL_MODIFY]
)
auth.sub = 'admin@slideslive.com' # without this line everything works fine
                                  # and I get the access token
auth.fetch_access_token

据我所知,我们正在根据可用文档进行所有操作。请问有人有什么建议吗?

更新

我还尝试过在同一组织下创建一个新的Google Cloud Platform项目,仅添加服务帐户,但一切保持不变。

1 个答案:

答案 0 :(得分:0)

所以我终于弄清楚了问题出在哪里。 除了其他作用域,我还启用了这些功能:

http://www.google.com/m8/feeds/contacts/ 
http://www.google.com/m8/feeds/groups/ 

原来Google可能使它们无效,并且它们现在需要https而不是http

如果它们提供了更好的错误消息,那就太好了,例如在Google管理控制台中对它们进行授权时,所输入的范围无效。

当尝试为与我用于服务帐户相同的范围授权普通的OAuth2客户端ID时,我发现了错误。 OAuth2同意屏幕显示正确的错误消息。

更新

这是我为解决服务帐户错误而创建的清单:

  1. 检查是否已在Google Cloud Console中为服务帐户启用了域范围委派。
  2. 检查是否已在Google管理控制台中使用服务帐户的客户ID(而不是其电子邮件地址)输入了正确范围。确保所有范围均有效!它们可能在其一生中变得无效。输入无效的作用域时,即使对于有效的作用域,获取访问令牌时也会出现unauthorized_client错误。