5

ユーザーをflickrapiに対して認証するWebアプリがあります。OAuth 1.0を利用し、認証はほとんどの場合機能します。しかし、ランダムな時間、完全にランダムな時間に、flickrは私の署名を認識しません。リクエストトークンのリクエスト中に無効な署名エラーを返します。ただし、次の試行で同じコードを使用すると、リクエストトークンが適切に返されます。

ノンスやタイムスタンプの生成方法と関係があるのではないかと思います。そうでなければ、それは次の試みでは機能しないはずですよね?

これは、ナンスとタイムスタンプの値を生成する方法です。

$nonce   = md5(microtime(true).rand());
$timestamp  = mktime();

これに問題はありますか?ナンス値を生成するためのより良い方法はありますか?このランダムな失敗は非常に混乱を招きます。ランダムに無効なエラーが発生する他の理由は考えられません。


ファローアップ

Jan Gerlingerの提案に従って、mktime()をtime()に変更しました。それは確かに発生頻度を減らしました。しかし、それでもランダムな時間に無効な署名エラーが発生します。time()に変更した後は、ごくまれに追加する可能性があります。

したがって、timestamp(mktime)がこれらのランダムエラーの原因の1つであると想定しています。しかし、他の何かがまだそこでうまくいっていません。たぶんノンス世代?

4

2 に答える 2

4

PHP のバージョンによっては、代わりtime()mktime().

ノンスについては、ドキュメントには次のように記載されています。

nonce はランダムな文字列であり、クライアントによって一意に生成され、サーバーが要求が以前に行われたことがないことを確認できるようにし、安全でないチャネルを介して要求が行われた場合のリプレイ攻撃を防ぐのに役立ちます。nonce 値は、タイムスタンプ、クライアント資格情報、およびトークンの組み合わせが同じであるすべてのリクエストで一意である必要があります。

1 マイクロ秒に同じ値が 2 回返される場合rand()、同じ nonce が 2 回返されます。また、MD5 ハッシュを生成しても、MD5 衝突のために一意の値を取得できるとは限りません。ここでのより良い方法は、 nonce のグローバル カウンターを持つことです。

ただし、このエラーが頻繁に発生する場合は、これらの衝突が頻繁に発生することはないため、ナンスはおそらく問題ではありません。

無効な署名エラーの問題は、クライアントのサーバー時刻がプロバイダーのサーバー時刻と異なる場合があるため、時刻同期を使用してサーバーで何か奇妙なことが起こっているかどうかを確認できます。

于 2012-09-30T11:36:20.403 に答える
1

これ以上の情報がなければ、署名自体と関係があると推測する必要があります。

私が言えることは、time()mktime()は同じものであり、根本的な原因ではないということです。

場合によっては、署名に base64 アルファベットが含まれていることがあります+。それが適切にエンコードされていない場合、問題が発生する可能性があります。次のリクエストでそれが消えて、リクエストが通過する可能性があります。

これが自作のコードである場合は、そのコードを共有することをお勧めします。同時に、oauth-php プロジェクトや oauth PECL 拡張機能など、より信頼できるソリューションを使用することをお勧めします。

于 2012-10-05T02:35:36.937 に答える