使用Tipfy进行任意OpenID认证
我正在开发我应用的认证部分,但在使用OpenID进行认证时遇到了一些问题。
我查看了Tipfy的示例代码,但感觉它是基于OpenID提供者固定为谷歌的假设来写的。
我希望用户能够提供他们想要的任何OpenID(这不就是重点吗?)。
有没有人能提供一些示例代码,展示用户如何使用自己提供的OpenID登录?
2 个回答
这段代码只是一个示例。你只需要让用户通过一个表单来指定他们的OpenID提供者的端点网址,然后从POST请求中获取这个值。其实这只是一个字符串。
Tipfy支持OpenID认证吗?
如果你想用Tipfy来认证任何OpenID网址,直接是做不到的。
主要原因是Tipfy没有办法从给定的OpenID用户网址中获取OpenID的端点。
Tipfy缺少什么?
Tipfy不支持以下工作流程中的b.步骤:
a. 用户提交 foo.blogspot.com
b. 框架从网页中获取 foo.blogspot.com
的OpenID端点:
<link rel="openid.server" href="http://www.blogger.com/openid-server.g" />
c. 框架将用户重定向到远程登录页面。
Tipfy实际上提供了什么?
Tipfy的openid扩展*实际上只是提供了一个 OpenIdMixin
类,这个类是用来为特定平台(比如Google)构建OpenID支持的基础类。
实际上,GoogleMixin
类是从 OpenIdMixin
继承而来的:
class GoogleMixin(OpenIdMixin, OAuthMixin):
"""A :class:`tipfy.RequestHandler` mixin that implements Google OpenId /
OAuth authentication.
而且它里面硬编码了Google的OpenID端点:
_OPENID_ENDPOINT = 'https://www.google.com/accounts/o8/ud'
名称 OpenIdMixin
可能会让人误解,特别是和其他类名如 GoogleMixin
、FriendFeedMixin
、FaceBookMixin
等等放在一起时;文档说明应该更清楚地指出这个类只是作为基础类来扩展,而不是直接使用。
如果你想在应用中使用Tipfy支持任何OpenID网址,需要做什么?
你应该使用Google App Engine采用的相同的消费者用户库来提供OpenID支持;这里是源代码,这里是一个实时示例。
具体来说,仔细看看 openid.consumer.consumer.py
文件,以及XRDS/OpenID的发现过程;我认为经过一些工作,你应该能够将这部分集成到Tipfy的 OpenIdMixin
中。
* OpenID代码是从 tornado.auth 移植过来的