在AppEngine上支持多重登录的最佳方式

时间:2010-11-17 00:45:16

标签: python google-app-engine

我正在为客户端重构一个应该支持OpenID,Facebook Connect和自定义身份验证(电子邮件+密码)的应用程序。 假设我有:

class MyUser(db.Model):
    pass
class Item(db.Model):
    owner = db.ReferenceProperty(MyUser)

我正在考虑以这种方式实现不同的身份验证系统:

class OpenIDLogin(db.Model): # key_name is User.federated_identity()? User.user_id()?
    user = db.ReferenceProperty(MyUser)

class FacebookLogin(db.Model): # key_name is Facebook uid
    user = db.ReferenceProperty(MyUser)

class CustomLogin(db.Model): # key_name is the user email
    user = db.ReferenceProperty(MyUser)
    password = db.StringProperty()

有更好的解决方案吗?已经有答案here,但我无法理解这是否适合我。 我已经使用Users API开发了一个应用程序,过去使用过Facebook Connect已经开发了另一个应用程序,所以我知道如何处理这两个问题,问题是将它们连接在一起。不幸的是,切换到另一个框架不是一个选择。

2 个答案:

答案 0 :(得分:2)

我会仔细查看tipfy及其Authentication extension *

他们已经实现了Universal User model,可以与App Engine的默认用户API,自己的身份验证或第三方身份验证方法(OpenId,OAuth等)一起使用。

Here是文档,请查找 MultiAuthMixin 部分。

*优秀的程序员编写好的代码;伟大的程序员窃取伟大的代码

答案 1 :(得分:1)

首先,我使用了类似的东西:

key_name = '%s|%s' % ('facebook', facebook_uid)

key_name = '%s|%s' % ('myapp', email)

这很好,查找速度很快,但它缺乏对多提供商登录的支持(即用户希望能够使用谷歌和Facebook登录)。

这是我的实际解决方案:

class User(db.Model):
    accounts = StringListProperty() # ['facebook|1234', 'google|4321']
    email = StringProperty()
    password = StringProperty()

查找速度较慢但在登录时只执行一次,之后我在会话中存储user.key()。id()并使用它。这也很好,因为您可以将用户链接到电子邮件/密码组合。缺点是您必须在密钥上手动强制执行唯一性(电子邮件,Facebook ID,Google ID等)。