3

ここ数日、Rails 3 アプリケーションで Google Contacts API に連絡先を追加する機能をサポートすることに頭を悩ませていました。多くの誤ったスタートにもかかわらず、Ruby OAuth gem を採用し、次のチュートリアルに従うことで、最終的にある程度の進歩を遂げました: http://everburning.com/news/google-analytics-oauth-and-ruby-oh-my/

コンソールでこれに従うと、Rails アプリで行うよりもさらに進んでいます。アクセス トークンを作成し、Contacts API の特定のスコープで Google のサービスに対して認証し、oauth_verifier トークンを適用してアクセス トークンを取得できます。しかし、データをプッシュするときが来ると、次のエラーが発生します。

response = at.post("https://www.google.com/m8/feeds/contacts/default/full", gdata)
 => #<Net::HTTPUnauthorized 401 Unknown authorization header readbody=true> 

「readbody=true」ヘッダーはどこから来たのですか?どうすればそれを取り除くことができますか?

しかし、Rails アプリではさらに悪化します。リクエスト トークンを作成し、ユーザーを Google の認証サイトに誘導する 1 つのコントローラー アクション (「googlecontacts」) があります。

def googlecontacts

@card = Card.find_by_short_link(params[:id])

@consumer = OAuth::Consumer.new( 
  'anonymous', 
  'anonymous', 
  { 
    :site => 'https://www.google.com', 
    :request_token_path => '/accounts/OAuthGetRequestToken', 
    :access_token_path => '/accounts/OAuthGetAccessToken', 
    :authorize_path => '/accounts/OAuthAuthorizeToken', 
    :signature_method => 'HMAC-SHA1',
    :oauth_version => '1.0'
  })

@request_token = @consumer.get_request_token(
  {:oauth_callback => 'http://monkey.dev/cards/google_auth?redir='+@card.short_link}, 
  {:scope => "https://www.google.com/m8/feeds/"}
)

session[:request_token] = @request_token

redirect_to @request_token.authorize_url

end

これは機能しているようです。有効なリクエスト トークン オブジェクトを取得すると、ユーザーは認証のために Google サービスに転送されます。コールバック URL (「google_auth」) は、アクセス トークンを作成するために oauth_verifier トークンを取得する必要があります。コントローラーの冒頭は次のとおりです。

def google_auth

   @access_token = session[:request_token].get_access_token(:oauth_verifier=>params[:oauth_verifier])

そして、ここでそれがクラップアウトします。その最後の行のエラーは次のとおりです。

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]

しかし、そこにある値 -- session[:request_token] と params[:oauth_verifier] -- は存在し、そのアクションで説明されます! ここで何がnilなのかわかりません。

したがって、最初にこの 2 番目の問題を解決する必要があると思いますが、最初の問題に回答することにもボーナス ポイントがあります。:-)

読んでくれてありがとう。

アーロン。

4

2 に答える 2

0

Unknown authorization header通常、署名が送信したものと一致しなかったことを意味します。oauth私は宝石をお勧めしません。それはバグや奇妙な問題でいっぱいで、特定のパラメータを適切にエスケープしません。

Signet gemは、RubyでGoogleAPIにアクセスするために公式にサポートされているgemです。

これをSignetで実装する方法は次のとおりです。

require 'signet/oauth_1/client'
require 'addressable/uri'
card = Card.find_by_short_link(params[:id])
callback = Addressable::URI.parse('http://monkey.dev/cards/google_auth')
callback.query_values = {'redir' => card.short_link}

client = Signet::OAuth1::Client.new(
  :temporary_credential_uri =>
    'https://www.google.com/accounts/OAuthGetRequestToken',
  :authorization_uri =>
    'https://www.google.com/accounts/OAuthAuthorizeToken',
  :token_credential_uri =>
    'https://www.google.com/accounts/OAuthGetAccessToken',
  :client_credential_key => 'anonymous',
  :client_credential_secret => 'anonymous',
  :callback => callback
)

session[:temporary_credential] = (
  client.fetch_temporary_credential!(:additional_parameters => {
    :scope => 'https://www.google.com/m8/feeds/'
  })
)
redirect_to(client.authorization_uri)
于 2010-12-13T21:39:58.830 に答える
0

記号ではなく文字列を使用してセッション データを設定/取得してみてください。つまりsession["request_token"]、 ではありませんsession[:request_token]。私は過去にその問題を抱えていたことを知っています。

于 2010-10-11T12:59:49.717 に答える