您可以将 Facebook 登录服务集成到您的应用中,让您的用户能够使用自己的 Facebook 帐号进行 Firebase 身份验证。集成 Facebook 登录的方法有两种:使用 Firebase SDK 执行登录流程;手动执行 Facebook 登录流程,并将生成的访问令牌传递给 Firebase。
准备工作
- 将 Firebase 添加至您的 JavaScript 项目。
- 在 Facebook for Developers 网站上,为您的应用获取应用 ID 和应用密钥。
- 启用 Facebook 登录机制:
- 在 Firebase 控制台中,打开 Auth 部分。
- 在Sign-in method(登录方法)标签页中,启用 Facebook 登录方法,并指定您之前从 Facebook 获得的应用 ID 和应用密钥。
- 然后,请务必转到 Facebook for Developers 网站,依次点击产品设置 (Product Settings) > Facebook 登录 (Facebook Login) 配置,然后在您的 Facebook 应用的设置页面中,确保您的 OAuth 重定向 URI(例如
my-app-12345.firebaseapp.com/__/auth/handler
)出现在 OAuth 重定向 URI (OAuth redirect URIs) 列表中。
使用 Firebase SDK 处理登录流程
如果您是在构建 Web 应用,想要通过用户的 Facebook 帐号对其进行 Firebase 身份验证,最简单的方法是使用 Firebase JavaScript SDK 来处理登录流程。(如果您希望在 Node.js 或其他非浏览器环境中对用户进行身份验证,则必须手动处理登录流程)。
如需使用 Firebase JavaScript SDK 处理登录流程,请按以下步骤操作:
- 创建 Facebook 提供方对象实例:
Web version 9
import { FacebookAuthProvider } from "firebase/auth"; const provider = new FacebookAuthProvider();
Web version 8
var provider = new firebase.auth.FacebookAuthProvider();
- 可选:指定您希望向身份验证提供方申请的额外 OAuth 2.0 范围。如需添加范围,请调用
addScope
。例如:Web version 9
provider.addScope('user_birthday');
Web version 8
provider.addScope('user_birthday');
- 可选:如需在无需明确传递相关自定义 OAuth 参数的情况下将提供方的 OAuth 流程本地化为用户偏好的语言,请在启动 OAuth 流程之前先更新 Auth 实例中的语言代码。例如:
Web version 9
import { getAuth } from "firebase/auth"; const auth = getAuth(); auth.languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // firebase.auth().useDeviceLanguage();
Web version 8
firebase.auth().languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // firebase.auth().useDeviceLanguage();
- 可选:指定您希望通过 OAuth 请求发送的其他自定义 OAuth 提供方参数。如需添加自定义参数,请使用包含 OAuth 提供方文档中指定的键及相应值的对象,调用已初始化的提供方的
setCustomParameters
方法。例如:Web version 9
provider.setCustomParameters({ 'display': 'popup' });
Web version 8
provider.setCustomParameters({ 'display': 'popup' });
- 使用 Facebook 提供方对象进行 Firebase 身份验证。您可以通过弹出式窗口或重定向至登录页面,提示用户使用自己的 Facebook 帐号登录。在移动设备上最好使用重定向方法。
- 如需使用弹出式窗口登录,请调用
signInWithPopup
:Web version 9
import { getAuth, signInWithPopup, FacebookAuthProvider } from "firebase/auth"; const auth = getAuth(); signInWithPopup(auth, provider) .then((result) => { // The signed-in user info. const user = result.user; // This gives you a Facebook Access Token. You can use it to access the Facebook API. const credential = FacebookAuthProvider.credentialFromResult(result); const accessToken = credential.accessToken; // ... }) .catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; // The email of the user's account used. const email = error.customData.email; // The AuthCredential type that was used. const credential = FacebookAuthProvider.credentialFromError(error); // ... });
Web version 8
firebase .auth() .signInWithPopup(provider) .then((result) => { /** @type {firebase.auth.OAuthCredential} */ var credential = result.credential; // The signed-in user info. var user = result.user; // This gives you a Facebook Access Token. You can use it to access the Facebook API. var accessToken = credential.accessToken; // ... }) .catch((error) => { // Handle Errors here. var errorCode = error.code; var errorMessage = error.message; // The email of the user's account used. var email = error.email; // The firebase.auth.AuthCredential type that was used. var credential = error.credential; // ... });
您还可以在此处捕捉并处理错误。如需获取错误代码列表,请参阅身份验证参考文档。
- 如需通过重定向到登录页面进行登录,请调用
signInWithRedirect
:Web version 9
import { getAuth, signInWithRedirect } from "firebase/auth"; const auth = getAuth(); signInWithRedirect(auth, provider);
Web version 8
firebase.auth().signInWithRedirect(provider);
getRedirectResult
来检索 Facebook 提供方的 OAuth 令牌:Web version 9
import { getAuth, getRedirectResult, FacebookAuthProvider } from "firebase/auth"; const auth = getAuth(); getRedirectResult(auth) .then((result) => { // This gives you a Facebook Access Token. You can use it to access the Facebook API. const credential = FacebookAuthProvider.credentialFromResult(result); const token = credential.accessToken; const user = result.user; }).catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; // The email of the user's account used. const email = error.customData.email; // AuthCredential type that was used. const credential = FacebookAuthProvider.credentialFromError(error); // ... });
Web version 8
firebase.auth() .getRedirectResult() .then((result) => { if (result.credential) { /** @type {firebase.auth.OAuthCredential} */ var credential = result.credential; // This gives you a Facebook Access Token. You can use it to access the Facebook API. var token = credential.accessToken; // ... } // The signed-in user info. var user = result.user; }).catch((error) => { // Handle Errors here. var errorCode = error.code; var errorMessage = error.message; // The email of the user's account used. var email = error.email; // The firebase.auth.AuthCredential type that was used. var credential = error.credential; // ... });
- 如需使用弹出式窗口登录,请调用
在 Chrome 扩展程序中进行 Firebase 身份验证
如果您是在构建 Chrome 扩展程序应用,则必须添加 Chrome 扩展程序 ID:
- 在 Firebase 控制台中打开您的项目。
- 在 Authentication 部分中,打开 Sign-in method(登录方法)页面。
- 向“已获授权的网域”列表添加格式如下的 URI:
chrome-extension://CHROME_EXTENSION_ID
由于 Chrome 扩展程序无法使用 HTTP 重定向,因此只能使用弹出式操作方式(signInWithPopup
、linkWithPopup
和 reauthenticateWithPopup
)。您应该从后台页面脚本而不是弹出式窗口(浏览器操作)中调用这些方法,因为身份验证的弹出式窗口将取消浏览器操作的弹出式窗口。弹出式操作方式只能在使用 Manifest V2 的扩展程序中使用。较新的 Manifest V3 只允许采用 Service Worker 形式的后台脚本,无法执行弹出式操作方式。
在 Chrome 扩展程序的清单文件中,确保将 https://apis.google.com
网址加入 content_security_policy
许可名单中。
后续步骤
在用户首次登录后,系统会创建一个新的用户帐号,并将其与该用户登录时使用的凭据(即用户名和密码、电话号码或者身份验证提供方信息)相关联。此新帐号存储在您的 Firebase 项目中,无论用户采用何种方式登录,您项目中的每个应用都可以使用此帐号来识别用户。
-
在您的应用中,建议通过在
Auth
对象上设置观测者 (observer) 来了解用户的身份验证状态。然后,您便可从User
对象获取用户的基本个人资料信息。请参阅管理用户。 在您的 Firebase Realtime Database 和 Cloud Storage 安全规则中,您可以从
auth
变量获取已登录用户的唯一用户 ID,然后利用此 ID 来控制用户可以访问哪些数据。
您可以将身份验证服务提供方凭据关联至现有用户帐号,让用户可以使用多个身份验证服务提供方登录您的应用。
如需让用户退出登录,请调用 signOut
:
Web version 9
import { getAuth, signOut } from "firebase/auth"; const auth = getAuth(); signOut(auth).then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });
Web version 8
firebase.auth().signOut().then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });