0

私は django-openid-provider ( https://bitbucket.org/romke/django_openid_provider/ ) を使用しており、実際のサーバーにデプロイする前にその機能をテストする必要があります。OpenID 2.0 のドキュメントで POST リクエストを作成し、それを django のテスト サーバーに送信して openid トークンを取得しようとしました。

私の投稿は次のようになります。

http://192.168.232.151:8008/openid/

体:

openid.ns:http://specs.openid.net/auth/2.0
openid.mode:associate
openid.assoc_type:HMAC-SHA256
openid.session_type:DH-SHA256

また、Diffie-Hellman アルゴリズム用の公開鍵 (openid.dh_modulus、openid.dh_gen、openid.dh_consumer_public など) を提供しようとしましたが、リクエストで追加の鍵を取得するために OpenID 認証のトラフィックを盗聴しましたが、常に 500 Internal server error が発生しましたと

Exception Type: ProtocolError
Exception Value:    
No mode value in message <openid.message.Message {('http://openid.net/signon/1.0', u'ns:http://specs.openid.net/auth/2.0\nopenid.mode:associate\nopenid.assoc_type:HMAC-SHA256\nopenid.session_type:DH-SHA256'): u'DH-SHA256EABv%252BfEoZlgh%252BeU71rlInEppkiuX\nopenid.dh_modulus:ANz5OguIOXLsDhmYmsWizjEOHTdxfo2Vcbt2I3MYZuYe91ouJ4mLBX%2BYkcLiemOcPym2CBRYHNOyyjmG0mg3BVd9RcLn5S3IHHoXGHblzqdLFEi%2F368Ygo79JRnxTkXjgmY0rxlJ5bU1zIKaSDuKdiI%2BXUkKJX8Fvf8W8vsixYOr\nopenid.dh_gen:Ag%3D%3D\nopenid.dh_consumer_public:AJs12O5ypo2N%2FL0RJiiOgu9llg2dFsnjthyH49dx6FXz52iDXNkS7gquOm6KEr%2BUfTmktyVMA5DrZwJ%2BrX1jk7sKmXJMmi9%2B7N5fa0wvz%2Fi6nrvg8Oqw31kh%2BtbD9ansUeATSlCfUoRCqeUHEABv%2BfEoZlgh%2BeU71rlInEppkiuX'}>

django-openid モジュールのデバッグ Message オブジェクトを構築するとこのエラーが発生することを発見しましたが、openid-provider サーバーを満たすパラメーターの値を見つけることができません

私が間違っていることを教えてください。私は難しい方法を選択していますか? ローカルで openid-client を使用して消費者サイトをエミュレートするものを使用できますか? または、誰かがそのような POST リクエストの正しい例を持っているでしょうか? ありがとう

4

1 に答える 1

0

OpenID リクエストを手動で作成するのは不便なので、公にアクセス可能な OpenID コンシューマまたは OpenID クライアント ライブラリを使用して django-openid-provider をテストするのがおそらく最善です。

過去に、 django_openid_provider に対するテストにmod_auth_openid (Apache モジュール) を使用しましたが、うまく機能します。

OpenID エンドポイントに対して HTTP リクエストを手動で提供することに真剣に取り組んでいる場合:

OpenID は、POST 要求ではなく GET 要求を使用します。

パラメータは、本文ではなくクエリ文字列で渡す必要があります。

httpieを使用した、OpenID プロバイダーに対する有効なリクエストの例を次に示します。

  • OpenID エンドポイントはhttp://192.168.232.151:8008/openid/
  • django-openid-provider を使用して、という openid を作成しましたmyopenid
  • OpenID コンシューマー (中継側) はhttp://www.example.com/protected/です。
  • OpenID コンシューマは mod_auth_openid を使用して保護されています

最初のリクエストは次のとおりです。

$ http get http://192.168.232.151:8008/openid/ \
openid.assoc_handle=={HMAC-SHA256}{42a4370e}{G804lQ====} \
openid.claimed_id==http://192.168.232.151:8008/openid/myopenid/ \
openid.identity==http://192.168.232.151:8008/openid/myopenid/ \
openid.mode==checkid_setup \
openid.ns==http://specs.openid.net/auth/2.0 \
openid.realm==http://www.example.com/protected/ \
openid.return_to==http://www.example.com/protected/?modauthopenid.nonce=qAgqlNCdLl \
openid.trust_root==http://www.example.com/protected/

これは次と同等です。

$ curl http://192.168.232.151:8008/openid/?openid.assoc_handle=%7BHMAC-SHA256%7D%7B42a4370e%7D%7BG804lQ%3D%3D%3D%3D%7D&openid.claimed_id=http%3A%2F%2F192.168.232.151%3A8008%2Fopenid%2Fmyopenid%2F&openid.identity=http%3A%2F%2F192.168.232.151%3A8008%2Fopenid%2Fmyopenid%2F&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.realm=http%3A%2F%2Fwww.example.com%2Fprotected%2F&openid.return_to=http%3A%2F%2Fwww.example.com%2Fprotected%2F%3Fmodauthopenid.nonce%3DqAgqlNCdLl&openid.trust_root=http%3A%2F%2Fwww.example.com%2Fprotected%2F

openid.assoc_handleこの例ではとの値が無効であることに注意してくださいmodauthopenid.nonce。これらに対して適切な値を生成する必要があります。

これが成功すると、サーバーは 302 経由でhttp://www.example.com/protected/にリダイレクトし、いくつかのクエリ パラメータ引数を指定します。

また、これはプロトコルの最初のステップにすぎないことにも注意してください。追加の要求が含まれます。

しかし、これらの OpenID HTTP リクエストを手動で作成したくはありません。代わりに、OpenID ライブラリまたは OpenID コンシューマーを使用してください。

于 2013-09-19T19:44:59.203 に答える