我目前正在构建一个微服务架构,并从auth服务器和客户端开始。我还想确认使用令牌验证用户的最佳流程。
在上图中。第3步是我开始感到困惑。 我想到了问题的两个解决方案。
每个api都会将令牌传递给auth服务器并等待获得内部存储的令牌与db匹配的批准,并且它仍然有效。
两个是在JWT令牌中包含一个秘密短语,只需让API服务解析并在令牌有效时自行检查。(秘密短语是如果黑客试图伪造令牌并解析它以某种方式,如果没有用于加密令牌的密码,这个短语就会关闭。我甚至不知道是否可能。如果没有,那么我猜2会是最好的行动方案)
答案 0 :(得分:1)
如果黑客不知道签名密钥,则无法创建有效的JWT token
。如果他以某种方式设法获得该签名密钥,则可以合理地假设他也能够获得您的“秘密短语”。
关于检查:JWT tokens
可以检查API service
,因为它们包含所需的所有信息(API服务必须知道的签名密钥除外)。此处也可以检查到期日期。无论如何,您还需要存储在令牌内的信息,例如用户ID。如果你想要更好的可扩展性,你应该这样做。
您需要检查JWT token
与第三个Auth service
的唯一原因是查看它是否已失效;为此,您需要一个集中服务,尽管您可以将无效令牌列表复制到所有API services
以获得更好的弹性。
答案 1 :(得分:1)
您实际上不必将请求转发给Auth-server来验证JWT令牌。 JWT令牌就像票据,一旦签名,任何共享密钥的人都可以对其进行验证。
我建议您在所有API服务前面提供优质服务。边缘服务或者共享由Auth服务签署JWT令牌的密钥,或者具有用于验证签名的公钥。
验证签名后,边缘服务可以从令牌中提取所需信息并将其添加到请求标头。您的下游服务可以根据需要使用此信息。
您可以使用Https强制您的请求不会被网络上的任何人截获。万一,即使有人试图搞砸JWT令牌,签名也不会匹配,你可以检测到。请通过JWT/KONG: Cannot create JWTs with a shared secret了解有关使用公钥 - 私钥创建解析JWT令牌的更多信息。