6

自分のカレンダーに直接接続するだけのアプリを作成しようとしていますが、再認証に関与したくありません。認証を一度コーディングして、それで完了したいだけです。

認証コードは次のとおりです。

key = Google::APIClient::PKCS12.load_key(SERVICE_ACCOUNT_PKCS12_FILE_PATH, PASSWORD)
asserter = Google::APIClient::JWTAsserter.new(
    SERVICE_ACCOUNT_EMAIL,
    'https://www.googleapis.com/auth/calendar', 
    key)
@client = Google::APIClient.new
@client.authorization = asserter.authorize#(SERVICE_ACCOUNT_EMAIL)
@client

私のSERVICE_ACCOUNT_...PKCS .ファイルは、Sinatra アプリと一緒にディレクトリのルートにあります。
Gmail アカウントで Google Calendar API を有効にしました。

私はここで認証の方法を見てきました: https://code.google.com/p/google-api-ruby-client/ (承認の下で、サーバー間通信について話します)

$ ruby server.rb 
Faraday: you may want to install system_timer for reliable timeouts
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/faraday-0.8.4/lib/faraday/utils.rb:16: warning: already initialized constant KeyMap
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/faraday-0.8.4/lib/faraday/utils.rb:177: warning: already initialized constant DEFAULT_SEP
W, [2013-01-15T09:52:11.371122 #28607]  WARN -- : Google::APIClient - Please provide :application_name and :application_version when initializing the client
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/signet-0.4.4/lib/signet/oauth_2/client.rb:869:in `fetch_access_token': Authorization failed.  Server message: (Signet::AuthorizationError)
{
  "error" : "invalid_grant"
}
    from /home/me/.rvm/gems/ruby-1.8.7-p371/gems/signet-0.4.4/lib/signet/oauth_2/client.rb:882:in `fetch_access_token!'
    from /home/me/.rvm/gems/ruby-1.8.7-p371/gems/google-api-client-0.6.1/lib/google/api_client/auth/jwt_asserter.rb:116:in `authorize'
    from server.rb:32:in `build_client'
    from server.rb:38

問題は何ですか?このエラーが発生するのはなぜですか? -特に、Google gem のサイトからコードをほとんどコピーしたためです。

アップデート:

これを見つけました:

invalid_grant が Google から oAuth トークンを取得しようとしています

「リクエストで access_type=offline を指定してください。」

ルビー宝石でこれを行うにはどうすればよいですか? httpリクエストを完全にやり直すことなく?

4

1 に答える 1

0

これは、カレンダーを実際に所有しているユーザー (あなた) の電子メールが含まれている必要がある最後の行を除いて、同様の作業コードです。サービス アカウントのメールはあなたのメールではないと思います。

client_asserter = Google::APIClient::JWTAsserter.new(
    config['client_email'],
    PLUS_LOGIN_SCOPE,
    key
)
$client.authorization = client_asserter.authorize(config['user_email'])

また、サービス アカウントを適切に作成していることを確認してください。このガイドを使用しました: https://developers.google.com/+/domains/authentication/delegation、ドメイン API 用ですが、最初の部分は同じである必要があります。

また、認証のために別のスコープは必要ありませんか?

これが私のために働いた完全な例(ルビー)です:https://github.com/admitriyev/propellant/blob/master/main.rb

于 2014-05-23T03:56:26.603 に答える