微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

node.js – 你应该如何处理auth并在微服务之间共享用户信息?

TLTR:无论服务器或技术的位置如何,通过Auth和用户信息的服务进行通信的好方法是什么

我正在尝试了解微服务,我对如何访问用户信息和控制多种服务访问方式有点不清楚.如果我接近这个完全错误,请告诉我.

例如,我有一个用于Blog CRUD操作的基本服务和一个用于上传和存储图像和视频的服务.我还没有对授权或用户做过任何事情(除了我在我的模型中最终存在UserIds(例如在我的博客模型ObjectID中为作者,评论者等).

我希望保持尽可能分开(为了学习目的而更多),而目前我正在Node.js中构建它,我希望能够交换进出不同的技术,如Nginx,一个java / go / python服务或不同的存储(目前是mongo,但希望能够切换到sql作为选项)

我目前如何构建这些结构是我有两个服务构建为Express.js应用程序,目前我使用node-http-proxy代理快递服务(这只是为了保存现在设置Nginx但我不想要依赖于Nginx).

我应该如何处理:

>经过身份验证的用户或某些路由(例如,在创建新帖子或更新/删除时)和Not获取帖子时读取(最终我也希望合并角色)
>填充用户信息,例如从存储在博客作者中的用户ID并用用户信息替换它(在单个应用程序中我可以使用mongoose populate

主要目的是我希望将Auth和Users保留在可以在任何其他服务中调用的单独服务中,并存储在另一个数据库中,例如,如果它们位于不同的物理服务器上.

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

这可能需要一些服务注册表,但我有点失去了如何实现它

解决方法

身份验证层作为自己的应用程序非常适合SOA设计.有一个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并不容易.

如果您能够传递某个密钥或标头,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/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐