2

私はサービス アカウントを持っており、OAuth2 gem をGoogle API Ruby Clientと一緒に使用しています。

require 'oauth2'
require 'google/api_client'

私の目的は、特定のユーザーのアカウントへのアクセスを許可し、それ以外のアクセスを許可しないアクセス トークンを取得することです。これは、HTTP を使用する場合はパラメーターを使用して実現されることが多いと思いますがsub、上記の Ruby クライアント ライブラリを使用してこれを行うにはどうすればよいでしょうか?

アクセス トークンを正常に取得し、それを使用してドライブ v2 ファイル リスト API にアクセスできます。応答には常に「ドライブの使用方法」ドキュメントが 1 つ表示され、それ以外は表示されません。

ユーザーになりすます試みが成功しなかったと思われます。sub基本的に、以下の関数のオプションとしてメールアドレスを渡しています。

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

おそらく、それはこれを行う方法ではありません。

1 人のユーザーを偽装し、他のユーザーを偽装しないアクセスを許可する範囲のアクセス トークンを取得するにはどうすればよいですか?


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 => '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

これが要約です。

Google で認証するだけの場合は、intridea の OAuth2 gem を使用しないでください。シグネットジェムに頼る。

サービス アカウントを使用する場合は、:person 要素を指定すると機能するため、そのユーザーになりすましてそのユーザーに代わって作業します。

統合をテストするときは、プロジェクトがホストされているドメインに対して行う必要があります。アプリを公開するまで、サードパーティ ドメインでテストすることはできません。

于 2014-10-10T13:47:51.540 に答える