15

マシンでSSL の問題に悩まされた後も、Google Ruby Client API を介してユーザーの Blogger アカウントにアクセスしようとしています。私は以下を使用しています:

  • レール 3.2.3
  • ルビー1.9.3
  • oauth2 (0.8.0)
  • オムニ認証 (1.1.1)
  • omn​​iauth-google-oauth2 (0.1.13)
  • google-api-クライアント (0.4.6)

認証時に Google API を介してユーザーを正常に認証し、ブログにアクセスできます。ユーザーがログインすると、 Google から受け取った を保存access_tokenします。refresh_token有効期限が切れるまで、すべてがうまく機能しaccess_tokenます。refresh_tokenを新しいに交換する機能を構築しようとしていますが、access_token壁にぶつかり続けています。クライアントのドキュメントを例として使用すると、これは私が使用しているコードです。

  client = Google::APIClient.new
  token_pair = auth.oauth_token   # access_token and refresh_token received during authentication

  # Load the access token if it's available
  if token_pair  
    client.authorization.update_token!(token_pair.to_hash)
  end            

  # Update access token if expired
  if client.authorization.refresh_token && client.authorization.expired?
    client.authorization.fetch_access_token!
  end

  blogger = client.discovered_api('blogger', 'v3')
  result = client.execute(
      api_method: blogger.blogs.list_by_user,
      parameters: {'userId' => "self", 'fields' => 'items(description,id,name,url)'},
      headers: {'Content-Type' => 'application/json'})

が有効な間、このコードは完全に機能しaccess_tokenます。有効期限が切れるとすぐに、2 つの問題が発生します。

  1. トークンの有効期限が切れていることはわかっていますが(expires_atデータベースで値を確認しました)、client.authorization.expired?戻りますfalse-データベースの値を使用する以外に、トークンの有効期限を確認できる別の方法はありますか?
  2. の実行を強制するとclient.authorization.fetch_access_token!invalid_requestエラーが発生します。

クライアント API を使用して をrefresh_token新しい に交換する方法を教えてください。access_token別の言語でそれを行う方法を知っていても、Rubyfy を試すことができるので、それは大きな助けになります。ありがとう!!

4

3 に答える 3

26

すでにこれを見つけているかもしれませんが、Google でプロセス全体を読むことができます: https://developers.google.com/accounts/docs/OAuth2WebServer

omn​​iauth-google-oauth2 戦略はすでに access_type と approval_prompt の設定を処理しているため、更新トークンを取得するには、grant_type=request_token を指定してhttps://accounts.google.com/o/oauth2/tokenに投稿するだけです

これが私が使用する大まかなコードです:

def refresh_token
  data = {
    :client_id => GOOGLE_KEY,
    :client_secret => GOOGLE_SECRET,
    :refresh_token => REFRESH_TOKEN,
    :grant_type => "refresh_token"
  }
  @response = ActiveSupport::JSON.decode(RestClient.post "https://accounts.google.com/o/oauth2/token", data)
  if @response["access_token"].present?
    # Save your token
  else
    # No Token
  end
rescue RestClient::BadRequest => e
  # Bad request
rescue
  # Something else bad happened
end
于 2012-09-24T23:37:56.513 に答える