我有一个服务帐户,并且正在将 OAuth2 gem 与 Google API Ruby Client 一起使用:
require 'oauth2'
require 'google/api_client'
我的目标是获取一个访问 token ,该 token 允许访问特定用户的帐户,而不允许访问其他帐户。我认为这通常是在使用 HTTP 时使用 sub
参数来实现的,但是如何使用上面的 Ruby 客户端库来实现这一点?
我可以成功获取访问 token 并使用它来访问驱动器 v2 文件列表 API。我总是在回复中看到一个“如何开始使用云端硬盘”文档,而没有其他文档。
我怀疑我模拟用户的尝试没有成功。基本上,我将电子邮件地址作为 sub
选项传递给以下函数:
client = Google::APIClient.new(...)
access_token = OAuth2::AccessToken.new(oauth2_client, client.authorization.access_token, {‘sub’ => ‘<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="add8dec8dfedc9c2c0ccc4c383cec2c0" rel="noreferrer noopener nofollow">[email protected]</a>’} )
这大概不是这样做的方法。
如何检索访问 token ,该 token 的范围仅限于模拟单个用户而非其他用户的访问?
根据 Steve 的评论,我放弃了 intridea Gem,现在使用 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 => '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1d70643378707c74715d7c79796f786e6e337e7270" rel="noreferrer noopener nofollow">[email protected]</a>'
})
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."
}
我有一个控制台项目,我在其中执行“测试安装流程”,但客户端似乎不受信任。我该看哪里?
谢谢。
最佳答案
不知道如何使用 intridea 的 oauth2 gem 来完成此操作,但是 ruby 客户端库的默认值 Signet 可以直接处理这种情况。
readme中有一个关于如何执行此操作的片段。 。正如您所指出的,唯一的添加是添加主题以获取特定用户的 token 。这可以在实例化 OAuth2 客户端时指定,也可以作为 fetch_access_token!
关于ruby-on-rails - 如何设置 Google API 用户以使用服务帐户(Ruby 客户端)进行模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26281653/