2012-04-04 111 views
7

幾個月前我從Google App Engine遷移出去。但是我仍然依靠它進行身份驗證,因爲我的用戶在GAE上通過其user_id屬性進行標識。將用戶從Google App Engine遷移到Google OpenID

爲此,我的(現在是外部的)應用程序使用加密,簽名和時間戳登錄請求將用戶重定向到Google App Engine應用程序。 GAE應用程序然後使用GAE的「用戶」服務執行登錄。在GAE上成功登錄後,用戶將再次使用加密的,帶符號和時間戳的響應重定向到我的外部應用程序。 基本的實現可以找到herehere。正如你所看到的,這是非常基本的,並且依賴於沉重的加密導致性能不佳。

我的外部應用程序(在本例中爲Django應用程序)將user_id存儲在用戶表的密碼字段中。除了user_id之外,我只能從GAE獲取電子郵件地址,以在Django中存儲用戶名和電子郵件。

現在我想刪除對GAE服務的依賴。想到的第一種方法可能是向每個用戶發送一封電子郵件,要求他設置一個新密碼,然後使用Django執行我自己的認證。

我更喜歡依靠Google的OpenID服務的解決方案,這樣用戶實際上沒有區別。這也是首選,因爲我需要將用戶發送給Google,以獲取Google Calendar API的AuthSub令牌。

問題是,我找不到一種方法可以在不使用GAE的情況下獲取給定Google帳戶的GAE user_id屬性。 OpenID和所有其他身份驗證協議使用不同的標識符。

所以,現在的問題是:Google是否提供了我可以用於此目的的API,但我還沒有看到?有沒有其他可能的解決方案或想法如何遷移用戶帳戶?

在此先感謝!

回答

1

AFAIK是Google帳戶與Google OpenID之間唯一的通用標識符,即電子郵件。

  1. 當用戶通過當前的gae設置登錄到Google帳戶時獲取電子郵件。使用User.email()。保存此電子郵件以及用戶數據。

  2. 當您收到所有(大部分)用戶的電子郵件時,請切換到Google OpenID。用戶登錄時,獲取電子郵件地址並在數據庫中找到該用戶。

+0

感謝您的回覆。與此相關的問題是,用戶可能在此期間更改了他的電子郵件地址,例如,從非gmail地址轉換爲gmail或另一個非gmail地址。我之前遇到過這種情況,必須手動提供一種方式讓用戶與我聯繫並重新鏈接其舊帳戶和相關數據。 user_id是一個永不改變的靜態標識符,我真的很想確保沒有人被拋在後面。 – mback2k 2012-04-04 14:34:49

0

Google有一個唯一的標識符,該標識符作爲一個成功的OpenID身份驗證請求參數返回 - * openid.claimed_id *。如果切換到使用OpenID,那麼在用戶第一次使用新方法登錄時,您可以基本上交換user_id作爲此參數,而用戶不會注意到他們的登錄體驗不同。

概述認證過程的文檔here。我建議使用混合OpenID + OAuth方法,以便您可以將您的請求令牌與給定ID相關聯,然後在返回時驗證openid.claimed_id是否匹配您的原始請求令牌。

+0

謝謝。是的,但我如何將現有用戶與他們的帳戶相匹配。重點是電子郵件地址或暱稱不是唯一的,也不是靜態的。我用戶羣中有近15%的人使用非gmail/googlemail.com地址,這些地址在任何時候都可能發生變化。 我目前使用user_id作爲用戶識別的單一因素,但爲了信息和聯繫目的而保留電子郵件和暱稱。 – mback2k 2012-04-04 19:42:22

+0

兩種可能的方法。其一,您只需將您系統上的帳戶與第一次登錄的任何Google帳戶關聯起來。兩個(更安全)在過渡期間首先使用當前方法驗證用戶,然後再次使用OpenID方法驗證用戶。 – 2012-04-04 20:26:04

+0

要增加/澄清的另一件事 - 在開始轉換之前,您應該爲用戶生成自己的唯一標識符,並且不要依賴Google標識符來驗證未來基於OpenID的身份驗證之外的其他任何操作。 – 2012-04-04 20:36:49

2

要做到這一點,最好的方法是向用戶展示「遷移」interstital,將其重定向到Google OpenID提供商並提示他們登錄。一旦他們在兩個地點都登錄,您可以匹配這兩個帳戶,並讓他們將來通過OpenID登錄。

+0

感謝您的回答,但正如我現在在其他評論中指出的:我真的很想避免過渡階段,遷移期或類似的事情。而且我也想確保沒有人落在後面。 (我知道你的解決方案是好的,但其他人可能不會。)我應該補充的一件事是,即使我將user_id存儲在我的Django auth_user表的密碼字段中,user_id也未加密或散列。如果一個API將它們轉換爲OpenID標識符或類似的東西存在,我可以輕鬆遷移。 – mback2k 2012-04-05 06:08:30

+0

@ mback2k你在找什麼不存在。 App Engine用戶API返回的用戶ID是一個內部標識符;沒有外部通信或任何將其轉換爲外部標識符的方式。 – 2012-04-05 06:10:42

+0

好吧,我明白了。感謝你的回答。這可能是GAE團隊未來可能正在研究的問題嗎?作爲開放數據導入/導出和遷移工作的一部分? – mback2k 2012-04-05 06:14:57

1

你爲什麼不嘗試一種混合的方法:

  1. 切換至OpenID
  2. 如果您的應用已經知道用戶id,你做
  3. 如果不詢問用戶,如果他有一個帳戶遷移
  4. 如果是的話,請登錄他與老mechansim和ttransfer的acount
  5. 如果沒有創建一個新帳戶