2017-04-13 151 views
3

我目前正在編寫一個API,並且一直在困擾着我如何正確安全地進行身份驗證/授權。API身份驗證流程

據我瞭解,這是怎麼一回事呢:帳戶

  • 新用戶註冊通過api/user/register端點(或api/user/login現有用戶)
  • 服務器收到請求,並檢查用戶名是唯一等等。之後,它發出(如果一切正常的話)訪問令牌刷新令牌,兩者都被簽名以增加安全性。
  • 客戶端應用程序接收到令牌並將它們存儲在瀏覽器cookie(或本地/會話存儲)中,並確保通過HTTPS安全地將其發送到API的任何後續請求中。
  • 當接收到受保護路由的請求時,服務器會檢查訪問令牌的過期日期,如果過期,將檢查數據庫中刷新令牌的有效性。如果無效,請詢問客戶端的重新認證。否則,重新發佈一個新的訪問令牌。

我的問題是關於處理刷新標記的步驟。

我也在寫客戶端應用程序(在React中);我不會將API發佈給公衆。我只是將後端編寫爲客戶端應用程序的API。

  • 我還應該使用刷新令牌嗎?
  • 我需要api/auth/token路線嗎?我一直在實現示例中閱讀它們,我覺得我可以只需要一些幫助函數來查詢數據庫並在後端代碼中重新發布令牌,而不必查詢另一個端點來執行此操作。

很抱歉,如果他們是愚蠢的問題,但頁面後,我一直在鑽研頁詳細介紹了身份驗證規範,以及細微的差別一頁一頁地離開我了困惑和不確定什麼是真正的「最佳實踐「在生產中。

+0

您是否有一個要求/功能使得必須使用單獨的刷新令牌?我無法確定你的問題會有什麼。我知道一些現實世界的生產系統,但大多數沒有。 –

回答

0

我覺得你對這個詞的登錄感到困惑。而不是/api/user/login我把它叫做/api/user/authentication。 所以如果請求有一個json附加到它的正文,它會返回一個有效的標記。但是,如果請求獲得有效的認證標頭,則只需發出一個在相同時間段內有效的新令牌。這對前端特別有用,所以你可以嘗試自動重新授權。

newUser := types.User{} 
if r.Body != nil { 
    err := json.NewDecoder(r.Body).Decode(&newUser) 
    ... 
} 
authHeader := r.Header.Get("Authorization") 
if authHeader != "" { 
    _, err := USERAUTH.CHeckJWT(w,r) 
    if err !=nil { 
    ..., 
    } 
    newToken := GenerateTokenFromToken(token) 
}