如何获取 Azure AD OAuth 登录的登录用户配置文件?
How do I get the logged in users profile for Azure AD OAuth logins?
从 开始,我正在尝试找出最好的端点来获取登录用户的详细信息(例如,显示名称、电子邮件等)。
但是,我注意到我可以使用 2 个潜在端点
1,在 bell for hapijs 中使用,并记录在 Use the Outlook REST API 中。但是,在贝尔,我似乎无法弄清楚 scope
我需要让它为 OAuth 2.0 工作。我试过 openid
、email
、profile
、Mail.Read
(只是尝试这个,因为我在一些文档中看到过)和 User.Read
,但是前 3 个范围不会根据 ,并且最后 2 个(Mail.Read
和 User.Read
)给我一个 access_token
,但是当用 Authorization: 'Bearer [access_token]
.[=32= 调用 https://outlook.office.com/api/v2.0/me 时,它们给我身份验证问题]
我在 Microsoft Graph: Get user 找到了 2 的端点,它似乎适用于 User.Read
范围。我使用返回的 access_token
得到以下响应:
{
'@odata.context': 'https://graph.microsoft.com/v1.0/$metadata#users/$entity',
id: '60...',
userPrincipalName: 'some@email.com',
businessPhones: [],
displayName: null,
jobTitle: null,
mail: null,
mobilePhone: null,
officeLocation: null,
preferredLanguage: null
}
此处响应的问题是没有明确的电子邮件字段,但我想我可以 just use userPrincipalName
(the userPrincipalName
is also used for the bell Azure AD provider)
所以我的问题是我应该使用哪个端点?还是别的地方还有一个?
您绝对应该为此使用 Microsoft Graph,并且 /v1.0/me
端点是用于检索用户个人资料信息的正确 URI。
至于查找他们的电子邮件地址,您可以提取一些潜在属性:
mail
:这是用户的默认 SMTP 地址。如果它显示为 null,则表明该值未被填充。通常这由 Exchange 自动填充,但根据租户的不同,可能需要手动填充。
proxyAddresses
:这是与用户关联的地址数组。通常,只有在需要显示用户的备用电子邮件别名(即 name@comp.com
和 firstname.lastname@comp.com
)时才使用此 属性。
如果您只是寻找非常基本的信息(姓名和电子邮件),您可以使用 OpenID Connect 并完全跳过 Microsoft Graph 调用。 OpenID Connect 支持将用户的配置文件作为配置文件的一部分返回。
要使用 OpenID Connect,您需要对您的授权请求进行一些更改(即对 https://login.microsoftonline.com/common/oauth2/v2.0/authorize
的初始调用):
response_type
必须包含 id_token
。 (例如 &response_type=id_token+code
)
scope
必须包括 openid
、profile
和 email
(例如 &scope=openid profile email user.read
)。
启用后,您将在名为 id_token
的访问令牌响应中收到一个额外的 属性。此 属性 包含一个 JSON Web 令牌 (JWT),您可以对其进行解码并获取用户的个人资料信息:
作为示例,我使用上面的设置从我的测试 Azure AD 实例请求令牌。我拿走了那个令牌并对其进行解码(我使用 http://jwt.ms/ 但 JWT 解码器可以工作)以获取 OpenID Connect 配置文件:
{
"typ": "JWT",
"alg": "RS256",
"kid": "{masked}"
}.{
"aud": "{masked}",
"iss": "https://login.microsoftonline.com/{masked}/v2.0",
"iat": 1521825998,
"nbf": 1521825998,
"exp": 1521829898,
"name": "Marc LaFleur",
"nonce": "a3f6250a-713f-4098-98c4-8586b0ec084d",
"oid": "f3cf77fe-17b6-4bb6-8055-6aa084df7d66",
"preferred_username": "marc@officedev.ninja",
"sub": "{masked}",
"tid": "{masked}",
"uti": "{masked}",
"ver": "2.0"
}.[Signature]
ID 令牌和访问令牌可以 return 显示名称、电子邮件等属性
请参阅此处 "Select Application claims":Azure Active Directory B2C: Built-in policies
Select Application claims. Choose claims you want returned in the authorization tokens sent back to your application after a successful sign-up or sign-in experience. For example, select Display Name, Identity Provider, Postal Code, User is new and User's Object ID.
从
但是,我注意到我可以使用 2 个潜在端点
1,在 bell for hapijs 中使用,并记录在 Use the Outlook REST API 中。但是,在贝尔,我似乎无法弄清楚 我在 Microsoft Graph: Get user 找到了 2 的端点,它似乎适用于 此处响应的问题是没有明确的电子邮件字段,但我想我可以 just use 所以我的问题是我应该使用哪个端点?还是别的地方还有一个?scope
我需要让它为 OAuth 2.0 工作。我试过 openid
、email
、profile
、Mail.Read
(只是尝试这个,因为我在一些文档中看到过)和 User.Read
,但是前 3 个范围不会根据 Mail.Read
和 User.Read
)给我一个 access_token
,但是当用 Authorization: 'Bearer [access_token]
.[=32= 调用 https://outlook.office.com/api/v2.0/me 时,它们给我身份验证问题]
User.Read
范围。我使用返回的 access_token
得到以下响应:{
'@odata.context': 'https://graph.microsoft.com/v1.0/$metadata#users/$entity',
id: '60...',
userPrincipalName: 'some@email.com',
businessPhones: [],
displayName: null,
jobTitle: null,
mail: null,
mobilePhone: null,
officeLocation: null,
preferredLanguage: null
}
userPrincipalName
(the userPrincipalName
is also used for the bell Azure AD provider)
您绝对应该为此使用 Microsoft Graph,并且 /v1.0/me
端点是用于检索用户个人资料信息的正确 URI。
至于查找他们的电子邮件地址,您可以提取一些潜在属性:
mail
:这是用户的默认 SMTP 地址。如果它显示为 null,则表明该值未被填充。通常这由 Exchange 自动填充,但根据租户的不同,可能需要手动填充。proxyAddresses
:这是与用户关联的地址数组。通常,只有在需要显示用户的备用电子邮件别名(即name@comp.com
和firstname.lastname@comp.com
)时才使用此 属性。
如果您只是寻找非常基本的信息(姓名和电子邮件),您可以使用 OpenID Connect 并完全跳过 Microsoft Graph 调用。 OpenID Connect 支持将用户的配置文件作为配置文件的一部分返回。
要使用 OpenID Connect,您需要对您的授权请求进行一些更改(即对 https://login.microsoftonline.com/common/oauth2/v2.0/authorize
的初始调用):
response_type
必须包含id_token
。 (例如&response_type=id_token+code
)scope
必须包括openid
、profile
和email
(例如&scope=openid profile email user.read
)。
启用后,您将在名为 id_token
的访问令牌响应中收到一个额外的 属性。此 属性 包含一个 JSON Web 令牌 (JWT),您可以对其进行解码并获取用户的个人资料信息:
作为示例,我使用上面的设置从我的测试 Azure AD 实例请求令牌。我拿走了那个令牌并对其进行解码(我使用 http://jwt.ms/ 但 JWT 解码器可以工作)以获取 OpenID Connect 配置文件:
{
"typ": "JWT",
"alg": "RS256",
"kid": "{masked}"
}.{
"aud": "{masked}",
"iss": "https://login.microsoftonline.com/{masked}/v2.0",
"iat": 1521825998,
"nbf": 1521825998,
"exp": 1521829898,
"name": "Marc LaFleur",
"nonce": "a3f6250a-713f-4098-98c4-8586b0ec084d",
"oid": "f3cf77fe-17b6-4bb6-8055-6aa084df7d66",
"preferred_username": "marc@officedev.ninja",
"sub": "{masked}",
"tid": "{masked}",
"uti": "{masked}",
"ver": "2.0"
}.[Signature]
ID 令牌和访问令牌可以 return 显示名称、电子邮件等属性
请参阅此处 "Select Application claims":Azure Active Directory B2C: Built-in policies
Select Application claims. Choose claims you want returned in the authorization tokens sent back to your application after a successful sign-up or sign-in experience. For example, select Display Name, Identity Provider, Postal Code, User is new and User's Object ID.