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

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

我有一个服务帐户,并且正在将 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/

相关文章:

ruby - 使用 Ruby 元编程保存类的新方法

angularjs - 未捕获( promise ): Login providers not ready yet. 您的控制台上是否有错误?

oauth-2.0 - 如何强制针对特定用户进行 oauth 身份验证

python - Ruby on Rails 相当于 python

ruby-on-rails - 如何在 Ruby Sunspot 中定义动态作用域?

ruby-on-rails - asset_host Rails 3 在哪里?

ruby-on-rails - 在 Terminal Rails 4 Postgresql 中将用户添加到用户表

ruby - 使用主机的环境变量作为 Chef 属性(vagrant)-如何管理密码?

ruby - 如何在 G-WAN 上运行 Sinatra 应用程序?

javascript - 如何在 Node js 的服务器端验证谷歌身份验证 token ?