我一直在深入挖掘OAuth2 / OpenID Connect(OIDC),并且在很多方面我感觉更聪明,但在很多方面,我担心一个简单的错误会让我变得脆弱。我正在构建超标准的商业应用程序。所以是时候问路了:
openid
范围验证代码授予我得到了id_token
,access_token
和refresh_token
我有一百万个问题,但让我们从基础开始:
id_token
并将其发送到浏览器中的反应代码并将其存储在会话存储中?否则,UI究竟如何知道有关登录人员的信息?id_token
,我还关心/userinfo
终点吗?我的猜测是否定的。/oauth/token
? Spring代码应该(或者是否)缓存auth代码和返回的令牌之间的关系?你只问openid
范围,为什么你需要访问和刷新令牌?并且由于您希望React应用程序使用ID令牌,我建议您使用Implicit流程 - 将ID令牌直接提供给您的前端。
/userinfo
端点没有提供您想要的任何其他信息,您可以忽略它。/userinfo
端点来获取有关用户的信息。或者,如果要将前端和后端视为一个OAuth2客户端(相同的ID令牌受众),并且后端需要用户身份,则可以使用ID令牌。SPA的推荐流程是implicit
,使用oidc-client-js
库是有意义的。在此流程中,access_token
直接返回给客户端,无需额外的授权代码步骤。没有发布refresh_token
。
在此拓扑中,令牌存储在sessionStorage的客户端(默认情况下,但这是可插入的),并通过在Authorization标头中传递access_token
(通常)来向后端发出请求。令牌更新不是通过刷新令牌完成的,而是通过后台静默授权端点调用自动完成的。这种方法的缺点是,如果您的应用程序通过XSS受到攻击,那么攻击者可立即使用您的令牌。
但是,如果您更乐意使用服务器端流程(具有表单发布响应类型的混合)和(仅https)cookie身份验证,那么您可以。客户端代码只需要实现某种CSRF缓解,但根本不需要了解OpenID Connect问题。