2014-12-07 55 views
4

我正在建立一個網站的註冊/登錄流程。我打算使用Facebook作爲我的身份提供者,而不是自己動手。如何在利用OAuth代碼流時使用用戶定義的唯一標識符註冊新用戶?

我有與Facebook服務器端登錄流程良好的手感:

  1. 調用FB login API以獲取用戶訪問令牌
  2. Inspect用戶訪問令牌
  3. 代碼
  4. Exchange the code
  5. 驗證用戶訪問令牌的詳細信息

Afters e步驟,我想檢查已驗證的用戶是否已在我的系統中註冊。如果是,只需返回一個新生成的載體令牌,以便用戶可以向資源服務器發出後續請求以訪問受保護的數據。

但是,如果用戶沒有在系統中註冊,那麼我想通過創建數據庫條目來註冊它們。雖然在創建此條目之前,我想從用戶那裏收集一條信息。也就是說,我想讓他們告訴我他們想要的'用戶名'。我將使用這個唯一的用戶名作爲我的數據庫主鍵。

我不是100%確定如何在創建數據庫條目之前安全地詢問用戶所需的用戶名。這是我的問題。 :)

我以爲有一個想法是創建一個「贖回代碼」。該代碼將被加密幷包含用戶初始化詳細信息,僅服務器知道的祕密以及時間戳。事情是這樣的:

code: { 
    mySecret: "super-secret-value", 
    expirationDate: "date-value", 
    user: { ... }, 
} 

後看到用戶是不是在我的系統,我的代碼響應+客戶端重定向到一個頁面,他們會能夠指定他們的用戶名。將用戶名+代碼提交回服務器後,我可以解密代碼,並驗證mySecret以確定代碼未被篡改。如果一切正常,請使用已兌換代碼中的user信息在數據庫中創建用戶。最後,我會爲用戶生成一個新的不記名令牌並將其發送給客戶端。

問題

  1. 是我提出的兌換碼策略請求創建後端數據庫條目之前用戶名的安全方式?
  2. 如果不是,會是什麼?
  3. 如果是,在C#中用於此目的的安全加密/解密例程是什麼?

流序列

  • 步驟1-4從上面通過 「驗證」 箭頭對應於 「登錄」。
  • 我建議的兌換碼策略對應於紫色箭頭。
  • 紅色文字對應Facebook特定命名法。

enter image description here

注意,堆棧溢出確實非常相似,我想要做的事。在SO上創建您的帳戶之前,它會要求您提供所需的顯示名稱(這通過Facebook,Google等進行驗證後發生)。提交您的顯示名稱後,您的帳戶已註冊。

回答

0

使用開源的IdentityServer3。

無論您選擇哪種流程,其服務器中已經標準化。包括(如果您需要或需要)OpenID,OAuth2等。