شما میتوانید با پیوند دادن اعتبارنامههای ارائهدهندهی احراز هویت به یک حساب کاربری موجود، به کاربران اجازه دهید با استفاده از چندین ارائهدهندهی احراز هویت به برنامهی شما وارد شوند. کاربران صرف نظر از ارائهدهندهی احراز هویتی که برای ورود به سیستم استفاده کردهاند، با همان شناسهی کاربری Firebase قابل شناسایی هستند. به عنوان مثال، کاربری که با رمز عبور وارد سیستم شده است، میتواند یک حساب گوگل را پیوند دهد و در آینده با هر دو روش وارد سیستم شود. یا، یک کاربر ناشناس میتواند یک حساب فیسبوک را پیوند دهد و سپس، بعداً، برای ادامهی استفاده از برنامهی شما، با فیسبوک وارد سیستم شود.
قبل از اینکه شروع کنی
پشتیبانی از دو یا چند ارائهدهندهی احراز هویت (احتمالاً شامل احراز هویت ناشناس) را به برنامهی خود اضافه کنید.
اعتبارنامههای ارائهدهنده احراز هویت فدرال را به یک حساب کاربری پیوند دهید
برای پیوند دادن اعتبارنامهها از یک ارائهدهندهی احراز هویت مانند گوگل یا فیسبوک به یک حساب کاربری موجود:
- کاربر را با استفاده از هر ارائه دهنده یا روش احراز هویتی وارد سیستم کنید.
- شیء
AuthProviderمربوط به ارائهدهندهای که میخواهید به حساب کاربر پیوند دهید را دریافت کنید. مثالها:Web
import { GoogleAuthProvider, FacebookAuthProvider, TwitterAuthProvider, GithubAuthProvider } from "firebase/auth"; const googleProvider = new GoogleAuthProvider(); const facebookProvider = new FacebookAuthProvider(); const twitterProvider = new TwitterAuthProvider(); const githubProvider = new GithubAuthProvider();
Web
var googleProvider = new firebase.auth.GoogleAuthProvider(); var facebookProvider = new firebase.auth.FacebookAuthProvider(); var twitterProvider = new firebase.auth.TwitterAuthProvider(); var githubProvider = new firebase.auth.GithubAuthProvider();
- از کاربر بخواهید با ارائهدهندهای که میخواهید لینک دهید، وارد سیستم شود. میتوانید با باز کردن یک پنجره پاپآپ یا با هدایت به صفحه ورود ارائهدهنده، کاربران خود را به ورود ترغیب کنید. روش هدایت در دستگاههای تلفن همراه ترجیح داده میشود.
- برای ورود به سیستم با یک پنجره بازشو،
linkWithPopupرا فراخوانی کنید:Web
import { getAuth, linkWithPopup, GoogleAuthProvider } from "firebase/auth"; const provider = new GoogleAuthProvider(); const auth = getAuth(); linkWithPopup(auth.currentUser, provider).then((result) => { // Accounts successfully linked. const credential = GoogleAuthProvider.credentialFromResult(result); const user = result.user; // ... }).catch((error) => { // Handle Errors here. // ... });
Web
auth.currentUser.linkWithPopup(provider).then((result) => { // Accounts successfully linked. var credential = result.credential; var user = result.user; // ... }).catch((error) => { // Handle Errors here. // ... });
- برای ورود به سیستم با هدایت به صفحه ورود به سیستم ارائه دهنده،
linkWithRedirectرا فراخوانی کنید: هنگام استفاده از `linkWithRedirect` بهترین شیوهها را دنبال کنید.پس از ورود کاربر، او به صفحه شما هدایت میشود. سپس، میتوانید با فراخوانیWeb
import { getAuth, linkWithRedirect, GoogleAuthProvider } from "firebase/auth"; const provider = new GoogleAuthProvider(); const auth = getAuth(); linkWithRedirect(auth.currentUser, provider) .then(/* ... */) .catch(/* ... */);
Web
auth.currentUser.linkWithRedirect(provider) .then(/* ... */) .catch(/* ... */);
getRedirectResultهنگام بارگذاری صفحه، نتیجه ورود را بازیابی کنید:Web
import { getRedirectResult } from "firebase/auth"; getRedirectResult(auth).then((result) => { const credential = GoogleAuthProvider.credentialFromResult(result); if (credential) { // Accounts successfully linked. const user = result.user; // ... } }).catch((error) => { // Handle Errors here. // ... });
Web
auth.getRedirectResult().then((result) => { if (result.credential) { // Accounts successfully linked. var credential = result.credential; var user = result.user; // ... } }).catch((error) => { // Handle Errors here. // ... });
اگر اعتبارنامهها از قبل به حساب کاربری دیگری مرتبط شده باشند، پیوند حساب با شکست مواجه خواهد شد. در این شرایط، شما باید ادغام حسابها و دادههای مرتبط را متناسب با برنامه خود انجام دهید:
Web
import { getAuth, signInWithCredential, linkWithCredential, OAuthProvider } from "firebase/auth"; // The implementation of how you store your user data depends on your application const repo = new MyUserDataRepo(); // Get reference to the currently signed-in user const auth = getAuth(); const prevUser = auth.currentUser; // Get the data which you will want to merge. This should be done now // while the app is still signed in as this user. const prevUserData = repo.get(prevUser); // Delete the user's data now, we will restore it if the merge fails repo.delete(prevUser); // Sign in user with the account you want to link to signInWithCredential(auth, newCredential).then((result) => { console.log("Sign In Success", result); const currentUser = result.user; const currentUserData = repo.get(currentUser); // Merge prevUser and currentUser data stored in Firebase. // Note: How you handle this is specific to your application const mergedData = repo.merge(prevUserData, currentUserData); const credential = OAuthProvider.credentialFromResult(result); return linkWithCredential(prevUser, credential) .then((linkResult) => { // Sign in with the newly linked credential const linkCredential = OAuthProvider.credentialFromResult(linkResult); return signInWithCredential(auth, linkCredential); }) .then((signInResult) => { // Save the merged data to the new user repo.set(signInResult.user, mergedData); }); }).catch((error) => { // If there are errors we want to undo the data merge/deletion console.log("Sign In Error", error); repo.set(prevUser, prevUserData); });
Web
// The implementation of how you store your user data depends on your application var repo = new MyUserDataRepo(); // Get reference to the currently signed-in user var prevUser = auth.currentUser; // Get the data which you will want to merge. This should be done now // while the app is still signed in as this user. var prevUserData = repo.get(prevUser); // Delete the user's data now, we will restore it if the merge fails repo.delete(prevUser); // Sign in user with the account you want to link to auth.signInWithCredential(newCredential).then((result) => { console.log("Sign In Success", result); var currentUser = result.user; var currentUserData = repo.get(currentUser); // Merge prevUser and currentUser data stored in Firebase. // Note: How you handle this is specific to your application var mergedData = repo.merge(prevUserData, currentUserData); return prevUser.linkWithCredential(result.credential) .then((linkResult) => { // Sign in with the newly linked credential return auth.signInWithCredential(linkResult.credential); }) .then((signInResult) => { // Save the merged data to the new user repo.set(signInResult.user, mergedData); }); }).catch((error) => { // If there are errors we want to undo the data merge/deletion console.log("Sign In Error", error); repo.set(prevUser, prevUserData); });
- برای ورود به سیستم با یک پنجره بازشو،
پیوند دادن آدرس ایمیل و اعتبارنامه رمز عبور به یک حساب کاربری
برای افزودن آدرس ایمیل و رمز عبور به یک حساب کاربری موجود:
- کاربر را با استفاده از هر ارائه دهنده یا روش احراز هویتی وارد سیستم کنید.
- از کاربر آدرس ایمیل و رمز عبور جدید را درخواست کنید.
- یک شیء
AuthCredentialبا آدرس ایمیل و رمز عبور ایجاد کنید:Web
import { EmailAuthProvider } from "firebase/auth"; const credential = EmailAuthProvider.credential(email, password);
Web
var credential = firebase.auth.EmailAuthProvider.credential(email, password);
شیء
AuthCredentialرا به متدlinkWithCredentialکاربر وارد شده ارسال کنید:Web
import { getAuth, linkWithCredential } from "firebase/auth"; const auth = getAuth(); linkWithCredential(auth.currentUser, credential) .then((usercred) => { const user = usercred.user; console.log("Account linking success", user); }).catch((error) => { console.log("Account linking error", error); });
Web
auth.currentUser.linkWithCredential(credential) .then((usercred) => { var user = usercred.user; console.log("Account linking success", user); }).catch((error) => { console.log("Account linking error", error); });
اگر اعتبارنامهها از قبل به حساب کاربری دیگری مرتبط شده باشند، فراخوانی
linkWithCredentialبا شکست مواجه خواهد شد. در این شرایط، شما باید ادغام حسابها و دادههای مرتبط را متناسب با برنامه خود انجام دهید (به مثال بالا مراجعه کنید).
لغو ارتباط یک ارائهدهندهی احراز هویت از یک حساب کاربری
یک حساب کاربری Firebase میتواند چندین ارائهدهندهی احراز هویت (مثلاً ایمیل/رمز عبور، گوگل، فیسبوک) داشته باشد که به کاربر اجازه میدهد از طریق روشهای مختلف به یک حساب Firebase وارد شود.
اگر ارتباط یک ارائهدهندهی احراز هویت را با حساب کاربری قطع کنید، کاربر دیگر نمیتواند با آن ارائهدهنده وارد سیستم شود.
برای قطع ارتباط یک ارائهدهندهی احراز هویت از یک حساب کاربری، شناسهی ارائهدهنده را به متد unlink ارسال کنید. میتوانید شناسههای ارائهدهندهی ارائهدهندگان احراز هویت مرتبط با یک کاربر را از ویژگی providerData دریافت کنید.
Web
import { getAuth, unlink } from "firebase/auth"; const auth = getAuth(); unlink(auth.currentUser, providerId).then(() => { // Auth provider unlinked from account // ... }).catch((error) => { // An error happened // ... });
Web
user.unlink(providerId).then(() => { // Auth provider unlinked from account // ... }).catch((error) => { // An error happened // ... });
عیبیابی
اگر هنگام تلاش برای پیوند دادن چندین حساب با خطا مواجه شدید، به مستندات مربوط به آدرسهای ایمیل تأیید شده مراجعه کنید.