2009-10-08 125 views
7

這是一個數據庫問題。我有一個已經安裝並正在運行的openid庫。在數據庫中存儲OpenID信息

我想在我正在使用的網站上使用OpenID。有三種類型的用戶。

  1. 使用電子郵件/密碼使用OpenID使用OpenID認證
  2. 匿名帳戶驗證
  3. 命名帳戶命名帳戶驗證

所有這些用戶都存儲在同一個表中簡單地評論表。已命名的帳戶鏈接到該帳戶可以管理的博客。匿名用戶可以評論博客上的文章,但他們無法做任何其他事情。如果匿名用戶註冊一個帳戶,我想自動將該用戶的舊評論轉移到指定的帳戶。我目前正在通過讓用戶填寫具有唯一名稱和有效電子郵件的表單來做到這一點。

當前兩組帳戶使用以下模式存儲在同一個表中。 (是的,它是一個軌道遷移)

create_table :users do |t| 
    t.string :name #unique because it maps to a subdomain 
    t.string :openid_url #unique 
    t.string :email #unique 
    t.string :password_hash 
    t.string :password_salt 
    t.boolean :guest #Anonymous user flag 

    t.timestamps 
end 

openid_url是獨一無二的,以防止多個賬戶被連接到相同的OpenID。email是獨一無二的,因爲用戶使用電子郵件/密碼登陸)

我用這設置我遇到了Google OpenID實施中的問題。每位使用Google for OpenID的用戶都有相同的網址:https://www.google.com/accounts/o8/ud

如何支持將Google作爲openid提供商使用,因爲它對於每個用戶來說都不是唯一的? (請記住存在的限制)

注意:Google帳戶可以使用互聯網上的任何有效電子郵件地址,因此我不能只將[email protected]存儲在openid_url字段中,因爲電子郵件可能是person @ example。 com或更糟糕的[email protected]!雅虎也使用這種單一的URL方法,所以我也必須支持他們。

+0

你爲什麼說電子郵件地址是唯一的?他們可能不是。如果您看到第二個openid登錄並且用戶聲明與您已擁有的電子郵件地址相同的電子郵件地址,該怎麼辦? – 2009-10-08 15:46:17

+0

電子郵件是用於不使用openid的指定帳戶。我已經改變了我的應用程序專門使用openid。 (我認爲足夠的人有谷歌/雅虎帳戶,我不會有這個問題。) – epochwolf 2009-10-08 18:32:44

回答

8

存儲openid.claimed_id值。它是每個用戶唯一的。 Google OpenID確實是獨一無二的。他們都以相同的價值開始,但他們有獨特的?id=uniquenesshere querystrings。請記住,這些值應該被視爲區分大小寫,因此在查找用戶時保留大小寫並匹配大小寫。

你絕對不會因爲你給的理由而認爲電子郵件地址是獨一無二的,而且對於大多數提供者而言,電子郵件地址沒有經過預先驗證(或者你不能相信提供者已經這麼做)所以存儲在電子郵件地址是一種確保用戶身份被盜的方法。

-1

openid_url在這裏是不需要的。只有用戶ID或名稱(唯一)適用於這兩個帳戶。 您也可以使用UserAccount表中的openid和userid創建單獨的表。

相關問題