2

我有一个服务帐户,我将 OAuth2 gem 与Google API Ruby Client一起使用:

require 'oauth2'
require 'google/api_client'

我的目标是获取一个访问令牌,它允许访问特定用户的帐户而不是其他帐户。我认为这通常是sub在使用 HTTP 时使用参数来实现的,但是如何使用上面的 Ruby 客户端库来实现呢?

我可以成功获取访问令牌并使用它来访问驱动器 v2 文件列表 API。我总是在响应中看到一个“如何开始使用云端硬盘”文档,而没有其他文档。

我怀疑我冒充用户的尝试没有成功。基本上,我将电子邮件地址作为sub以下函数的选项传递:

client = Google::APIClient.new(...)
access_token = OAuth2::AccessToken.new(oauth2_client, client.authorization.access_token, {‘sub’ => ‘user@domain.com’} )

大概这不是这样做的方法。

如何检索一个访问令牌,其范围允许访问模拟单个用户而不是其他用户?


根据史蒂夫的评论,我已经放弃了 intridea 宝石,现在正在使用 Signet。我走得更远了,但是当我指定一个:person 时,我遇到了 access_denied 错误。没有它,我可以进行身份​​验证,但显然我可以作为发行人获得访问权限。

require 'google/api_client'
...
client = Google::APIClient.new(:application_name => application_name, :application_version => application_version)
...
opts = {
  :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
  :audience => 'https://accounts.google.com/o/oauth2/token',
  :scope => scope,
  :issuer => service_account_email_address,
  :signing_key => key,
  :person => 'my.email@address.com'
})
client.authorization = Signet::OAuth2::Client.new(opts)
access_token = client.authorization.fetch_access_token!
...

>> client.authorization.fetch_access_token!
Signet::AuthorizationError: Authorization failed.  Server message:
{
  "error" : "access_denied",
  "error_description" : "Requested client not authorized."
}

我有一个控制台项目,我对它进行了“测试安装流程”,但客户端似乎不受信任。我在哪里看?

谢谢。

4

2 回答 2

1

不确定如何使用 intridea 的 oauth2 gem 来完成,但是 ruby​​ 客户端库的默认值 signet 直接处理这种情况。

自述文件中有一个关于如何执行此操作的片段。正如您所指出的,唯一的补充是添加主题以获取特定用户的令牌。这可以在实例化 OAuth2 客户端时指定,也可以作为选项指定fetch_access_token!

于 2014-10-09T21:27:25.713 回答
1

这是摘要。

如果您只是尝试通过 Google 进行身份验证,请不要使用来自 intridea 的 OAuth2 gem。依靠印章宝石。

如果您使用服务帐户,则可以指定一个 :person 元素,它会起作用,因此您可以模拟该用户并代表他们工作。

当您测试您的集成时,您必须针对您的项目所在的域执行此操作。在您发布应用之前,您无法在第三方域中进行测试!

于 2014-10-10T13:47:51.540 回答