openid-connect - 我们应该比较 Access Token 和 ID Token 中的“sub”声明吗?
问题描述
如果我们在 OIDC 流程中获得 Id 令牌和访问令牌,如下所示:
标识令牌:
{
"iss": "https://server.example.com",
"sub": "24400320",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"auth_time": 1311280969,
"acr": "urn:mace:incommon:iap:silver"
"amr": ["mfa", "pwd","otp"]
}
访问令牌:
{
"iss": "https://cas.nhs.uk",
"sub": "https://fhir.nhs.uk/Id/sds-role-profile-id"|[SDSRoleProfileID]",
"aud": "https://provider.thirdparty.nhs.uk/GP0001/STU3/1",
"exp": 1469436987,
"iat": 1469436687,
"reason_for_request": "directcare",
"requested_scope": "patient/*.read",
"requesting_system": "https://fhir.nhs.uk/Id/accredited-system|[ASID]",
"requesting_organization": "https://fhir.nhs.uk/Id/ods-organization-code|[ODSCode]",
"requesting_user": "https://fhir.nhs.uk/Id/sds-role-profile-id"|[SDSRoleProfileID]"
}
来自 Id 令牌的“sub”声明应该与 Access 令牌中的“sub”声明匹配是否是一个有效的假设?还是它们都是单独的表示?
我们是否甚至在资源服务器上执行此类验证以确保它们都形成一对并针对同一个用户会话发出?
解决方案
根据 Okta 的文档,默认情况下,访问令牌中的“子”声明是Okta中的用户 ID(如果使用具有可用用户范围的 OAuth 流,如授权代码流)或应用程序的客户端 ID(如果使用客户端凭证流)在 Okta 中。但是,如果您使用的是自定义授权服务器,则可以配置 'sub' 的值。
同样,ID 令牌中的“sub”声明将是 Okta 中的用户 ID。与访问令牌不同,此值不能修改,因为OIDC 标准要求此值在发行者内是本地唯一的。
为什么您的资源服务器会与 ID 令牌交互?ID 令牌用于身份验证用例,而访问令牌用于授权用例,如下所述:https ://developer.okta.com/docs/guides/validate-access-tokens/go/overview/#access-令牌-vs-id-令牌。如果您希望使用 OAuth 令牌保护资源服务器,您将需要依赖访问令牌。
推荐阅读
- python - 迭代和修改目录中的文件
- angular - 为什么 mat-tables matRowDef 包含 2 个变量?
- c# - 获取字典列表中类型的属性
- c++ - 指针相关的 UE4 崩溃。我的指针哪里错了?
- php - Manticore - sphinxQL GROUP BY 重复分组 id
- cypress - 在 Cypress 中针对不同来源的两次测试运行之间共享数据的方法
- r - 如何安装许多 R 包?
- powerbi - PowerBI DAX – 同一张表的子查询
- python - 无法使用 virtualenv 或 pipenv 创建虚拟环境
- javascript - 如何使用异步制作自己的等待功能