让用户通过 Microsoft 账号登录

本文档介绍如何使用 Identity Platform 让用户通过 Microsoft 登录。个人 Microsoft 账号和 Azure Active Directory (Azure AD) 账号均受支持。

准备工作

本教程假定您已启用 Identity Platform,并且拥有一个使用 HTML 和 JavaScript 编写的基本 Web 应用。如需了解具体方法,请参阅快速入门

将 Microsoft 配置为提供商

如需将 Microsoft 配置为身份提供商,请执行以下操作:

  1. 前往 Google Cloud 控制台中的身份提供方页面。

    转到“身份提供商”页面

  2. 点击添加提供商

  3. 从列表中选择 Microsoft

  4. 输入您的 Microsoft 应用 ID应用密钥。如果您还没有 ID 和密钥,请按照快速入门:向 Azure AD 2.0 版端点注册应用中的步骤来获取 ID 和密钥。

    此端点同时支持个人 Microsoft 账号和 Azure AD 账号。如需详细了解 Azure AD,请参阅 Microsoft 标识平台(2.0 版)概览

  5. 配置 Microsoft 下列出的 URI 配置为 Microsoft 应用的有效 OAuth 重定向 URI。如果您在 Identity Platform 中配置了自定义网域,请更新 Microsoft 应用配置中的重定向 URI 以使用自定义网域而不是默认网域。例如,将 https://myproject.firebaseapp.com/__/auth/handler 更改为 https://auth.myownpersonaldomain.com/__/auth/handler

  6. 点击已获授权的网域下的添加网域,以注册您应用的网域。出于开发目的,localhost 默认处于启用状态。

  7. 配置您的应用下,点击设置详情。将代码段复制到应用的代码中,以初始化 Identity Platform Client SDK。

  8. 点击保存

让用户通过 Client SDK 登录

  1. 创建 OAuthProvider 对象的实例,并传递 microsoft.com 作为提供商 ID:

    JavaScript

    var provider = new firebase.auth.OAuthProvider('microsoft.com');

  2. 可选:添加 OAuth 范围。范围指定您要从 Microsoft 请求哪些数据。更敏感的数据可能需要特定范围。如需确定您的应用所需的范围,请参阅 Microsoft 文档

    JavaScript

    provider.addScope('mail.read');
    provider.addScope('calendars.read');
    
  3. 可选:指定其他自定义 OAuth 参数。这些参数是针对 Microsoft 的,通常用于自定义身份验证体验。

    JavaScript

    provider.setCustomParameters({
      // Force re-consent.
      prompt: 'consent',
      // Target specific email with login hint.
      login_hint: 'user@firstadd.onmicrosoft.com'
    });
    

    您可以使用 mkt 参数来自定义身份验证流程的语言。例如:

    provider.setCustomParameters({
      mkt: 'fr'
    });
    

    您可以使用 tenant 属性限制特定 Azure AD 网域外部的用户访问权限。指定租户的易记域名或它的 GUID 标识符。不在该网域内的用户将无法登录。例如:

    provider.setCustomParameters({
      // Optional "tenant" parameter in case you are using an Azure AD tenant.
      // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com'
      // or "common" for tenant-independent tokens.
      // The default value is "common".
      tenant: 'TENANT_ID'
    });
    

    如需查看 Microsoft 支持的参数的完整列表,请参阅 Microsoft OAuth 文档。请注意,您不能传递 OAuth 或 Identity Platform 预留的参数。

  4. 使用 OAuthProvider 对象让用户登录。您可以打开一个弹出式窗口,也可以重定向当前网页。对于移动设备用户而言,重定向更为便捷。

    如需显示弹出式窗口,请调用 signInWithPopup()

    JavaScript

    firebase.auth().signInWithPopup(provider)
      .then((result) => {
        // IdP data available in result.additionalUserInfo.profile.
        // ...
    
        /** @type {firebase.auth.OAuthCredential} */
        var credential = result.credential;
    
        // OAuth access and id tokens can also be retrieved:
        var accessToken = credential.accessToken;
        var idToken = credential.idToken;
      })
      .catch((error) => {
        // Handle error.
      });

    如需重定向页面,请先调用 signInWithRedirect()

    使用 signInWithRedirectlinkWithRedirectreauthenticateWithRedirect 时,请遵循最佳实践

    JavaScript

    firebase.auth().signInWithRedirect(provider);

    然后,在网页加载时调用 getRedirectResult() 来检索 Microsoft 令牌:

    JavaScript

    firebase.auth().getRedirectResult()
      .then((result) => {
        // IdP data available in result.additionalUserInfo.profile.
        // ...
    
        /** @type {firebase.auth.OAuthCredential} */
        var credential = result.credential;
    
        // OAuth access and id tokens can also be retrieved:
        var accessToken = credential.accessToken;
        var idToken = credential.idToken;
      })
      .catch((error) => {
        // Handle error.
      });

获得访问令牌后,您就可以使用它来调用 Microsoft Graph API。例如:

REST

curl -i -H "Authorization: Bearer [ACCESS_TOKEN]" https://graph.microsoft.com/v1.0/me

与 Identity Platform 支持的其他提供商不同,Microsoft 不提供用户的照片网址。您需要改为使用 Graph API 来请求照片的二进制数据。

除了访问令牌,您还可以检索用户的 Microsoft ID 令牌。此令牌上的 oid 声明包含用户的唯一 ID。您可以将此 ID 与位于 user.providerData[0].uid 的 ID 进行比较。如果您的用户使用 Azure AD 租户登录,则这些字段将完全匹配。否则,该字段将用零填充(例如,联合 ID 4b2eabcdefghijkl 将显示为 00000000-0000-0000-4b2e-abcdefghijkl)。

请勿使用 sub 声明来比较用户 ID。sub 声明取决于具体应用,该声明与 Microsoft 使用的 ID 不匹配。

手动让用户登录

一些其他 Identity Platform 提供商(例如 GoogleFacebookTwitter)允许您通过调用 signInWithCredential() 手动让用户登录。

Microsoft 不支持此功能。Identity Platform 无法验证 Microsoft OAuth 访问令牌的受众,这是一项关键的安全要求。

如果您无法使用 Identity Platform Client SDK 让用户登录,则需要使用第三方 OAuth 库进行 Microsoft 身份验证。然后,您可以使用自定义身份验证将 Microsoft 凭据交换为自定义令牌。

后续步骤