让用户通过 Microsoft 账号登录
本文档介绍如何使用 Identity Platform 让用户通过 Microsoft 登录。个人 Microsoft 账号和 Azure Active Directory (Azure AD) 账号均受支持。
准备工作
本教程假定您已启用 Identity Platform,并且拥有一个使用 HTML 和 JavaScript 编写的基本 Web 应用。如需了解具体方法,请参阅快速入门。
将 Microsoft 配置为提供商
如需将 Microsoft 配置为身份提供商,请执行以下操作:
转到 Google Cloud 控制台中的 Identity Providers(身份提供商)页面。
点击添加提供商。
从列表中选择 Microsoft。
输入您的 Microsoft 应用 ID 和应用密钥。如果 如果您还没有 ID 和密钥,请按照 快速入门:使用 Azure AD v2.0 端点注册应用 获取一个。
此端点同时支持个人 Microsoft 账号和 Azure AD 账号。请参阅 Microsoft Identity Platform (v2.0) 概览 来详细了解 Azure AD
将配置 Microsoft 下列出的 URI 配置为有效的 OAuth Microsoft 应用的重定向 URI。如果您在 Identity Platform 中配置了自定义网域, 请更新 Microsoft 应用配置中的重定向 URI,以改用自定义网域 默认网域的例如,将
https://myproject.firebaseapp.com/__/auth/handler
更改为https://auth.myownpersonaldomain.com/__/auth/handler
。点击已获授权的网域下的添加网域,以注册您应用的网域。出于开发目的,
localhost
默认处于启用状态。在配置您的应用下,点击设置详情。将代码段复制到应用的代码中,以初始化 Identity Platform Client SDK。
点击保存。
让用户通过 Client SDK 登录
创建
OAuthProvider
对象的实例,并传递microsoft.com
作为提供商 ID:JavaScript
var provider = new firebase.auth.OAuthProvider('microsoft.com');
可选:添加 OAuth 范围。范围指定您要从 Microsoft 请求哪些数据。更敏感的数据可能需要特定范围。请咨询 Microsoft 的 文档 从而确定您的应用所需的作用域
JavaScript
provider.addScope('mail.read'); provider.addScope('calendars.read');
可选:指定其他自定义 OAuth 参数。这些参数是针对 Microsoft 的,通常用于自定义身份验证体验。
JavaScript
provider.setCustomParameters({ // Force re-consent. prompt: 'consent', // Target specific email with login hint. login_hint: '[email protected]' });
您可以使用
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 OAuth 文档 获取 Microsoft 支持的参数的完整列表。请注意,您不能传递 OAuth 或 Identity Platform 预留的参数。
使用
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()
:使用
signInWithRedirect
、linkWithRedirect
或reauthenticateWithRedirect
时,请遵循最佳实践。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 提供商(例如 Google、Facebook、Twitter)允许您通过调用 signInWithCredential()
手动让用户登录。
Microsoft 不支持此功能。Identity Platform 无法验证 Microsoft OAuth 访问令牌的受众,这是一项关键的安全要求。
如果您无法使用 Identity Platform Client SDK 让用户登录,则需要使用第三方 OAuth 库进行 Microsoft 身份验证。然后,您可以使用自定义身份验证将 Microsoft 凭据交换为自定义令牌。
后续步骤
- 详细了解 Identity Platform 用户。
- 让用户通过其他身份提供商登录。