如何设置Google API用户使用服务帐户(Ruby客户端)进行模拟?

时间:2014-10-09 14:56:50

标签: ruby-on-rails ruby google-authentication google-api-ruby-client

我有一个服务帐户,我正在使用OAuth2 gem以及Google API Ruby Client

require 'oauth2'
require 'google/api_client'

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

我可以成功获取访问令牌并使用它来访问驱动器v2文件列表API。我总是在响应中看到一个单独的“如何开始使用Drive”文档,而不是其他任何文档。

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

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

据推测,这不是这样做的方法。

如何检索作用​​域的访问令牌,以允许模拟单个用户而不是其他用户?


根据史蒂夫的评论,我放弃了内心宝石,现在正在使用Signet。我得到了一点,但当我指定一个人时,我遇到了一个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."
}

我有一个控制台项目,我在其上执行'测试安装流',但客户端似乎不受信任。我在哪里看?

感谢。

2 个答案:

答案 0 :(得分:1)

不确定如何使用intridea的oauth2 gem,但是signet(ruby客户端库的默认设置)直接处理这种情况。

有关如何在readme中执行此操作的剪辑。正如您所指出的,唯一的补充是添加主题以获取特定用户的令牌。这可以在实例化OAuth2客户端时指定,也可以作为fetch_access_token!

的选项指定

答案 1 :(得分:1)

这是摘要。

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

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

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