微服务架构

问题描述:

问题微服务架构

问题怎么可能创造一个微服务应用程序内的认证服务,并有其他服务核对该令牌(JWT)和检索用户中智威汤逊认证?

可能的解决方案

我现在的想法是根据各地的权威性服务将{ token, user }成的Redis一旦用户通过验证。所有其他服务都可以在Redis中检查用户的Authorization: Bearer kdI8$dj$nD&...标头令牌。

  • 如果token存在于Redis的,用户被认证。
  • 如果在Redis中不存在token,则用户未通过身份验证。

enter image description here

  1. 用户发送{ username, password }要权威性服务
  2. 验证服务认证凭证,并检索{ token, user }
  3. 验证服务插入{ token, user }成Redis的
  4. 用户使得请求Service-1{ token }
  5. 在Redis的3210个
  6. Service-1 loooks为{ token }和检索{ token, user }
  7. Service-1就执行并发送回{ data }

是否有任何可能的安全,逻辑或建筑问题,这种做法?

+0

你不明确你的用户在哪里与服务有关,以及服务在哪里与Redis的关系?特别是,我想知道你怎么知道它在Redis中的检查之间是同一个用户。 (即不是用户的jwt点,以证明他是谁) – akc42

+0

我已经清理了该图并添加了一些流程步骤:-) – AndrewMcLagan

你不明白为什么你想在Redis中存储令牌。安全令牌通常包含有关用户(声明数据)的信息。如果您需要有关未存储在令牌中的用户信息,则应该能够通过对用户ID声明的简单数据库查询来查看该信息。

每个服务都可以通过检查传入的令牌digital signature(只需要签名证书的公钥),生存期(何时令牌到期),受众(谁是令牌)等等来验证传入令牌。如果调用者呈现一个有效的令牌,该用户被认证。

+0

尽管每个服务都必须具有身份验证逻辑,国际海事组织非常不好的做法,因为代码将被复制,或在相同的情况下再次用不同的语言编写。所以我真的想要避免这种方法? – AndrewMcLagan

+0

当然,每项服务都需要验证码。你通常会使用一个库(通过一个NuGet包)来验证令牌,但是如果你的服务是用不同的语言编写的,那么代码确实会被复制。我没有看到如何使用共享缓存确实改善了这一点。 – MvdD

+0

,因为只有一个auth服务将认证用户+令牌插入商店。该商店成为认证的权威机构,其分布式,集群化和所有其他服务都可以访问。在任何时候,我都可以更改auth服务中auth的执行方式。你描述你的方式坚持你的最初决定。 ? – AndrewMcLagan

使用这种方法,你将不得不在你所有的服务中验证令牌,如果你没有问题,那么你可能没问题。

访问令牌可以有到期时间,这将使使用一个刷新令牌来获取从身份验证服务新的访问令牌,有必要:

  • 当访问令牌到期后你会返回一个401客户端,您正在尝试与之交谈的服务X.
  • 客户将不得不调用验证服务提供一个刷新令牌,获得新的访问令牌
    • Finaly客户端将再次与这个新的访问令牌击中X服务,有它验证,并得到预期的从服务十

在我recent assignment响应我写了一个微服务,代理所有请求验证他们的标识,代理处理一切从登录/ AUTH给角色和发送401的过期令牌和撤销刷新令牌等我认为这给了我不必处理所有服务中的令牌,而是将问题分离出来。然而,它当然会使代理成为瓶颈,auth服务的自动缩放就是为了解决这个问题。

另外,我没有使用redis,但在accesstoken中存储了散列键(由散列的accesstoken属性+ salt组成),我可以通过重新筛查accesstoken + salt的其他属性进行验证。

重要提示:在上面我的代理刷新令牌的情况不仅会遇到负载无效/过期的accessToken,而在方案中的任何服务可以用无效的令牌来达到的,我不知道这是在你的特定情况下的任何关注,但它可能是值得一提的...

另一种方法是让服务-A和服务-B调用验证服务来验证令牌,但这会推断更多的流量因为每个具有令牌的HTTP请求都必须经过验证。在这种情况下,一个无效的令牌请求将到达您的服务X,并因此推断它的一些负载...