微服务中的身份验证和授权

4
最近我一直在阅读关于微服务的文章,特别是有关AuthN和AuthZ方面的内容。总的来说,这些都很有道理,我也能够理解它们的工作原理。
对于我所涉及的部分,我正在使用委托授权 - 所以我将从客户端传递令牌到服务,并将相同的令牌从一个服务传递到另一个服务。我还在OAuth2服务上有一个端点,可以接受一个令牌并返回令牌的详细信息 - 用户ID,有效期的开始和结束时间,令牌有效的范围等。
我遇到的问题是 - 为了正确发放令牌,需要与用户服务进行一些通信,以确保令牌所代表的用户是有效的。而要验证令牌,需要与用户服务进行一些通信,以确保该用户仍然有效。但是,为了安全地与用户服务通信以获取有关用户的详细信息,需要一个令牌来授权访问。
我假设有一些标准做法来解决OAuth2和用户服务之间的这种循环依赖性,但我没有看到任何提到它的内容。这是常见的问题吗?或者我漏掉了什么显而易见的东西?
(请注意 - 目前我只实现了客户端证书授予和资源所有者密码证书授予,因为我只是在玩耍看看它们如何工作,并且使用cURL更容易调用。但我不知道这是否有任何区别)
1个回答

2

是的,这有点鸡生蛋的问题。不确定您对授权服务器有多少控制权,但解决此问题的一种方法是使用客户端证书来保护对用户信息服务的调用。

另一种方法是将用户信息服务和授权服务器合并为一个服务,从而消除了对调用的需求。


如果您掌控了双方,当然也可以让您的授权服务器为自己生成一个令牌来调用用户信息服务。 - MvdD
所以 - 客户端调用OAuth,OAuth生成一个短期令牌并使用它来调用用户服务,用户服务然后回调OAuth以验证令牌,OAuth隐式信任它并让其通过,然后用户服务继续执行工作。我有点喜欢这个。还有一些更精细的授权问题,但也不算太糟糕... - Graham
只有每个服务都拥有签名密钥的副本,否则任何第三方都可以生成一个有效的令牌。 - Graham
不,数字签名使用非对称加密。授权服务器使用其私钥对令牌进行签名,接受令牌的服务只需要公钥来验证签名。公钥可以提供给任何人,因为它只允许某人验证签名,而不是签名。 - MvdD
事实上,如果我从未将JWT令牌用于外部世界,那么我始终可以隐式地信任有效的JWT令牌,而无需进行检查。发放给外部客户的令牌可以是引用令牌,需要进行验证,但这样做可以为同一会话发行计为预验证的JWT令牌。我喜欢这个... - Graham
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接