使用Tipfy进行任意OpenID认证

9 投票
2 回答
802 浏览
提问于 2025-04-16 10:56

我正在开发我应用的认证部分,但在使用OpenID进行认证时遇到了一些问题。

我查看了Tipfy的示例代码,但感觉它是基于OpenID提供者固定为谷歌的假设来写的。

我希望用户能够提供他们想要的任何OpenID(这不就是重点吗?)。

有没有人能提供一些示例代码,展示用户如何使用自己提供的OpenID登录?

2 个回答

2

这段代码只是一个示例。你只需要让用户通过一个表单来指定他们的OpenID提供者的端点网址,然后从POST请求中获取这个值。其实这只是一个字符串。

6

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 可能会让人误解,特别是和其他类名如 GoogleMixinFriendFeedMixinFaceBookMixin 等等放在一起时;文档说明应该更清楚地指出这个类只是作为基础类来扩展,而不是直接使用。

如果你想在应用中使用Tipfy支持任何OpenID网址,需要做什么?

你应该使用Google App Engine采用的相同的消费者用户库来提供OpenID支持;这里是源代码,这里是一个实时示例。

具体来说,仔细看看 openid.consumer.consumer.py 文件,以及XRDS/OpenID的发现过程;我认为经过一些工作,你应该能够将这部分集成到Tipfy的 OpenIdMixin 中。

* OpenID代码是从 tornado.auth 移植过来的

撰写回答