Rails:使用Knock(JWT)提供专用授权服务和应用服务的微服务架构

时间:2017-03-22 10:37:22

标签: ruby-on-rails ruby jwt microservices

我现在正试图将单片应用程序分离到微服务(专用rails应用程序)并想知道 - 是否有从每个服务移动授权服务的解决方案?

例如,我有6个不同的Rails API服务,其中'knock'gem具有用于验证目的的用户模型。 所有这些服务共享一个用户数据库。

我想用用户模型实现专用服务,但是其他服务如何使用给定令牌验证用户?

此外,我希望能够控制用户可以使用和不能使用的服务。那么应该有AccessRole服务吗?

案件草案:

  1. 用户转到“文章”(前端UI客户端)
  2. auth_service正在验证来自客户端的令牌
  3. access_service以某种方式从auth_service获取消息并验证用户的角色以访问“文章”资源。
  4. articles_service使用json数据向客户端发送响应。
  5. 这里还有一些问题:

    1. access_service如何与auth_service通信?他们应该使用一个用户数据库来验证用户的凭据和角色吗?
    2. articles_service等 - 如果他们成为私人服务而无法访问公众并将其作为黑匣子用户?

1 个答案:

答案 0 :(得分:0)

我一直在玩这个问题,并没有任何好的文件解决方案。我要做的是构建一个管理用户和访问控制列表(ACL)的服务。

  1. 身份服务 - 这是客户端授权自己访问API中其他服务的地方。
  2. login [POST] email password

    这将返回一个JWT令牌,在有效载荷部分中将具有以下信息:

    1. 用户ID
    2. ACL
    3. ACL可以是他们拥有的允许角色的数组。这样,当客户端向API发出请求时,响应请求的服务可以内省用户ID(Knock-current_user),然后您可以从有效负载中获取ACL。我觉得很容易添加一个before_action来验证相应的角色。