Một số thao tác quản lý người dùng, chẳng hạn như cập nhật địa chỉ email của người dùng và đặt lại mật khẩu của người dùng, sẽ dẫn đến việc email được gửi cho người dùng. Những email này chứa các đường liên kết mà người nhận có thể mở để hoàn tất hoặc huỷ thao tác quản lý người dùng. Theo mặc định, email quản lý người dùng liên kết đến trình xử lý thao tác mặc định, là một trang web được lưu trữ tại một URL trong miền Lưu trữ Firebase của dự án.
Thay vào đó, bạn có thể tạo và lưu trữ trình xử lý thao tác email tuỳ chỉnh để thực hiện quá trình xử lý tuỳ chỉnh và tích hợp trình xử lý thao tác email với trang web của mình.
Người dùng phải hoàn tất các thao tác quản lý người dùng sau bằng trình xử lý thao tác email:
- Đặt lại mật khẩu
- Thu hồi các thay đổi về địa chỉ email – khi người dùng thay đổi địa chỉ email chính của tài khoản, Firebase sẽ gửi email đến địa chỉ cũ của họ để cho phép họ hoàn tác thay đổi
- Xác minh địa chỉ email
Để tuỳ chỉnh trình xử lý thao tác email của dự án Firebase, bạn phải tạo và lưu trữ một trang web sử dụng SDK JavaScript của Firebase để xác minh tính hợp lệ của yêu cầu và hoàn tất yêu cầu. Sau đó, bạn phải tuỳ chỉnh mẫu email của dự án Firebase để liên kết đến trình xử lý thao tác tuỳ chỉnh.
Tạo trang trình xử lý thao tác email
Firebase thêm một số tham số truy vấn vào URL trình xử lý thao tác khi tạo email quản lý người dùng. Ví dụ:
https://example.com/usermgmt?mode=resetPassword&oobCode=ABC123&apiKey=AIzaSy...&lang=fr
Các tham số này chỉ định tác vụ quản lý người dùng mà người dùng đang hoàn tất. Trang trình xử lý thao tác email phải xử lý các tham số truy vấn sau:
Thông số chế độ Thao tác quản lý người dùng cần hoàn tất. Có thể là một trong các giá trị sau:
resetPasswordrecoverEmailverifyEmail
oobCode Mã dùng một lần, dùng để xác định và xác minh yêu cầu apiKey Khoá API của dự án Firebase để thuận tiện cho bạn continueUrl Đây là một URL không bắt buộc, cung cấp cách chuyển trạng thái trở lại ứng dụng thông qua URL. URL này có liên quan đến chế độ đặt lại mật khẩu và xác minh email. Khi gửi email đặt lại mật khẩu hoặc email xác minh, bạn cần chỉ định đối tượng ActionCodeSettingsbằng URL tiếp nối để URL này có sẵn. Điều này giúp người dùng có thể tiếp tục ngay tại nơi họ đã dừng lại sau thao tác email.ngôn ngữ Đây là thẻ ngôn ngữ BCP47 không bắt buộc, đại diện cho ngôn ngữ của người dùng (ví dụ:
fr). Bạn có thể sử dụng giá trị này để cung cấp các trang trình xử lý thao tác email đã bản địa hoá cho người dùng.Bạn có thể thiết lập tính năng bản địa hoá thông qua Bảng điều khiển Firebase hoặc động bằng cách gọi API tương ứng của máy khách trước khi kích hoạt thao tác email. Ví dụ: sử dụng JavaScript:
firebase.auth().languageCode = 'fr';.Để mang lại trải nghiệm nhất quán cho người dùng, hãy đảm bảo tính năng bản địa hoá trình xử lý thao tác email khớp với mẫu email.
Ví dụ sau cho thấy cách bạn có thể xử lý các tham số truy vấn trong trình xử lý dựa trên trình duyệt. (Bạn cũng có thể triển khai trình xử lý dưới dạng ứng dụng Node.js bằng logic tương tự.)
Web
import { initializeApp } from "firebase/app"; import { getAuth } from "firebase/auth"; document.addEventListener('DOMContentLoaded', () => { // TODO: Implement getParameterByName() // Get the action to complete. const mode = getParameterByName('mode'); // Get the one-time code from the query parameter. const actionCode = getParameterByName('oobCode'); // (Optional) Get the continue URL from the query parameter if available. const continueUrl = getParameterByName('continueUrl'); // (Optional) Get the language code if available. const lang = getParameterByName('lang') || 'en'; // Configure the Firebase SDK. // This is the minimum configuration required for the API to be used. const config = { 'apiKey': "YOUR_API_KEY" // Copy this key from the web initialization // snippet found in the Firebase console. }; const app = initializeApp(config); const auth = getAuth(app); // Handle the user management action. switch (mode) { case 'resetPassword': // Display reset password handler and UI. handleResetPassword(auth, actionCode, continueUrl, lang); break; case 'recoverEmail': // Display email recovery handler and UI. handleRecoverEmail(auth, actionCode, lang); break; case 'verifyEmail': // Display email verification handler and UI. handleVerifyEmail(auth, actionCode, continueUrl, lang); break; default: // Error: invalid mode. } }, false);
Web
document.addEventListener('DOMContentLoaded', () => { // TODO: Implement getParameterByName() // Get the action to complete. var mode = getParameterByName('mode'); // Get the one-time code from the query parameter. var actionCode = getParameterByName('oobCode'); // (Optional) Get the continue URL from the query parameter if available. var continueUrl = getParameterByName('continueUrl'); // (Optional) Get the language code if available. var lang = getParameterByName('lang') || 'en'; // Configure the Firebase SDK. // This is the minimum configuration required for the API to be used. var config = { 'apiKey': "YOU_API_KEY" // Copy this key from the web initialization // snippet found in the Firebase console. }; var app = firebase.initializeApp(config); var auth = app.auth(); // Handle the user management action. switch (mode) { case 'resetPassword': // Display reset password handler and UI. handleResetPassword(auth, actionCode, continueUrl, lang); break; case 'recoverEmail': // Display email recovery handler and UI. handleRecoverEmail(auth, actionCode, lang); break; case 'verifyEmail': // Display email verification handler and UI. handleVerifyEmail(auth, actionCode, continueUrl, lang); break; default: // Error: invalid mode. } }, false);
Xử lý các yêu cầu đặt lại mật khẩu bằng cách xác minh mã thao tác trước với
verifyPasswordResetCode; sau đó lấy mật khẩu mới từ người dùng và chuyển mật khẩu đó đếnconfirmPasswordReset. Ví dụ:Web
import { verifyPasswordResetCode, confirmPasswordReset } from "firebase/auth"; function handleResetPassword(auth, actionCode, continueUrl, lang) { // Localize the UI to the selected language as determined by the lang // parameter. // Verify the password reset code is valid. verifyPasswordResetCode(auth, actionCode).then((email) => { const accountEmail = email; // TODO: Show the reset screen with the user's email and ask the user for // the new password. const newPassword = "..."; // Save the new password. confirmPasswordReset(auth, actionCode, newPassword).then((resp) => { // Password reset has been confirmed and new password updated. // TODO: Display a link back to the app, or sign-in the user directly // if the page belongs to the same domain as the app: // auth.signInWithEmailAndPassword(accountEmail, newPassword); // TODO: If a continue URL is available, display a button which on // click redirects the user back to the app via continueUrl with // additional state determined from that URL's parameters. }).catch((error) => { // Error occurred during confirmation. The code might have expired or the // password is too weak. }); }).catch((error) => { // Invalid or expired action code. Ask user to try to reset the password // again. }); }
Web
function handleResetPassword(auth, actionCode, continueUrl, lang) { // Localize the UI to the selected language as determined by the lang // parameter. // Verify the password reset code is valid. auth.verifyPasswordResetCode(actionCode).then((email) => { var accountEmail = email; // TODO: Show the reset screen with the user's email and ask the user for // the new password. var newPassword = "..."; // Save the new password. auth.confirmPasswordReset(actionCode, newPassword).then((resp) => { // Password reset has been confirmed and new password updated. // TODO: Display a link back to the app, or sign-in the user directly // if the page belongs to the same domain as the app: // auth.signInWithEmailAndPassword(accountEmail, newPassword); // TODO: If a continue URL is available, display a button which on // click redirects the user back to the app via continueUrl with // additional state determined from that URL's parameters. }).catch((error) => { // Error occurred during confirmation. The code might have expired or the // password is too weak. }); }).catch((error) => { // Invalid or expired action code. Ask user to try to reset the password // again. }); }
Xử lý việc thu hồi thay đổi địa chỉ email bằng cách xác minh mã thao tác trước với
checkActionCode; sau đó khôi phục địa chỉ email của người dùng bằngapplyActionCode. Ví dụ:Web
import { checkActionCode, applyActionCode, sendPasswordResetEmail } from "firebase/auth"; function handleRecoverEmail(auth, actionCode, lang) { // Localize the UI to the selected language as determined by the lang // parameter. let restoredEmail = null; // Confirm the action code is valid. checkActionCode(auth, actionCode).then((info) => { // Get the restored email address. restoredEmail = info['data']['email']; // Revert to the old email. return applyActionCode(auth, actionCode); }).then(() => { // Account email reverted to restoredEmail // TODO: Display a confirmation message to the user. // You might also want to give the user the option to reset their password // in case the account was compromised: sendPasswordResetEmail(auth, restoredEmail).then(() => { // Password reset confirmation sent. Ask user to check their email. }).catch((error) => { // Error encountered while sending password reset code. }); }).catch((error) => { // Invalid code. }); }
Web
function handleRecoverEmail(auth, actionCode, lang) { // Localize the UI to the selected language as determined by the lang // parameter. var restoredEmail = null; // Confirm the action code is valid. auth.checkActionCode(actionCode).then((info) => { // Get the restored email address. restoredEmail = info['data']['email']; // Revert to the old email. return auth.applyActionCode(actionCode); }).then(() => { // Account email reverted to restoredEmail // TODO: Display a confirmation message to the user. // You might also want to give the user the option to reset their password // in case the account was compromised: auth.sendPasswordResetEmail(restoredEmail).then(() => { // Password reset confirmation sent. Ask user to check their email. }).catch((error) => { // Error encountered while sending password reset code. }); }).catch((error) => { // Invalid code. }); }
Xử lý việc xác minh địa chỉ email bằng cách gọi
applyActionCode. Ví dụ:Web
function handleVerifyEmail(auth, actionCode, continueUrl, lang) { // Localize the UI to the selected language as determined by the lang // parameter. // Try to apply the email verification code. applyActionCode(auth, actionCode).then((resp) => { // Email address has been verified. // TODO: Display a confirmation message to the user. // You could also provide the user with a link back to the app. // TODO: If a continue URL is available, display a button which on // click redirects the user back to the app via continueUrl with // additional state determined from that URL's parameters. }).catch((error) => { // Code is invalid or expired. Ask the user to verify their email address // again. }); }
Web
function handleVerifyEmail(auth, actionCode, continueUrl, lang) { // Localize the UI to the selected language as determined by the lang // parameter. // Try to apply the email verification code. auth.applyActionCode(actionCode).then((resp) => { // Email address has been verified. // TODO: Display a confirmation message to the user. // You could also provide the user with a link back to the app. // TODO: If a continue URL is available, display a button which on // click redirects the user back to the app via continueUrl with // additional state determined from that URL's parameters. }).catch((error) => { // Code is invalid or expired. Ask the user to verify their email address // again. }); }
Lưu trữ trang ở đâu đó, ví dụ: sử dụng Firebase Hosting.
Tiếp theo, bạn phải định cấu hình dự án Firebase để liên kết đến trình xử lý thao tác email tuỳ chỉnh trong email quản lý người dùng.
Liên kết đến trình xử lý tuỳ chỉnh trong mẫu email
Cách định cấu hình dự án Firebase để sử dụng trình xử lý thao tác email tuỳ chỉnh:
Trong bảng điều khiển Firebase, hãy chuyển đến thẻ Bảo mật > Xác thực > Mẫu.
Trong bất kỳ mục nào của Loại email, hãy nhấp vào biểu tượng bút chì để chỉnh sửa mẫu email.
Nhấp vào tuỳ chỉnh URL thao tác rồi chỉ định URL đến trình xử lý thao tác email tuỳ chỉnh.
Sau khi bạn lưu URL, tất cả mẫu email của dự án Firebase sẽ sử dụng URL đó.