您应该如何处理跨微服务的身份验证和共享用户信息?
How should you deal with auth and sharing Users info across microservices?
TLTR:无论服务器的位置或使用的技术如何,跨服务进行身份验证和用户信息通信的好方法是什么
我正在尝试了解微服务,但我不太清楚应该如何访问用户信息并控制对多个服务的访问。如果我的做法完全错误,请告诉我。
例如,我有一个用于博客 CRUD 操作的基本服务和一个用于上传和存储图像和视频的服务。我还没有对授权或用户做任何事情(除了我正在考虑最终出现在我的模型中的用户 ID(例如,在我的博客模型中,作者、评论者等的对象 ID)。
我希望尽可能将其分开(出于学习目的而不是其他目的),而目前我正在构建它 Node.js 我希望能够交换不同的技术例如 nginx、java/go/python 服务或不同的存储(目前 mongo,但希望能够切换到 sql 作为选项)
我目前如何构建这些结构是我将两个服务构建为 Express.js 应用程序,目前我正在使用 node-http-proxy 代理到快速服务(这只是为了节省设置 nginx现在,但我也不想依赖 nginx)。
我应该怎么处理:
经过身份验证的用户或某些路由(例如,在创建新的 post 或 updating/deleting 时),而不是在让 post 读取时(最终我也想加入角色)
填充用户信息,例如从存储在博客作者中的用户 ID 并将其替换为用户信息(在单个应用程序中,我可以只使用 mongoose populate
主要目的是我想将 Auth 和 Users 保留在单独的服务中,这些服务可以在任何其他服务中调用并存储在另一个数据库中,例如,如果它们位于不同的物理服务器上。
有人向我建议我可以使用 HTTP/S 来做到这一点,但是有没有更好的方法来做到这一点,谁能给我指出任何实施示例,Node.js 更可取,但不是必需的
这可能需要一些服务注册表,但我有点不知道如何实现它
身份验证层作为其自身的应用程序非常适合 SOA 设计。有一个无法直接访问 micro-service 数据库的 HTTP 端点,SOA 最佳实践是:
For us service orientation means encapsulating the data with the
business logic that operates on the data, with the only access through
a published service interface. No direct database access is allowed
from outside the service, and there’s no data sharing among the
services.
-- Werner Vogels, Amazon CTO
参考http://martinfowler.com/microservices/
什么是身份验证层或服务,一台服务器如何确认身份验证已经建立?一种基于客户端的持久性是严格挂接到域名的 HTTP cookie,因此在没有显式身份验证步骤的情况下在多个域之间重用相同的 cookie 并不容易。
如果你能够通过某个密钥或者header http_request 可以提供不显眼的身份验证,这个模块从版本开始成为Nginx核心1.5.4: 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)访问的端点是隔离的,拥有自己的数据库,并且只做一件事 - 验证用户或不验证用户。一种机制可以依赖于某个密钥或 header 甚至 IP 地址。要抑制更多后续请求,您可以缓存响应。
SOA 很难,但我建议您通读这篇文章:https://www.nginx.com/blog/introduction-to-microservices/
TLTR:无论服务器的位置或使用的技术如何,跨服务进行身份验证和用户信息通信的好方法是什么
我正在尝试了解微服务,但我不太清楚应该如何访问用户信息并控制对多个服务的访问。如果我的做法完全错误,请告诉我。
例如,我有一个用于博客 CRUD 操作的基本服务和一个用于上传和存储图像和视频的服务。我还没有对授权或用户做任何事情(除了我正在考虑最终出现在我的模型中的用户 ID(例如,在我的博客模型中,作者、评论者等的对象 ID)。
我希望尽可能将其分开(出于学习目的而不是其他目的),而目前我正在构建它 Node.js 我希望能够交换不同的技术例如 nginx、java/go/python 服务或不同的存储(目前 mongo,但希望能够切换到 sql 作为选项)
我目前如何构建这些结构是我将两个服务构建为 Express.js 应用程序,目前我正在使用 node-http-proxy 代理到快速服务(这只是为了节省设置 nginx现在,但我也不想依赖 nginx)。
我应该怎么处理:
经过身份验证的用户或某些路由(例如,在创建新的 post 或 updating/deleting 时),而不是在让 post 读取时(最终我也想加入角色)
填充用户信息,例如从存储在博客作者中的用户 ID 并将其替换为用户信息(在单个应用程序中,我可以只使用 mongoose populate
主要目的是我想将 Auth 和 Users 保留在单独的服务中,这些服务可以在任何其他服务中调用并存储在另一个数据库中,例如,如果它们位于不同的物理服务器上。
有人向我建议我可以使用 HTTP/S 来做到这一点,但是有没有更好的方法来做到这一点,谁能给我指出任何实施示例,Node.js 更可取,但不是必需的
这可能需要一些服务注册表,但我有点不知道如何实现它
身份验证层作为其自身的应用程序非常适合 SOA 设计。有一个无法直接访问 micro-service 数据库的 HTTP 端点,SOA 最佳实践是:
For us service orientation means encapsulating the data with the business logic that operates on the data, with the only access through a published service interface. No direct database access is allowed from outside the service, and there’s no data sharing among the services.
-- Werner Vogels, Amazon CTO
参考http://martinfowler.com/microservices/
什么是身份验证层或服务,一台服务器如何确认身份验证已经建立?一种基于客户端的持久性是严格挂接到域名的 HTTP cookie,因此在没有显式身份验证步骤的情况下在多个域之间重用相同的 cookie 并不容易。
如果你能够通过某个密钥或者header http_request 可以提供不显眼的身份验证,这个模块从版本开始成为Nginx核心1.5.4: 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)访问的端点是隔离的,拥有自己的数据库,并且只做一件事 - 验证用户或不验证用户。一种机制可以依赖于某个密钥或 header 甚至 IP 地址。要抑制更多后续请求,您可以缓存响应。
SOA 很难,但我建议您通读这篇文章:https://www.nginx.com/blog/introduction-to-microservices/