您应该如何处理跨微服务的身份验证和共享用户信息?

Posted

技术标签:

【中文标题】您应该如何处理跨微服务的身份验证和共享用户信息?【英文标题】:How should you deal with auth and sharing Users info across microservices? 【发布时间】:2015-09-27 19:51:45 【问题描述】:

TLTR:无论服务器的位置或所使用的技术如何,什么是跨服务进行身份验证和用户信息通信的好方法

我正在尝试了解微服务,但我有点不清楚我应该如何访问用户信息并控制对多个服务的访问。如果我完全错误地处理这个问题,请告诉我。

例如,我有一个用于博客 CRUD 操作的基本服务和一个用于上传和存储图像和视频的服务。我还没有对 Authorization 或 Users 做任何事情(除了我要考虑 UserIds 最终出现在我的模型中(例如,在我的博客模型 ObjectID's for author、commenters 等)。

我希望尽可能地保持分离(为了学习目的,而不是任何东西),而目前我在 Node.js 中构建它,我希望能够交换不同的技术,例如 nginx, java/go/python 服务或不同的存储(目前是 mongo,但希望能够切换到 sql 作为选项)

我目前如何构建这些结构是我将这两个服务都构建为 Express.js 应用程序,目前我正在使用 node-http-proxy 代理到 express 服务(这只是为了节省现在设置 nginx,但我也不想依赖 nginx)。

我应该如何处理:

经过身份验证的用户或某些路线(例如,在创建新帖子或更新/删除时),而不是在获取帖子以阅读时(最终我也想合并角色)

填充用户信息,例如从存储在博客作者中的用户 ID 并将其替换为用户信息(在单个应用程序中,我可以只使用 mongoose populate

主要目的是我希望将身份验证和用户保持在单独的服务中,这些服务可以在任何其他服务中调用并存储在另一个数据库中,例如,如果它们位于不同的物理服务器上。

有人向我建议我可以使用 HTTP/S 来做到这一点,但有没有更好的方法来做到这一点,任何人都可以指出任何实现示例,Node.js 会更好,但不是必需的

这可能需要一些服务注册表,但我对如何实现有点迷茫

【问题讨论】:

太宽泛了。这就是所谓的“单点登录”。阅读。 @blakes-seven 我不觉得它太宽泛。我在问具体的问题,只是不想要一个特定于技术的答案(减去可能是 node.js 的例子)。我也不认为单点登录一定是唯一的方法,或者如果它总是正确的就是这样做。如果可以避免的话,我不是特别想走 sso 路线 太宽泛了。我同意使用单点登录。在我现在的雇主,我们使用 CAS。虽然我不参与维护主 CAS 服务器,但我确实拥有受 CAS 保护的 Web 服务。我所做的就是将 CAS 客户端库包含为 as.dependencies 并更新 Servlet 容器中的 web.xml 文件以通过 CAS Web 过滤器过滤所有流量 【参考方案1】:

身份验证层作为自己的应用程序非常适合 SOA 设计。有一个 HTTP 端点不能直接访问微服务数据库,这是 SOA 的最佳实践:

对我们来说,面向服务意味着用 对数据进行操作的业务逻辑,只能通过 发布的服务接口。不允许直接访问数据库 从服务外部,并且在服务之间没有数据共享 服务。

-- 亚马逊首席技术官 Werner Vogels

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

什么是身份验证层或服务,一台服务器如何确认身份验证已经建立?一种基于客户端的持久性是 HTTP cookie,它严格与域名挂钩,因此在没有显式身份验证步骤的情况下,在多个域之间重用相同的 cookie 并不容易。

如果你能够通过某个key或header 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/

【讨论】:

见我的另一个related answer

以上是关于您应该如何处理跨微服务的身份验证和共享用户信息?的主要内容,如果未能解决你的问题,请参考以下文章

跨微服务传递用户信息

使用 JWT 令牌时应该如何处理 RESTful 身份验证?

我应该如何处理 Window Phone / WCF / ASP.NET MVC 应用程序的用户身份?

如何处理 SilverLight 4 和 WPF 应用程序的 WCF 身份验证

如何处理 InvalidTokenException?

如何处理数据库中用户的身份验证/授权?