簡體   English   中英

使用passport.js的微服務認證架構

[英]Microservices authentication architecture with passport.js

我正在編寫一個玩具應用程序,用於在nodejs(expressjs)上練習微服務和身份驗證。

我有一個react客戶端,一個身份驗證服務和其他服務(他們到目前為止只回復“你好”)。

  • 客戶端將托管在CDN中。
  • auth服務偵聽端口5000(例如)
  • 其余服務偵聽端口6000-6100。
  • 我有一個redis數據庫來存儲會話信息(由twitter提供的oauth令牌)。
  • 存儲應用程序信息的mongodb(與此問題無關)。

這個想法是未經身份驗證的客戶端通過單擊Twitter按鈕(SSO)進入身份驗證服務。 然后,auth服務獲取生成的twitter誓言令牌,並在redis存儲中設置此令牌。 然后,其他服務可以訪問該令牌,以便通過檢查請求是否已經存在於redis存儲中來知道它是否已經過身份驗證(如果用戶刪除了其帳戶,它也將從redis存儲中刪除) 。 經過身份驗證后,我會在客戶端之間來回發送Twitter令牌。

在此輸入圖像描述

我發現這種方法非常簡單(其他人使用nginx代理進行身份驗證,但我認為沒有理由,除非服務托管在不同的域中,但我不太了解它)所以我很擔心我是例如,缺少關於安全性的東西。

問題:

  1. 這種方法是否正確?
  2. 分享推特令牌是否安全(我想是這樣)?
  3. 我在這里沒有注意到任何安全問題嗎?

使用這種方法,您將必須在所有服務中驗證令牌,如果您對此可以,那么您可能沒問題。

Twitter訪問令牌可能具有到期時間,這將使得必須使用刷新令牌從auth服務獲取新的訪問令牌:

  • 當訪問令牌到期時,您將從您嘗試與之通話的服務X返回401到客戶端。
  • 客戶端必須調用Auth服務,提供刷新令牌,獲取新的訪問令牌
    • 最終,客戶端將使用此新訪問令牌再次訪問Service X,對其進行驗證並從Service X獲得預期的響應。

在我最近的任務中,我編寫了一個代理所有令牌的微服務,使用這種方法,我的代理處理從auth到角色的所有內容,並發送401用於過期的令牌和撤銷刷新令牌等。我認為這讓我更加分離了關注點。

重要說明:在上面的刷新令牌場景中,我的代理只會遇到無效/過期的accessstoken加載,而在您的場景中,任何服務都可以通過無效令牌到達...

另一種方法是讓Service-A和Service-B調用auth服務來驗證令牌,但這會推斷服務之間的更多流量,因為每個帶有令牌的HTTP請求都必須經過驗證。 在這種情況下,無效的令牌請求也會到達您的服務X,從而推斷出一些負載......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM