ここ数日、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 番目の問題を解決する必要があると思いますが、最初の問題に回答することにもボーナス ポイントがあります。:-)
読んでくれてありがとう。
アーロン。