簡體   English   中英

您應該如何處理微服務中的身份驗證和共享用戶信息?

[英]How should you deal with auth and sharing Users info across microservices?

TLTR:什么是跨身份驗證和用戶信息的服務之間進行通信的好方法,而不管所用服務器或技術的位置如何

我正在嘗試學習微服務,但是我不清楚應該如何訪問用戶信息並控制具有多種服務的訪問。 如果我要完全解決這個問題,請告訴我。

例如,我有一個用於Blog CRUD操作的基本服務,以及一個用於上載和存儲圖像和視頻的服務。 我還沒有對Authorization或Users做任何事情(除非我負責最終在模型中出現的UserId(例如,在博客模型中,作者,評論者等使用的ObjectID))。

我想盡可能地將其分開(出於學習目的,而不是任何其他目的),同時,我目前正在Node.js中構建它們,我希望能夠交換出不同的技術,例如nginx,java / go / python服務或其他存儲(當前為mongo,但希望能夠選擇切換到sql)

我目前如何構造這些結構是我同時將這兩種服務都構建為Express.js應用程序,並且當前我正在使用node-http-proxy代理到Express服務(這只是為了節省當前設置Nginx的費用,但我沒有想要依賴於nginx)。

我應該如何處理:

  • 經過身份驗證的用戶或某些路線(例如,在創建新帖子或更新/刪除時),而不是在使帖子閱讀時(最終,我也想加入角色)

  • 填充用戶信息,例如從存儲在博客作者中的用戶ID中填充用戶信息,並將其替換為用戶信息(在單個應用中,我只能使用貓鼬填充

主要目的是我希望將Auth和Users保留在單獨的服務中,這些服務可以在任何其他服務中調用並存儲在另一個DB中,例如,如果它們位於不同的物理服務器上。

有人建議我可以使用HTTP / S來執行此操作,但是有更好的方法可以執行此操作,有人可以指出任何實現示例,但Node.js會更可取,但並非必不可少

這可能需要一些服務注冊表,但是我對如何實現它有些迷惑

身份驗證層作為其自己的應用程序非常適合SOA設計。 有一個HTTP端點無法直接訪問微服務數據庫,SOA最佳實踐是:

對我們來說,面向服務意味着將數據與對數據進行操作的業務邏輯封裝在一起,並且只能通過已發布的服務接口進行訪問。 服務外部不允許直接訪問數據庫,服務之間也沒有數據共享。

-亞馬遜CTO Werner Vogels

參考http://martinfowler.com/microservices/

什么是身份驗證層或服務,並且一台服務器如何確認已建立身份驗證? 一種基於客戶端的持久性是HTTP cookie,它嚴格地綁定到域名,因此,如果沒有顯式的身份驗證步驟,則很難在多個域之間重用相同的cookie。

如果您能夠傳遞某個鍵或標頭,則http_request可以提供不打擾的身份驗證,此模塊將從 1.5.4版開始成為內置的Nginx核心: http : //nginx.org/en/docs/http/ngx_http_auth_request_module.html

location /upload {
    auth_request /auth;
    ...
}

location = /auth {
    internal;
    proxy_pass http://auth_service.localhost;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    proxy_set_header X-Original-URI $request_uri;
}

通過http://auth_service.localhost (選擇您自己的URL)可訪問的端點是隔離的,具有自己的數據庫,並且僅做一件事-是否對用戶進行身份驗證。 一種機制可以依賴某個鍵或標頭甚至IP地址。 要抑制很多后續請求,您可以緩存響應。

SOA很難,但我建議您仔細閱讀以下內容: https : //www.nginx.com/blog/introduction-to-microservices/

暫無
暫無

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

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