我有一个服务帐户,我正在使用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."
}
我有一个控制台项目,我在其上执行'测试安装流',但客户端似乎不受信任。我在哪里看?
感谢。
答案 0 :(得分:1)
不确定如何使用intridea的oauth2 gem,但是signet(ruby客户端库的默认设置)直接处理这种情况。
有关如何在readme中执行此操作的剪辑。正如您所指出的,唯一的补充是添加主题以获取特定用户的令牌。这可以在实例化OAuth2客户端时指定,也可以作为fetch_access_token!
答案 1 :(得分:1)
这是摘要。
如果您只是尝试通过Google进行身份验证,请不要使用来自intridea的OAuth2 gem。依靠印章宝石。
如果您使用服务帐户,则可以指定:person元素,它将起作用,因此您可以冒充该用户并代表他们工作。
在测试集成时,必须针对托管项目的域执行此操作。在您发布应用之前,您无法在第三方域中进行测试!