您可以使用 Firebase 驗證功能,向使用者傳送電子郵件 內含連結,只要按一下即可登入。在過程中,使用者的 電子郵件地址也會通過驗證
使用電子郵件登入有以下優點:
- 簡化註冊和登入程序。
- 降低在不同應用程式間重複使用密碼的風險,可能導致安全性降低 甚至是已選取的密碼
- 能夠驗證使用者身分,同時驗證使用者身分 電子郵件地址的合法擁有者。
- 使用者只需具備可存取的電子郵件帳戶即可登入。不具備 必須提供電話號碼或社群媒體帳戶。
- 使用者不需提供 (或記得) 存取 密碼,對行動裝置來說可能很麻煩。
- 先前以電子郵件 ID (密碼) 登入的現有使用者 或聯合) 的電子郵件,只要以電子郵件登入即可。舉例來說 使用者就算忘記密碼,仍然可以登入, 重設密碼。
事前準備
如果您尚未安裝,請按照入門指南中的步驟操作。
為 Firebase 專案啟用電子郵件連結登入功能。
如要透過電子郵件連結登入使用者,您必須先啟用電子郵件服務供應商 和電子郵件連結登入方式 (適用於 Firebase 專案):
- 在 Firebase 控制台開啟「驗證」專區。
- 在「Sign in method」分頁中啟用「Email/Password」供應商。 請注意,您必須啟用電子郵件/密碼登入功能,才能使用電子郵件連結 登入。
- 在同一個部分中啟用「電子郵件連結 (不需要密碼登入)」。 登入方式。
- 按一下 [儲存]。
傳送驗證連結至使用者的電子郵件地址
如要啟動驗證流程,系統會顯示一個介面,提示使用者提供自己的電子郵件地址,然後呼叫 sendSignInLinkToEmail()
以要求 Firebase 將驗證連結傳送至使用者的電子郵件。
建構 ActionCodeSettings 物件,藉此向 Firebase 提供建構電子郵件連結的操作說明。設定下列欄位:
url
:要嵌入的深層連結,以及要一併傳遞的任何其他狀態。連結的網域必須在 Firebase 控制台的授權網域清單中加入許可清單,只要前往「登入方式」分頁 (依序點選「驗證」->「登入方式」),就能找到清單。如果使用者的裝置未安裝應用程式,且無法安裝應用程式,這個連結會將使用者重新導向至此網址。androidPackageName
和IOSBundleId
:在 Android 或 iOS 裝置上開啟登入連結時使用的應用程式。進一步瞭解如何設定 Firebase Dynamic Links,透過行動應用程式開啟電子郵件動作連結。handleCodeInApp
:設為true
。登入操作必須一律在應用程式中完成 (密碼重設和電子郵件驗證)。這是因為在流程結束時,使用者會處於登入狀態,驗證狀態也會保留在應用程式中。dynamicLinkDomain
:為專案定義多個自訂動態連結網域時,請指定當使用者要透過指定的行動應用程式開啟連結時,要使用的是哪個網域 (例如example.page.link
)。如未設定,系統會自動選取第一個網域。
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 驗證會要求使用者的電子郵件地址 所提供的密碼。為確保登入成功,這封電子郵件 位址必須與最初登入連結的收件地址相符。
當使用者以相同方式開啟登入連結時, 使用者要求連結的裝置,方法是將電子郵件地址儲存在本機, 執行個體。接著: 使用此位址完成流程 請勿在重新導向網址參數中傳遞使用者的電子郵件,並且重新做為 這可能會啟用工作階段插入功能
登入完成後,系統會採用先前的任何未經驗證登入機制 ,且所有現有工作階段都會失效。 舉例來說,假設有人 電子郵件地址,系統會移除使用者的密碼,以免 以模擬人的身分,提出擁有權並建立了未經驗證的帳戶 使用未經驗證的電子郵件地址和密碼重新登入。
此外,請務必在正式環境中使用 HTTPS 網址,避免使用者看到你的連結 也可能會遭到中介伺服器攔截
驗證電子郵件連結並登入
Firebase 驗證會使用 Firebase Dynamic Links,將電子郵件連結傳送至行動裝置。如要透過行動應用程式完成登入程序,應用程式必須設為偵測收到的應用程式連結、剖析基礎深層連結,然後完成登入程序。
請參閱指南設定應用程式,以便接收 Flutter 上的 Dynamic Links。
在您的連結處理常式中,檢查連結是否用於電子郵件連結驗證,如果有,請完成登入程序。
// 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 專案的專用 ID,可用來識別應用程式內所有應用程式的使用者 專案,無論使用者使用的登入方式為何。
在您的應用程式中,您可以透過
User
物件。請參閱管理使用者。
在 Firebase 即時資料庫和 Cloud Storage 安全性規則中,您可以
透過 auth
變數取得已登入使用者的不重複使用者 ID,並用於
控制使用者可以存取哪些資料
您可以讓使用者透過多重驗證機制登入您的應用程式 將驗證供應商憑證連結) 現有的使用者帳戶。
如要將使用者登出,請呼叫 signOut()
:
await FirebaseAuth.instance.signOut();