为什么我不应该在IDP上下文中将IdToken用作承载令牌?

问题描述

我正在使用IDP平台(此处为AWS Cognito,但可以是Auth0,OKTA或Keycloak),我想知道为什么不鼓励使用ID Token作为授权令牌。

更具体地说,我将不会使用具有从用户到第三方应用程序的授权委派的资源服务器。我的IDP只允许我对不同应用程序上的所有用户进行SSO。这里没有授予权限的范围,只有每个服务将用于授予或拒绝对资源(例如电子邮件用户ID或角色)的访问的身份验证声明。

我知道我可以向我的应用提供id token,然后为我的用户创建一些会话。考虑到可以在每个应用程序的后端检查其签名,为什么不应该将id token本身用作无状态会话令牌?

如果我应该access token上使用id token-我可以用角色替换范围吗?或者我应该如何理解非授权上下文中的作用域(用户自己使用应用程序,不授予许可”与“用户将所有作用域提供给本身就是应用程序的SPA前端” )

顺便说一句,我正在通过前端的代码PKCE流恢复令牌。

解决方法

ID令牌仅包含有关用户以及用户认证方式的详细信息。因此非常适合与用户创建更持久的Cookie会话。和ID令牌的默认生存期也很短,例如分钟。建立sesson后,通常会丢掉id令牌。您永远不要将ID令牌传递给其他服务。

访问令牌的意思是使您能够访问该令牌旨在用于的API。

用户登录时,您要求访问某些范围,并且用户选择(同意)该范围,然后将其包含在访问令牌中(作为范围和受众声明)。

理论上,您可以将ID令牌传递给API,而不是它应该如何工作。 有关更多详细信息,请参见thisthis