2010-11-17 58 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

相關問題