您可以透過 Firebase 驗證功能,傳送內含登入連結的電子郵件給使用者,讓對方點選連結登入。系統也會在過程中驗證使用者的電子郵件地址。
使用電子郵件登入有許多好處:
- 減少註冊和登入流程的阻礙。
- 降低在不同應用程式重複使用密碼的風險,即使密碼選得再好,重複使用仍可能導致安全性問題。
- 驗證使用者身分,同時確認使用者是電子郵件地址的合法擁有者。
- 使用者只要有可存取的電子郵件帳戶就能登入。無須擁有電話號碼或社群媒體帳戶。
- 使用者不必提供 (或記住) 密碼,即可安全登入,這在行動裝置上可能很麻煩。
- 如果現有使用者先前是透過電子郵件 ID (密碼或同盟) 登入,可以升級為僅使用電子郵件登入。舉例來說,使用者忘記密碼時,仍可登入帳戶,不必重設密碼。
事前準備
如果尚未建立新的地圖 ID 和地圖樣式,請按照「開始使用」一文中的步驟進行。
為 Firebase 專案啟用電子郵件連結登入。
如要透過電子郵件連結登入使用者,請先為 Firebase 專案啟用電子郵件供應商和電子郵件連結登入方法:
- 在 Firebase 控制台中,開啟「驗證」部分。
- 在「登入方式」分頁中,啟用「電子郵件地址/密碼」供應商。 請注意,如要使用電子郵件連結登入,必須先啟用電子郵件/密碼登入功能。
- 在同一部分中,啟用「電子郵件連結 (不需要密碼即可登入)」登入方式。
- 按一下 [儲存]。
將驗證連結傳送至使用者的電子郵件地址
如要啟動驗證流程,請顯示介面,提示使用者提供電子郵件地址,然後呼叫 sendSignInLinkToEmail(),要求 Firebase 將驗證連結傳送至使用者的電子郵件地址。
建構 ActionCodeSettings 物件,向 Firebase 提供如何建構電子郵件連結的指示。設定下列欄位:
url:要嵌入的深層連結,以及要一併傳遞的任何其他狀態。 連結的網域必須位於 Firebase 控制台的授權網域清單中。如要查看這份清單,請前往「設定」分頁 (依序點選「驗證」->「設定」->「授權網域」)。如果使用者的裝置未安裝應用程式,且無法安裝應用程式,系統會將使用者重新導向至這個網址。androidPackageName和IOSBundleId:在 Android 或 iOS 裝置上開啟登入連結時要使用的應用程式。進一步瞭解如何設定 Firebase Dynamic Links,透過行動應用程式開啟電子郵件動作連結。handleCodeInApp:設為true。與其他頻外電子郵件動作 (密碼重設和電子郵件驗證) 不同,登入作業一律必須在應用程式中完成。這是因為在流程結束時,使用者應已登入,且應用程式會保留其 Auth 狀態。dynamicLinkDomain:(已淘汰,請改用linkDomain) 為專案定義多個自訂動態連結網域時,請指定要使用哪個網域,以便透過指定的行動應用程式開啟連結 (例如example.page.link)。否則系統會自動選取第一個網域。linkDomain:選用的自訂 Firebase 託管網域,用於透過指定行動應用程式開啟連結時。網域必須在 Firebase 託管中設定,且為專案所擁有。這不能是預設的代管網域 (web.app或firebaseapp.com)。這項設定會取代已淘汰的dynamicLinkDomain設定。
var acs = ActionCodeSettings( // URL you want to redirect back to. The domain (www.example.com) for this // URL must be whitelisted in the Firebase Console. url: 'https://www.example.com/finishSignUp?cartId=1234', // This must be true handleCodeInApp: true, iOSBundleId: 'com.example.ios', androidPackageName: 'com.example.android', // installIfNotAvailable androidInstallApp: true, // minimumVersion androidMinimumVersion: '12');詢問使用者的電子郵件地址。
將驗證連結傳送至使用者的電子郵件地址,並儲存該地址,以防使用者在同一部裝置上完成電子郵件登入程序。
var emailAuth = 'someemail@domain.com'; FirebaseAuth.instance.sendSignInLinkToEmail( email: emailAuth, actionCodeSettings: acs) .catchError((onError) => print('Error sending email verification $onError')) .then((value) => print('Successfully sent email verification')); });
使用電子郵件連結完成登入程序
安全疑慮
為避免登入連結遭人濫用,以登入非預期使用者或裝置的帳戶,Firebase Auth 會要求使用者在完成登入流程時提供電子郵件地址。如要順利登入,這個電子郵件地址必須與登入連結原始寄送的地址相符。
如果使用者在要求連結的同一部裝置上開啟登入連結,您可以在傳送登入電子郵件時,將他們的電子郵件地址儲存在本機 (例如使用 SharedPreferences),簡化這個流程。然後使用這個地址完成流程。請勿在重新導向網址參數中傳遞使用者的電子郵件地址,並重複使用該地址,因為這可能會導致工作階段注入。
登入完成後,系統會從使用者移除任何先前未驗證的登入機制,並使現有工作階段失效。舉例來說,如果有人先前使用相同的電子郵件地址和密碼建立未經驗證的帳戶,系統會移除該使用者的密碼,防止冒用者聲稱擁有該帳戶並建立未經驗證的帳戶後,再次使用未經驗證的電子郵件地址和密碼登入。
此外,請務必在正式環境中使用 HTTPS 網址,以免連結遭到中繼伺服器攔截。
完成登入
Firebase Dynamic Links 已淘汰,現在會使用 Firebase Hosting 傳送登入連結。請按照下列指南,設定特定平台:
驗證電子郵件連結並登入
如要透過行動應用程式完成登入,應用程式必須設定為偵測傳入的應用程式連結、剖析基礎深層連結,然後完成登入。
在連結處理常式中,檢查連結是否用於電子郵件連結驗證,如果是,請完成登入程序。
// Confirm the link is a sign-in with email link. if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) { try { // The client SDK will parse the code from the link for you. final userCredential = await FirebaseAuth.instance .signInWithEmailLink(email: emailAuth, emailLink: emailLink); // You can access the new user via userCredential.user. final emailAddress = userCredential.user?.email; print('Successfully signed in with email link!'); } catch (error) { print('Error signing in with email link.'); } }
透過電子郵件連結連結/重新驗證
您也可以將這種驗證方法連結至現有使用者。舉例來說,使用者先前透過其他供應商 (例如電話號碼) 驗證身分,可以將這個登入方式新增至現有帳戶。
兩者的差異在於作業的後半部分:
final authCredential = EmailAuthProvider
.credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
await FirebaseAuth.instance.currentUser
?.linkWithCredential(authCredential);
} catch (error) {
print("Error linking emailLink credential.");
}
您也可以使用這項功能,在執行敏感作業前,重新驗證電子郵件連結使用者。
final authCredential = EmailAuthProvider
.credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
await FirebaseAuth.instance.currentUser
?.reauthenticateWithCredential(authCredential);
} catch (error) {
print("Error reauthenticating credential.");
}
不過,由於流程可能會在原始使用者未登入的其他裝置上結束,因此可能無法完成。在這種情況下,系統可能會向使用者顯示錯誤訊息,強制他們在同一部裝置上開啟連結。您可以在連結中傳遞某些狀態,提供作業類型和使用者 UID 的相關資訊。
已淘汰:區分電子郵件/密碼和電子郵件連結
如果您是在 2023 年 9 月 15 日當天或之後建立專案,系統預設會啟用電子郵件列舉防護功能。這項功能可提升專案使用者帳戶的安全性,但會停用 fetchSignInMethodsForEmail() 方法,我們先前建議您實作以 ID 為優先的流程時,就是使用這個方法。
雖然您可以為專案停用電子郵件列舉防護功能,但我們不建議這麼做。
詳情請參閱電子郵件列舉防護功能的說明文件。
後續步驟
使用者建立新帳戶後,該帳戶會儲存在 Firebase 專案中,並可用於識別專案中每個應用程式的使用者,無論使用者採用哪種登入方式。
在應用程式中,您可以從 User 物件取得使用者的基本個人資料資訊。請參閱「管理使用者」。
在 Firebase 即時資料庫和 Cloud Storage 安全性規則中,您可以從 auth 變數取得已登入使用者的專屬使用者 ID,並用來控管使用者可存取的資料。
您可以將驗證供應商憑證連結至現有使用者帳戶,讓使用者透過多個驗證供應商登入應用程式。
如要登出使用者,請呼叫 signOut():
await FirebaseAuth.instance.signOut();