假设我们有一些我们想要公开其资源的RESTful API。最终用户将通过客户端应用程序(如移动应用程序和在Web浏览器上运行的基于Javascript的客户端)使用此API。
使用OAuth 2.0,这个RESTful API将位于资源服务器上,我们将拥有一个注册客户端应用程序的授权服务器。然后,用户将在授权服务器上注册,并能够授予这些应用程序代表他们访问资源的权限。
因此,当用户访问一个客户端应用程序时,他将被重定向到授权服务器,并被提示授予所述客户端应用程序的权限。之后,将发出访问令牌,客户端可以向资源服务器发出请求。
所有这些对我来说都很清楚。只有一个缺失的部分:每个资源的保护可能取决于用户。更确切地说,它可能是依赖于声明的。我的意思是我们可以有以下情况:
只有具有声明权限的用户才能访问资源http://resourceserver.com/api/first-resource" ExampleClaim"价值123。
资源http://resourceserver.com/api/second-resource只有具有声明权限的用户才能访问" AnotherClaim"价值123。
任何用户都可以访问资源http://resourceserver.com/api/third-resource。
当我第一次听说OAuth正在处理ASP.NET WebAPI时,我用以下方式解决了这个问题:当请求与Authorization: Bearer [token]
标头一起发送时,在服务器端,线程主体已经设置了,我认为这意味着用户通过API进行了身份验证。所以我使用[Authorize]
属性来验证用户是否可以访问资源。
在深入研究OAuth之后,我发现这是对协议的可怕滥用。正如我所了解的那样,OAuth授权应用程序而不是用户。当使用Authorization标头发出请求时,正如我所了解的那样,访问令牌不应包含有关用户的信息,而是包含允许发出请求的应用程序。
考虑到这一点,发送带有请求的Authorization标头并不能识别用户,也不会说用户是否可以访问所述资源。
在这种情况下,如何执行此类授权?我的意思是,不是授权执行请求的客户端应用程序,而是根据其声明访问资源的用户的授权?我相信这是OpenID Connect及其ID令牌的用武之地,但我不确定。如何管理这个?
答案 0 :(得分:2)
你是对的,OAuth是NOT an authentication protocol,而是代表协议。
OpenID Connect为OAuth 2.0的令牌发布模型添加了两个值得注意的身份构造。
身份令牌 - 从一方到另一方的交付 可以启用联合身份SSO用户体验
标准化身份属性API - 客户可以在其中 检索给定用户的所需身份属性。
可以将ID TOken呈现给userinfo_endpoint以获取信息,并提供用户已通过OpenID提供商进行身份验证的保证级别。
BTW:" sub"即仅在授权服务器的上下文中唯一。建议如果你存储sub,你也存储像iss-sub这样的东西。谷歌的想法可能不是推特上的tsmith