3

https://www.youtube.com/watch?v=iK14bfd6qhsでの Steve Bazyl のプレゼンテーションと、Google の関連する API ドキュメントを注意深く確認しました。Gmail アカウントにサービス アカウントのメール ID を使用しており、コンソールからダウンロードした秘密鍵を使用しています。

しかし、スティーブがプレゼンテーションで示したものをモデルにしたテストクライアントを実行すると、一貫して得られます

 Signet::AuthorizationError:
   Authorization failed.  Server message:
   {
     "error" : "invalid_grant"
   }

JWTAsserter に渡された電子メールまたはスコープにガベージ レターを追加すると、同じエラー メッセージが表示されます。明らかに何かがおかしいのですが、これをトラブルシューティングする方法がわかりません。

私が実行しているクライアントコードは次のとおりです(rails rspecファイル内):

client = Google::APIClient.new

key_file = '/Users/stu/projects/br/rails-app/######-privatekey.p12'
key = Google::APIClient::KeyUtils.load_from_pkcs12(key_file, 'notasecret')
Rails.logger.info "Private key? #{key.private?}"

asserter = Google::APIClient::JWTAsserter.new( 
  '#####-#######knp@developer.gserviceaccount.com', 
  "https://www.googleapis.com/auth/calendar", 
  key)
client.authorization = asserter.authorize()

私はかなり行き詰まっています。トラブルシューティングのアドバイスをいただければ幸いです。

ありがとう!

アップデート

ジャックのために機能するコードを共有していただきありがとうございます。

サイトの開発コンソールにアクセスして、サービス アカウント クライアントの p12 キーを作成しました。次に、サイトの管理コンソールに移動し、サイト全体の承認をカレンダー API に付与するクライアント ID を追加しました。

承認を追加した後の管理コンソールでは、XXXXXXXXXXXhnq.apps.googleusercontent.com Calendar (Read-Write) https://www.googleapis.com/auth/calendarのようになります。

p12 キーをダウンロードし、提供されたコード構造で使用しました。また、Steve Bazyl のプレゼンテーションからのアプローチも試しました。

asserter = Google::APIClient::JWTAsserter.new( 
  "XXXXXXXXXXX-hnq@developer.gserviceaccount.com", 
  "https://www.googleapis.com/auth/calendar", 
  key)
client.authorization = asserter.authorize("stu@XXXXXXXXXX.com")

どちらの場合も、以前と同じ出力が得られます。

 Signet::AuthorizationError:
   Authorization failed.  Server message:
   {
     "error" : "invalid_grant"
   }

「XXXXs://www.googleapis.com/auth/calendar」の代わりに「ジャンク」と入力すると、同じ出力が得られます。キーは有効であり、私が何か間違ったことをしていることは明らかですが、それが何であるかを知る方法について、API または Google で手がかりを見つけることができません。

トラブルシューティングのアイデアはありますか?

4

3 に答える 3

1

これに関する長いスレッドが GitHubにあり、この問題はシステムの日付と時刻が「少しずれている」ことに関連していると思われます。推奨される解決策は、実行することsudo ntpdate ntp.ubuntu.comです。

スレッドは閉じられていますが、「無効な助成金」に関する Google からのこの情報へのリンクがあります。

于 2016-12-20T22:40:30.820 に答える
1

サービス アカウントに Google Apps アカウントへのアクセス権を付与しましたか? その方法については、 https ://developers.google.com/+/domains/authentication/delegation#delegate_domain-wide_authority_to_your_service_account で確認できます。

次のコードは私のために働きます:

key = Google::APIClient::KeyUtils.load_from_pkcs12('tmp/##########-privatekey.p12', 'notasecret')
client = Google::APIClient.new({:application_name => "example-app", :application_version => "1.0"})
client.authorization = Signet::OAuth2::Client.new(
  :person => 'name@example.com',
  :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
  :audience => 'https://accounts.google.com/o/oauth2/token',
  :scope => 'https://www.googleapis.com/auth/drive.readonly',
  :issuer => '123456789@developer.gserviceaccount.com',
  :signing_key => key)
client.authorization.fetch_access_token!

drive = client.discovered_api('drive', 'v2')
result = client.execute(api_method: drive.files.list)
于 2014-05-30T10:43:31.070 に答える
0

invalid_grant エラーを回避する方法を理解できませんでした。

私の解決策は、通常の webapp api を使用して更新トークンを取得することでした。一度取得すると無期限に使用できるように見えるため、最終結果は同じように見えます.

于 2014-06-02T05:56:07.113 に答える