首页 > 解决方案 > 我们应该比较 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”声明匹配是否是一个有效的假设?还是它们都是单独的表示?

我们是否甚至在资源服务器上执行此类验证以确保它们都形成一对并针对同一个用户会话发出?

标签: openid-connectaccess-tokenpingoktaisam

解决方案


根据 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 令牌保护资源服务器,您将需要依赖访问令牌。


推荐阅读