javascript - 如何获取 Azure AD OAuth 登录的登录用户配置文件?

标签 javascript microsoft-graph-api azure-ad-b2c azure-ad-msal

JavaScript OAuth2 flow for Azure AD v2 login does not give an access_token 开始,我试图找出要使用的最佳端点,以获取登录用户的详细信息(例如,显示名称、电子邮件等)。

但是,我注意到有 2 个可以使用的潜在端点

  1. https://outlook.office.com/api/v2.0/me
  2. https://graph.microsoft.com/v1.0/me

1,用于 bell for hapijs 并记录在 Use the Outlook REST API 中。然而,在贝尔,我似乎无法弄清楚我需要让它为 OAuth 2.0 工作的范围。我尝试过 openidemailprofileMail.Read (只是尝试这个,因为我见过它在某些文档中)和 User.Read ,但前 3 个范围不会按照 JavaScript OAuth2 flow for Azure AD v2 login does not give an access_token 返回 access_token ,而最后 2 个范围(Mail .ReadUser.Read)给了我一个 access_token,但是当使用 Authorization: 'Bearer [access_token] 调用 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: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b0c3dfddd5f0d5ddd1d9dc9ed3dfdd" rel="noreferrer noopener nofollow">[email protected]</a>',
  businessPhones: [],
  displayName: null,
  jobTitle: null,
  mail: null,
  mobilePhone: null,
  officeLocation: null,
  preferredLanguage: null
}

此处响应的问题是没有明确的电子邮件字段,但我想我可以 just use userPrincipalName (userPrincipalName 也用于 bell Azure AD provider )

所以我的问题是我应该使用哪个端点?或者其他地方还有另一个吗?

最佳答案

您绝对应该使用 Microsoft Graph 来实现此目的以及 /v1.0/me端点是用于检索用户配置文件信息的正确 URI。

至于查找他们的电子邮件地址,您可以提取一些潜在的属性:

  • mail :这是用户的默认 SMTP 地址。如果它显示为空,则表明该值未填充。通常,这是由 Exchange 自动填充的,但根据租户的不同,可能需要手动填充。

  • proxyAddresses :这是与用户关联的地址数组。通常,仅当您需要显示用户的备用电子邮件别名(即 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2b454a464e6b4844465b05484446" rel="noreferrer noopener nofollow">[email protected]</a><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5c3a352e2f28323d313972303d2f28323d31391c3f33312c723f3331" rel="noreferrer noopener nofollow">[email protected]</a> )时才使用此属性。

如果您只想查找非常基本的信息(姓名和电子邮件),您可以使用 OpenID Connect 并完全跳过 Microsoft Graph 调用。 OpenID Connect 支持将用户的配置文件作为配置文件的一部分返回。

要使用 OpenID Connect,您需要对授权请求进行一些更改(即对 https://login.microsoftonline.com/common/oauth2/v2.0/authorize 的初始调用):

  1. response_type必须包括id_token 。 (例如&response_type=id_token+code)
  2. scope必须包括openid , profile ,和email (例如 &scope=openid profile email user.read )。

启用后,您将在访问 token 响应中收到一个名为 id_token 的附加属性。 。此属性包含一个 JSON Web token (JWT),您可以对其进行解码并获取用户的个人资料信息:

作为说明,我使用上述设置从我的测试 Azure AD 实例请求 token 。我获取了该 token 并对其进行了解码(我使用 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": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="81ece0f3e2c1eee7e7e8e2e4e5e4f7afefe8efebe0" rel="noreferrer noopener nofollow">[email protected]</a>",
  "sub": "{masked}",
  "tid": "{masked}",
  "uti": "{masked}",
  "ver": "2.0"
}.[Signature]

关于javascript - 如何获取 Azure AD OAuth 登录的登录用户配置文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49449654/

相关文章:

microsoft-graph-api - 在 OneDrive 图形 api 上为特殊 AppFolder 创建上传 session 时出错

python - Microsoft Graph API CalendarView 请求不起作用

azure - Azure AD B2C 租户和普通 Azure AD 租户有什么区别?

c# - Azure AD B2C 错误 - IDX10501 : Signature validation failed

c# - 将 Azure AD B2C 配置为 AWS API Gateway 授权方

javascript - Babel : SyntaxError: test. jsx:意外 token (3:11)

javascript - AJAX 刷新后按钮不起作用的 Woocommerce 数量增量,并且自动加载仅在点击 2 次后触发

javascript - hogan js 中的复杂迭代逻辑?

microsoft-graph-api - 收到的不仅仅是已删除事件的 ID?

php - 使用按钮使用文本框中的值更新数据库字段,它显示空白值