您应该如何处理auth并在微服务之间共享用户信息?

时间:2015-07-09 12:26:19

标签: node.js mongodb nginx microservices

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

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

例如,我有博客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会更好但不是必需的

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

1 个答案:

答案 0 :(得分:4)

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

  

对于我们来说,服务导向意味着用数据封装数据   对数据进行操作的业务逻辑,只有访问权限   已发布的服务界面。不允许直接访问数据库   从服务外部,并没有数据共享   服务。

     

- 亚马逊首席技术官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

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0

通过http://auth_service.localhost可访问的端点(选择您自己的URL)是独立的,并且拥有自己的数据库并且只做一件事 - 对用户进行身份验证。机制可以依赖于某个密钥或头部甚至IP地址。要抑制后续请求,您可以缓存响应。

SOA很难但我建议彻底阅读:https://www.nginx.com/blog/introduction-to-microservices/