Tạo trình xử lý thao tác tuỳ chỉnh với email

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, dẫn đến việc email được gửi tới người dùng đó. Các email chứa các đường liên kết mà người nhận có thể mở để hoàn tất hoặc huỷ người dùng hành động quản lý. Theo mặc định, email quản lý người dùng liên kết đến hành động mặc định trình xử lý, là một trang web được lưu trữ tại một URL trong Lưu trữ Firebase của dự án miền.

Thay vào đó, bạn có thể tạo và lưu trữ một trình xử lý tác vụ email tuỳ chỉnh để thực hiện các thao tác tuỳ chỉnh và tích hợp trình xử lý hành động qua email với trang web của bạn.

Các thao tác quản lý người dùng sau đây yêu cầu người dùng hoàn tất thao tác đó bằng cách sử dụng trình xử lý hành động qua email:

  • Đặt lại mật khẩu
  • Thu hồi thay đổi địa chỉ email—khi người dùng thay đổi tài khoản của họ' chính địa chỉ email, Firebase sẽ gửi email đến địa chỉ cũ của họ cho phép họ huỷ thay đổi đó
  • Xác minh địa chỉ email

Để tùy chỉnh trình xử lý hành động qua 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 không hợp lệ và hoàn tất yêu cầu. Sau đó, bạn phải tuỳ chỉnh Firebase của mình các mẫu email của dự án để liên kết với trình xử lý hành động tuỳ chỉnh.

Tạo trang trình xử lý thao tác qua email

  1. Firebase thêm một số tham số truy vấn vào URL trình xử lý hành động của bạn 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 thông số này chỉ định tác vụ quản lý người dùng mà người dùng hoàn tất. Trang trình xử lý hành động qua email của bạn phải xử lý truy vấn sau thông số:

    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 những các giá trị sau:

    • resetPassword
    • recoverEmail
    • verifyEmail
    mã oob Mã dùng một lần, dùng để nhận dạng và xác minh yêu cầu
    Khoá api Khoá API cho dự án Firebase của bạn, được cung cấp để thuận tiện
    URL tiếp tục Đây là một URL tuỳ chọn cung cấp cách chuyển trạng thái trở lại ứng dụng thông qua một URL. Điều này liên quan đến việc đặt lại mật khẩu và email chế độ xác minh. Khi gửi email đặt lại mật khẩu hoặc email xác minh, đối tượng ActionCodeSettings cần được chỉ định cùng với một URL tiếp tục để có sẵn URL này. Chiến dịch này giúp người dùng có thể tiếp tục từ nơi họ đã dừng lại sau hành động đối với email.
    ngôn ngữ

    Đây là tuỳ chọn BCP47 thẻ ngôn ngữ thể hiện 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 email đã bản địa hoá các trang trình xử lý hành động cho người dùng của mình.

    Bản địa hoá có thể được thiết lập thông qua Bảng điều khiển của Firebase hoặc tự động bằng cách gọi API ứng dụng khách tương ứng trước khi kích hoạt email hành động. Ví dụ: sử dụng JavaScript: firebase.auth().languageCode = 'fr';.

    Để người dùng có trải nghiệm nhất quán, hãy đảm bảo trình xử lý hành động qua email bản địa hoá 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 Node.js bằng cách sử dụ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);
  2. Xử lý các yêu cầu đặt lại mật khẩu bằng cách xác minh mã hành động trước bằng verifyPasswordResetCode; sau đó lấy mật khẩu mới từ người dùng và chuyển mật khẩu đó đến confirmPasswordReset. 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.
      });
    }
  3. Xử lý việc thu hồi thay đổi địa chỉ email bằng cách xác minh mã hành động trước cùng checkActionCode; sau đó khôi phục địa chỉ email của người dùng bằng applyActionCode. 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.
      });
    }
  4. Xử lý quy trình 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.
      });
    }
  5. Lưu trữ trang ở một nơi nào đó, ví dụ: sử dụng tính năng Lưu trữ Firebase.

Tiếp theo, bạn phải định cấu hình dự án Firebase để liên kết với email tuỳ chỉnh trình xử lý hành động trong email quản lý người dùng.

Để định cấu hình dự án Firebase nhằm sử dụng trình xử lý hành động qua email tuỳ chỉnh, hãy làm như sau:

  1. Mở dự án của bạn trong bảng điều khiển của Firebase.
  2. Chuyển tới trang Mẫu email trong phần Xác thực.
  3. Trong bất kỳ mục nhập Loại email nào, hãy nhấp vào biểu tượng bút chì để chỉnh sửa mẫu email.
  4. Nhấp vào tuỳ chỉnh URL hành động rồi chỉ định URL cho email tuỳ chỉnh của bạn trình xử lý hành động.

Sau khi bạn lưu URL, tất cả email thuộc dự án Firebase của bạn sẽ sử dụng URL đó mẫu.