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 服务器的参数值

请告诉我我做错了什么?我是否选择了艰难的方式,我可以在本地使用模拟消费者网站的东西吗?或者也许有人有这样的 POST 请求的正确例子?谢谢

4

1 回答 1

0

您可能最好使用可公开访问的 OpenID 消费者或 OpenID 客户端库来测试 django-openid-provider,因为手动构建 OpenID 请求很不方便。

过去,我使用mod_auth_openid(一个 Apache 模块)对 django_openid_provider 进行测试,效果很好。

如果您真的打算手动提供针对 OpenID 端点的 HTTP 请求:

OpenID 使用 GET 请求,而不是 POST 请求。

参数应该在查询字符串中传递,而不是在正文中。

使用httpie,这是一个针对 OpenID 提供者的有效请求的示例,假设:

  • OpenID 端点是http://192.168.232.151:8008/openid/
  • 您已经使用 django-openid-provider 创建了一个名为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_handleandmodauthopenid.nonce值在此示例中无效,您必须为它们生成正确的值。

如果成功,那么服务器应该通过 302 将您重定向到http://www.example.com/protected/并带有许多查询参数参数。

另请注意,这只是协议中的初始步骤,还涉及其他请求。

但是您真的不想手动制作这些 OpenID HTTP 请求。请改用 OpenID 库或 OpenID 使用者。

于 2013-09-19T19:44:59.203 回答