【发布时间】:2019-03-23 10:04:31
【问题描述】:
我正在使用资源所有者密码授权流程并请求 id 令牌(scope 包括 openid)。我将以下内容发送到端点:
-
client_id -
client_secret -
grant_type=password -
username -
password scope
在响应中,我得到了访问令牌和 id 令牌。 sub 声明的值在两个令牌之间是不同的。为什么会这样?
更新
似乎用户 id 实际上是 oid 声明。这在Azure AD ID token reference 中有描述。
描述oid 声明的文字:
Microsoft 身份系统中对象的不可变标识符,在本例中为用户帐户。此 ID 在应用程序中唯一标识用户 - 登录同一用户的两个不同应用程序将在
oid声明中收到相同的值。 Microsoft Graph 会将此 ID 作为给定用户帐户的id属性返回。因为oid允许多个应用关联用户,所以需要profile范围才能接收此声明。请注意,如果单个用户存在于多个租户中,则该用户将在每个租户中包含不同的对象 ID - 它们被视为不同的帐户,即使用户使用相同的凭据登录每个帐户。
描述sub 声明的文字:
令牌断言信息的主体,例如应用程序的用户。此值是不可变的,不能重新分配或重用。主题是成对的标识符 - 它对于特定的应用程序 ID 是唯一的。因此,如果单个用户使用两个不同的客户端 ID 登录两个不同的应用程序,这些应用程序将收到两个不同的主题声明值。这可能需要也可能不需要,具体取决于您的架构和隐私要求。
但是,我仍然不清楚为什么 sub 声明在访问令牌和 id 令牌之间是不同的。
【问题讨论】:
-
嗯,Id 令牌适用于您的应用程序,即 sub 声明对于您的应用程序是唯一的。并且访问令牌适用于您正在调用的某些 API,因此 sub 声明在其中是唯一的。您可以将其中任何一个用作用户的不可变标识符,但如果您想在例如引用用户时需要 oid MS 图形 API。
标签: oauth-2.0 azure-active-directory openid-connect