我目前正在学习OAuth2,我学习了两门不同的课程,没有一门课程回答了OAuth应该如何在微服务世界中实现。
假设有一个用户注册后上传照片的应用程序。我会让用户登录到Facebook和谷歌的应用程序。应用程序将通过:
- iOS应用程序
- Android应用程序
- 浏览器(单Angular 页面应用程序)
在后端有很多Spring Boot/Node. js/任何需要授权的REST API的微服务。因为我想让用户用标准的注册表单注册,我想我也需要自己的授权服务器。
在这种情况下,我对流程中OAuth角色的理解是:
- 资源所有者**是应用程序用户
- 客户端**是移动应用程序或Angular 应用程序
- 授权服务器**是Google服务器或Facebook服务器或我们的内部服务器
- 资源服务器**是公开API的微服务,对吗?
假设有一个用户试图通过浏览器登录我的Facebook应用程序。他通过了OAuth过程,客户端(iOS应用程序)最终获得了访问令牌。
1.我的上述假设都正确吗?
1.* * 客户端是否应该将访问令牌保存在内存中并将其传递给每个API请求?我想不应该。关闭浏览器就足以失去会话。如果不应该-客户端应该使用什么来授权API调用?
1.如果后端服务公开API接收到带有访问令牌的请求,它是否应该在接收到请求时询问外部授权服务器它是否有效?听起来像是矫枉过正,所以我想不应该。如果不应该-它应该如何验证给定的访问令牌**是否有效?
- AFAIK不建议使用ID令牌对API请求进行授权。访问令牌已为此设计。如果是,后端服务应如何标识实际上谁是代表其发出请求的身份?它是否应在收到请求时调用授权服务器上的
/userinfo
端点?同样,听起来有点过头,所以我想不是。如果不是-服务应该如何知道代表谁给出的请求已经完成?
希望我的问题和疑问是有意义和可以理解的。
最好的问候!
2条答案
按热度按时间56lgkhnf1#
您对OAuth2参与者的理解是正确的,这是一个很好的起点。
客户端应该使用certified OpenID client libs来处理OAuth2流和请求授权(这应该可以解决您关于客户端上令牌处理的问题)。
作为授权服务器,使用能够进行身份联合的OIDC实现。您可以选择“内部部署”解决方案(如Keycloak)或SaaS解决方案(如Auth0、Amazon Cognito等)。所有这些解决方案都具有“社交登录”功能,可以轻松登录Facebook。谷歌和其他一些网站。你选择的授权服务器将是你的客户端和资源服务器的唯一服务器(它将代理Google和Facebook授权服务器)。
对于验证,您可以选择使用可以自我验证的JWT访问令牌(内容经过签名,并且可以从授权服务器检索所有令牌的公共签名密钥)。
最后,访问令牌有一个
sub
(subject)声明,这是一个唯一的标识符。此外,您应该能够使用任何访问控制决策所需的私有声明来丰富访问令牌。如何添加此类声明取决于您选择的授权服务器,如何使用它来进行访问控制决策取决于您的资源服务器安全框架。您可以查看my tutorials,它基于私有声明在Spring资源服务器中实现高级访问控制。在这个other project中,我定义了一个Keycloak mapper来向访问令牌添加私有声明。我已经使用Auth0定义了私有声明,但没有公共源代码。
rhfm7lfc2#
如果我读得很好(--不太累),那么关于“我对吗?",是的--你的假设听起来是正确的。
OIDC(和下面的OAuth)是I.M.H.O.(两者)一个复杂的主题。
是的,客户端应该为每个(&每个)资源服务器/端点调用(-需要授权的地方)传递访问(/bearer)令牌(通过HTTP 'Authorization'报头)。
您可以检查一些方面来查看令牌是否有效--但是一些语言/框架/包提供了简化验证过程/步骤的规定(例如,C#/.NET有一个NuGet包提供了这一点)。
大多数OP(OIDC提供程序)都可以配置为在授权调用过程中返回访问令牌和id(实体)令牌(例如,作为“授权代码”流的一部分)。因此,您不必主动/单独调用(OIDC)“userinfo”端点。
为了增加安全性,请尝试使用“pixie”/PKCE(代码交换验证密钥)。
(Hope这有助于澄清一些要点/不确定性。)