2010-11-17 27 views
11

我正在为客户端重构一个应该支持OpenID,Facebook Connect和自定义验证(电子邮件+密码)的应用程序。 假设我有:支持在AppEngine上多次登录的最佳方式

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但我不明白,如果这对我来说是正确的解决方案。 我已经开发了一个应用程序,使用用户API和另一个使用Facebook Connect过去,所以我知道如何处理这两个问题,问题是将它们连接在一起。不幸的是切换到另一个框架不是一种选择。

+3

Facebook现在使用OAuth 2.0的草稿版本,该版本取决于https以确保安全。注意:App Engine的URL Fetcher服务目前不验证https证书,这意味着您的应用程序将容易受到中间人和DNS中毒攻击;可能会暴露您的Facebook密钥。您必须自己决定是否认为某人可能成功在Google的URL Fetcher计算机上发起这样的攻击,以及这样的密钥泄漏是否可以接受。 – 2010-11-17 01:35:42

+0

这是在几个月内我的路线图,所以我会很感激一个答案。 – mjhm 2010-11-17 01:44:51

+0

@Forest。感谢您的高举。如果我正确理解了GAE服务器和Facebook服务器之间存在的潜在威胁。这不是用户级别的“星巴克WiFi”威胁。那是对的吗? – mjhm 2010-11-17 01:52:33

回答

1

首先,我使用的是这样的:

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

和:

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

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

这是我的实际解决方案。

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

查找速度较慢,但​​它这样做只是一次登录时,我店user.key后()ID()在会议并使用它。这也很好,因为您可以将用户链接到电子邮件/密码组合。缺点是你必须在你的钥匙上手动执行唯一性(电子邮件,脸书ID,谷歌ID等)。

2

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

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

Here是文档,查找MultiAuthMixin部分。

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

+0

已经这样做了,但不幸的是,把它集成到webapp中是一种痛苦,我真的希望通过webapp改进来实现它。 – Spear 2010-11-17 17:12:22

相关问题