2012-04-09 10 views
0

Google API Ruby Clientを使用しています。ユーザーのカレンダーにアクセスできます。fetch_access_token! Google APIの - 「認証コードがありません」

私はとのアクセスを得る:レスポンスが戻って来るとき、それは私が、その後でAPIリクエストをすることができていますなどリフレッシュトークン、アクセストークン、expired_atを、持っている

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']} 

をアクセスコード。しかし、そのアクセスコードが期限切れになると(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オブジェクト、@コード= nilをインチ私はそれが設定される必要があると仮定していますが、私は最初の要求から返される 'コード'プロパティを取得しません。

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

答えて

2

ほとんどの場合、リフレッシュトークンは、fetch_access_tokenを呼び出している時点で@client.authorizationに設定されていない可能性があります。

は、エラーメッセージが唯一不明/未指定grant_typeためを通じて秋に表示されていることをhttps://github.com/google/signet/blob/master/lib/signet/oauth_2/client.rb

を見てみましょう。 grant_type自体は、許可クライアントの状態に基づいて推測されます。

トークンをリフレッシュしようとすると、refresh_tokenが設定されている場合、refresh_tokenとgrant_typeがその値を返します。 @client.authorization.refresh_tokenと@client.authorization.grant_typeの値をダンプすると、どちらもゼロになります。

解決方法は、そのメソッドを呼び出す前にrefresh_tokenを適切に復元することだけです。

+0

優秀、ありがとう。私は数時間のうちにそれを見つけられませんでした! – 99miles

0

Rubyクライアントライブラリは、リフレッシュトークンが期限切れになったときに新しいアクセストークンを自動的に取得するので、そのケースを処理するために何もする必要はありません。

+0

私は401エラーを取得しています:トークン無効を - 無効なトークンを:ステートレストークンはさらに – 99miles

+0

を満了し、このサンプルはfetch_access_tokenの呼び出しを使用しています! http://code.google.com/p/google-api-ruby-client/wiki/OAuth2 – 99miles

+0

元の投稿を更新して、このトークンの有効期限が切れていることを示すコールを表示しました。 – 99miles

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

関連する問題