0

pecl oauthパッケージを使用して、単純なoauthプロバイダーとコンシューマーを作成しました。アクセストークンを取得しようとするまではすべてうまくいきます。取得しようとすると、署名の不一致エラーが発生します。oauthコンシューマーは、次の方法でoauth->getauthorizedtokenを使用してプロバイダーに接続しようとします。

$res = mysql_query("SELECT * FROM request_tokens WHERE oauth_token = '".mysql_real_escape_string($token)."'");
$requestToken = mysql_fetch_assoc($res);

$oauth->setToken($token, $requestToken['oauth_token_secret']);
$authToken = $oauth->getAccessToken("http://dev.myserver.com/~testbranch/?m=oauthMod&act=authorize", NULL, $verifier);

これが失敗すると、次のような署名でデバッグ情報が出力されます。

3qBMmue4Q+j8Dm4/9VSTl6y0TR8=

プロバイダー側​​では、コンシューマーとトークンが検証され、計算される署名が次の場合でも、署名の不一致で失敗します。

3qBMmue4Q%2Bj8Dm4%2F9VSTl6y0TR8%3D

これは明らかに、まったく同じ署名のURLエスケープバージョンです。これはバグですか、それとも露骨に何かが足りないのですか?

4

2 に答える 2

0

私の質問で述べたように、2 つの署名は、一方がエンコードされた URL であることを除いて同一です。これは仕様の一部ではなく、文書化されていませんが、あります。私の最終的な解決策は、署名の一致と URL エンコードされた署名の一致の両方をチェックします。これは理想的ではありません。誤った一致が発生する可能性があるためですが、アルゴリズム全体を最初から書き直さない限り、できることはほとんどありません。

于 2013-08-21T15:44:40.500 に答える
0

OAuthProvider::$signature は、コンシューマーのリクエストからデコードされた oauth_signature の値であり、OAuthProvider によって計算された署名ではありません。したがって、OAuthProvider によって受信された Authorization ヘッダーを印刷すると、oauth_signature="3qBMmue4Q%2Bj8Dm4%2F9VSTl6y0TR8%3D"OAuthProvider::$signature が表示され3qBMmue4Q+j8Dm4/9VSTl6y0TR8=ます。

あなたの回避策が Authorization ヘッダー (または同等のもの) から oauth_signature を取得し、それをエンコードされた OAuthProvider::$signature と比較することである場合、それらは常に一致します!

OAuthProvider が署名の不一致の例外をスローするという問題は、OAuthProvider::checkOAuthRequest() にエンドポイント URI を提供しなかったことが原因でした。ドキュメントは、これがオプションであることを示していますが、署名ベース文字列の一部であるため、含める必要がありました。

于 2014-11-21T21:37:26.507 に答える