1

Google API Ruby Clientを使用して、ユーザーのカレンダーにアクセスします。

アクセスできるのは次のとおりです。

  client_id: "xxxxx"
  client_secret: "xxxxx"
  access_type: "offline"
  approval_type: ""
  scope: "https://www.google.com/calendar/feeds/ https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/calendar"
  callback_path: "/app/oauth_response"

  provider :google_oauth2, GOOGLE_API['client_id'], GOOGLE_API['client_secret'], 
            { access_type: GOOGLE_API['access_type'], 
              approval_prompt: GOOGLE_API['approval_prompt'], 
              scope: GOOGLE_API['scope'], 
              callback_path: GOOGLE_API['callback_path'],
              path_prefix: GOOGLE_API['path_prefix']}

応答が返されると、更新トークン、アクセストークン、expired_atなどが含まれます。その後、アクセスコードを使用してAPIリクエストを行うことができます。しかし、そのアクセスコードの有効期限が切れると(1時間後)、新しいアクセストークンを取得するには、更新トークンを使用する必要があると思います。

これが私がかけている電話です:

HTTParty.get('https://www.google.com/calendar/feeds/default/owncalendars/full', :query => {:alt => "jsonc", :access_token => access_token})

これは、トークンの有効期限が切れたことを示しています。だから私は新しいものを手に入れようとします。しかし、私がそれをやろうとすると、私はこれを手に入れます:

@client.authorization.fetch_access_token!
ArgumentError Exception: Missing authorization code.

@clientオブジェクトの@code=nilにそれが表示されます。それを設定する必要があると思いますが、最初のリクエストから「code」プロパティが返されません。

そのコードを取得するにはどうすればよいですか、またはそれが必要ない場合は、何が間違っていますか?ありがとう!

4

3 に答える 3

3

ほとんどの場合、fetch_access_tokenを呼び出している時点で、更新トークンが@client.authorizationに設定されていません。

https://github.com/google/signet/blob/master/lib/signet/oauth_2/client.rbをご覧ください

このエラーメッセージは、不明/指定されていないgrant_typeのフォールスルーでのみ表示されます。grant_type自体は、承認クライアントの状態に基づいて推測されます。

ユースケースでは、トークンを更新しようとすると、「refresh_token」である必要があり、refresh_tokenが設定されている場合、grant_typeはその値を返します。@client.authorization.refresh_tokenと@client.authorization.grant_typeの値をダンプすると、どちらもnilになります。

修正は、そのメソッドを呼び出す前に、refresh_tokenを適切に復元することを確認することです。

于 2012-04-09T22:33:45.643 に答える
0

Rubyクライアントライブラリは、更新トークンの有効期限が切れたときに、更新トークンから新しいアクセストークンを自動的に取得する処理を行うため、その場合を処理するために何もする必要はありません。

于 2012-04-09T20:41:08.630 に答える
0

クライアントには次のコード(https://github.com/google/signet/blob/621515ddeec1dfb6aef662cdfaca7ab30e90e5a1/lib/signet/oauth_2/client.rb#L935)があるため、必要がない場合はaredirect_uriを削除する必要がありますアクセストークンを取得します。

if self.redirect_uri
  # Grant type was intended to be `authorization_code` because of
  # the presence of the redirect URI.
  raise ArgumentError, 'Missing authorization code.'
end
于 2017-07-17T20:59:25.257 に答える