MIcroservice:身份验证的最佳做法

时间:2018-11-26 03:07:44

标签: rest architecture microservices

我正在考虑将微服务用于我的应用程序。但是,该应用程序涉及身份验证。例如。如果图像经过验证,则可以为用户提供上传图像的服务。如果他们通过了验证,还可以为他们写评论。

我应该如何设计微服务,以确保用户只需要进行一次身份验证即可访问不同的服务。我是否应该有一个API网关层来进行身份验证并使该API网关与其他服务通信?

2 个答案:

答案 0 :(得分:0)

如果仅需要身份验证,则可以在网关层进行身份验证。如果您对授权感兴趣,则可能必须将令牌转发给应用程序考虑。如果您对网关后面的其他服务有信任,也可以这样做。也就是说,服务1可以免费呼叫服务2而无需进行身份验证。 另外,您还会丢失有关主体的信息,但是可以在转发时将其写回到网关中的请求上。

还要考虑的另一点是JWT,它们很轻巧,更重要的是,无需显式调用auth服务器就可以对其进行验证,并且特别为微服务节省了一些时间。因此,即使您必须在每个服务层进行身份验证,您也可以以最小的成本(几纳秒)来完成身份验证。您也可以进行探索。

但是最终的决定是基于您的安全需求与休息需求之间的比较。基于此您可以接听电话。 api网关上的身份验证剥离可为您节省代码重复,但不如其他服务所希望的那样安全。 令牌也是如此,您可以在不显式调用身份验证服务器的情况下进行身份验证,但是令牌在一段时间内仍然有效,一旦获得令牌,承载者就可以按照自己的意愿随意做,您就无法使令牌失效。

答案 1 :(得分:0)

尽管Anunay的答案是最著名的解决方案之一,但我想指出另一种解决方案。您可以使用某些分布式会话管理系统在RAMDISK上保留会话。例如,我们具有身份验证模块,该模块创建令牌并将其持久保存在Redis中。虽然Redis本身可以进行分发,并且可以将较少使用的数据保留在磁盘上,但是对于所有微服务来说,使用Redis检查客户端令牌都是一个不错的选择。

使用此方法,与API网关无关。网关仅将令牌传递给微服务。因此,即使您正在考虑对不同的服务使用不同的身份验证方法,这也是一个很好的解决方案。 (尽管我现在无法想到有这种需求的原因,但我已经听说过)

在会话中,您可以存储用户角色和权限。这样,您就可以严格地限制用户访问某些API。对于您的私有API,您可以生成角色为ADMIN的令牌。然后,每个微服务都可以使用该令牌调用另一个微服务,这样您的API就会很安全。

此外,您可以快速使任何会话无效并在这些会话中存储所需的任何内容。在我们的系统中,spring框架生成一个X-AUTH-TOKEN,可以在标头中设置。令牌指向redis中的会话密钥。这也适用于Cookies(如果我没记错,您甚至可以将此方法与oAuthJWT一起使用)

在干净的体系结构中,您可以创建一个安全模块,该安全模块在API上使用此验证方法,并将其添加到要保护的每个微服务中。

在会话持久化方面还有其他选择。数据库,LDAP,Redis,Hazelcast ...选择取决于您的需求。