6

LinkedIn APIをテストし、LinkedInのOAuthプロバイダーに対して認証するためにMeteor JSスマートパッケージを構築しようとしたとき、私は完全な障害に遭遇しました。

これらの指示に従うoauth_tokenことで、承認リクエストで使用するためのを次の形式で正常に生成することができました。

https://www.linkedin.com/uas/oauth/authorize?oauth_token={oauth_token}

次のようなrubyスクリプトによって生成されたトークンを使用してブラウザに配置すると、次のようになります。

require 'oauth'

api_key = '{linkedin api key}'
api_secret = '{linkedin api secret}'

configuration = { :site => 'https://api.linkedin.com',
                          :authorize_path => '/uas/oauth/authenticate',
                          :request_token_path => '/uas/oauth/requestToken',
                          :access_token_path => '/uas/oauth/accessToken' }

consumer = OAuth::Consumer.new(api_key, api_secret, configuration)

request_token = consumer.get_request_token
puts request_token.params[:oauth_token]

次に、上記のURIを使用して、トークンをクエリ文字列パラメータとしてブラウザに簡単にダンプし、LinkedInの権限ダイアログを表示できます。

有効なトークンで表示されるLinkedIn認証ウィンドウ: ここに画像の説明を入力してください

残念ながら、コマンドラインでcurlリクエストを書き込もうとするとoauth_token、同じURLで使用すると、生成されたリクエストは失敗します。実際、LinkedInは500エラーで応答し、ブラウザは標準の500エラーウィンドウを表示します。応答には追加の詳細は含まれていません。

500エラー

これは、新しいリンクインへのcurlリクエストで実装したものと同様のコードですoauth_token

alex@alex-mac accounts-linkedin (fixes_for_meteor_0_5_4)* $ cat linkedin_oauth_gen.sh 

curl -X POST https://api.linkedin.com/uas/oauth/requestToken --verbose --header 'Authorization: OAuth oauth_nonce="0d9a3e40660811e2bcfd0800200c9a66",oauth_timestamp="1359019570",oauth_version="1.0",oauth_signature_method="HMAC-SHA1",oauth_consumer_key="{oauth_consumer_key}",oauth_signature="{oauth_signature}"'

LinkedInのOAuthテストコンソールを使用してAuthorizationヘッダーを生成したことは注目に値します。

Meteor JSスマートパッケージ内に同様の機能を実装しようとすると同じ問題が発生するため、これは重要です。

しかし、私の主な質問は、なぜ世界で上記のルビーコードでそれを行うことができるのかということですが、単純なcurlシェルコマンドを使用すると、トークンが有効に生成されていないようです(またはLinkedInは単にそれを尊重したくない) ..。。

4

1 に答える 1

5

いつものように、悪魔は細部にまで及びます。

この問題を解決するために、私は今までにない素晴らしいCharles Proxyを使用して、私の Ruby スクリプトが oauth ライブラリ経由で行っていたリクエストをスパイしました。

結局のところ、curl と meteor からリクエストを作成しようとしていた方法には2 つの明確な問題がありました。これは、コードを振り返りoauth_callback、問題をリバース エンジニアリングするために Authorization ヘッダー パラメータをいじりながら、成功した ruby​​ リクエストをスパイすることで発見しました。 .

これらの問題のいずれか、または組み合わせにより、無効で認識できない oauth トークンが生成されました。401 を返す代わりに、linkedin はトークンを生成しました! 残念ながら、このトークンは役に立ちませんでした。

失敗する 2 つの異なる要求承認ヘッダーを次に示します (それぞれの後に理由を示します)。

Authorization: OAuth oauth_body_hash="2jmj7l5rSw0yVb%2FvlWAYkK%2FYBwk%3D", oauth_callback="http%3A%2F%2Flocalhost%3A3000%2F_oauth%2Flinkedin%3Fclose", oauth_consumer_key="*********", oauth_nonce="SJ3DSTHLh0T4UcqzYOUOqubIeWN9FERCePm5ro35EY", oauth_signature="*********", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1359081520", oauth_version="1.0"

この最初の例の問題は、oauth_callbackparam に不正な形式のクエリ文字列 param があることです。?closeのように、値のないクエリ文字列パラメーターを持つ?close=trueと、リクエストが完全に失敗することがわかります。正確な理由はまだわかりませんが、そのようです。

Authorization: OAuth oauth_body_hash="2jmj7l5rSw0yVb%2FvlWAYkK%2FYBwk%3D", oauth_callback="http%3A%2F%2Flocalhost%3A3000%2F_oauth%2Flinkedin%3Fclose", oauth_consumer_key="*********", oauth_nonce="SJ3DSTHLh0T4UcqzYOUOqubIeWN9FERCePm5ro35EY", oauth_signature="*********", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1359081520", oauth_version="1.0"

この 2 番目の例では、問題はoauth_callbackそのlocalhostドメイン内にあることです。oauth_callback一部の oauth プロバイダー (そのうちの 1 つである linkin) は、 param 内のホスト名を (FQDN または IP アドレスに対して)好まないことが判明しました。なぜ私を打ちます。を使用する必要があります127.0.0.1。正当な理由はありませんが、それだけです。下手ですが、本当です。

これは機能します:

Authorization: OAuth oauth_body_hash="2jmj7l5rSw0yVb%2FvlWAYkK%2FYBwk%3D", oauth_callback="http%3A%2F%2F127.0.0.1%3A3000%2F_oauth%2Flinkedin%3Fclose%3Dtrue%26state%3D0e314d0d-a5ca-40ca-8fcd-caa1cfce3ed4", oauth_consumer_key="*********", oauth_nonce="0KBnMSMI8NNk1cXn0YyTRpUnPdnqAX7F06KEloh9bs", oauth_signature="*********", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1359082177", oauth_version="1.0"

注:キーを保護し、シークレットのリバース エンジニアリングの可能性を排除するという明らかな理由から、oauth_consumer_keyandのoauth_signature値をに置き換えました。*********

于 2013-01-25T03:15:25.577 に答える