2015-06-25 169 views
7

語境微服務認證

我有多個服務,如:

  • 用戶(LDAP或Active Directory等)
  • 結算
  • 規劃
  • 等..
  • 驗證

我需要在我的微服務使用OAuth2.0的(我用我自己的數據,而不是gettint第三腿服務器)

連接,爲開始,使用標準的登錄/密碼問題

根據這些圖片:

步驟1

enter image description here

步驟2

enter image description here

我如何處理控制的access_token或授權控制,我不是authmicroservice其他服務?

回答

1

存在於我們的激活微服務的教程和認證流程的描述,它在斯卡拉 - http://www.typesafe.com/activator/template/reactive-microservices(來源:https://github.com/theiterators/reactive-microservices


的基本思路是:你需要驗證身份驗證令牌的真實性爲每個請求。 您可以:

- 做一個代理服務器(網關)

- 做計費微服務裏面


我們傾向於做的是:驗證驗證令牌內每個面向客戶的微服務。

- 我們將Auth-Token保留給Redis實例中的用戶信息。

- 在面向客戶的服務要求Redis的情況下,如果此令牌是有效

- Redis的返回,我們可以爲用戶的數據進行進一步的授權使用一些JSON字符串。

所以服務器端的流量看起來像這樣

get("projects/"/Segment) { projectName => 
    getHeader("Auth-Token") { authToken => 
    Redis.get("auth:token:#{authToken}").map { userJson => 
     if(userJson("projects").include(projectName)) { 
     ...processSth... 
     Ok 
     } else { 
     Unauthorized 
     } 
    } 
    } 
} 
+0

感謝您的回覆。當您告訴「您可以在網關或每個服務中完成」時,您真正感興趣的部分是第二個。你能詳細介紹一下廣告和利弊嗎? : - D – mfrachet

+1

=>我們將授權與驗證分開。身份驗證服務給「前端」「用戶」一種說法,「是的,這是我,這是我的會話」。授權告訴用戶X可以做或不能做。雖然身份驗證是通過auth service/oauth等完成的,但授權可以與更深更復雜的業務規則相關聯。 假設網關檢查auth-token是否有效,並用X-UserId HTTP頭調用包裝的服務。現在,這些服務需要自己檢查具有給定ID的用戶是否可以執行某些操作。防爆。如果UserId == project.ownerId project.save() –

+0

因此,代理可以是一個NGINX,它具有一些訪問Redis的腳本並檢查token是否在redis中,並將標記的值從Redis中的標頭傳遞到包裝服務。或者它可以是一個普通的微服務。這可以根據需要進行分層,給定足夠複雜的域。 –

0

它可以創建單獨的驗證服務提供類似的access_token您在步驟1但在API網關在每個服務將顯示出需要調用身份驗證服務驗證令牌。我最好在我使用的API Gateway中應用oauth流程,並且這種方法在許多文章中也有解釋。讓我們看看下面的圖片。

inlined image

在技術角度來看,它可以簡單地的代碼(功能)的部分,其處理的請求頭,以驗證作爲OAuth認證提供的令牌,該令牌可能會在代碼或通過訪問自己的數據庫處理之前將請求轉發服務的端點。

您可以遵循一種方法,通過增強的API網關服務向端點提供身份驗證,安全性和請求分派。有個問題已經在stackoverflow here問過了,但我發現容易遵循的是3或4系列的教程,你會發現here

在你專注於微服務工作之前,清楚地瞭解你的API網關使用情況。

0

根據您構建微服務的方式,您也可以利用構圖。

由於您已經擁有身份驗證服務,因此您可以在您的賬單服務中使用它來在處理請求之前檢查請求的真實性。

例如,如果你使用像StdLib平臺(我們使用這個內部):

// Billing 
const lib = require('lib'); 

module.exports = function(params, callback) { 
    lib.user.isAuthenticated(params, function(err, user) { 
    if (err) return callback(err); 
    // Do stuff with user, process billing 
    }); 
}; 

這可能不是你一個偉大的想法,如果你總是使用HTTP進行通信之間的功能(因爲這可能會增加您的請求200至300毫秒)。但StdLib會在同一區域加載一些服務,並且可以基本上像解決這個問題的函數一樣訪問它們(至少到目前爲止我們已經見過)。

4

爲了管理微服務架構中的身份驗證,您必須有不同的觀點。

請記住,當您使用巨石時,您只有一個身份驗證過程。

作爲PHP應用程序中的一個示例,您可以在數據庫中找到您的用戶並獲取其相應的憑據,然後創建用戶「認證」的會話。

對於微服務,工作流程是相同的。現在唯一改變的是你不能在不同的服務中打開一個會話。此外,您不需要獲取經過身份驗證的用戶。您只需確保他有權在您的微服務器上執行當前通話。

感謝oauth2,擁有有效的access_token會爲您提供此信息。

這應該回答前端部分。在後端部分(我的意思是在api網關後面),你不應該管理access_token,因爲它與微服務無關。例如,您可以使用功能鍵來查找微型服務中與用戶相關的任何信息,例如uuid。

爲了在使用oauth2時獲得uuid,我建議使用openid連接。具有此協議的用戶可以管理特定的用戶信息,並且可以訪問特定的端點「/ userinfo」。

希望這個模式將使這個答案更清晰。

enter image description here