Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

生成電子郵件操作鏈接

有時,移動應用程序需要與用戶互動,並通過發送電子郵件來提示他們採取某些措施。

Firebase Admin SDK可以向用戶發送包含可用於密碼重設,電子郵件地址驗證和基於電子郵件的登錄的鏈接的電子郵件。這些電子郵件是由Google發送的,可定制性受到限制。

如果要改為使用自己的電子郵件模板和自己的電子郵件傳遞服務,則可以使用Firebase Admin SDK以編程方式為上述流生成操作鏈接,您可以將其包含在發給用戶的電子郵件中。

它具有以下優點:

  • 自定義電子郵件模板。這包括添加新樣式和自定義品牌,更改措辭和徽標,通過名字而不是全名向用戶尋址等功能。
  • 根據上下文應用不同的模板。例如,如果用戶正在驗證其電子郵件以訂閱新聞通訊,則可能需要在電子郵件內容中提供上下文。另一個示例是電子郵件鏈接登錄:在一種情況下,它可以由同一用戶觸發,也可以由另一用戶邀請。該上下文將需要包含在電子郵件中。
  • 本地化自定義的電子郵件模板。
  • 能夠從安全的服務器環境生成鏈接。
  • 能夠通過移動應用程序或瀏覽器來自定義鏈接的打開方式,以及如何傳遞其他狀態信息等。
  • 能夠在構建電子郵件操作鏈接時自定義用於移動應用程序流的動態鏈接域,甚至可以根據上下文或移動應用程序指定其他動態鏈接域。

初始化ActionCodeSettings

在生成電子郵件操作鏈接之前,您可能需要初始化一個ActionCodeSettings實例。

ActionCodeSettings允許您通過繼續URL傳遞其他狀態,該持續URL在用戶單擊電子郵件鏈接後可以訪問。這還使用戶能夠在操作完成後返回到應用程序。另外,您可以指定在安裝移動應用程序時還是直接從瀏覽器處理電子郵件操作鏈接。

對於本應通過移動應用程序打開的鏈接,您需要啟用Firebase動態鏈接並執行一些任務以從移動應用程序檢測這些鏈接。請參閱有關如何為電子郵件操作配置Firebase動態鏈接的說明。

要初始化ActionCodeSettings實例,請提供以下數據:

參數類型描述
url

設置在不同上下文中具有不同含義的鏈接(狀態/繼續URL):

  • 在Web操作窗口小部件中處理鏈接時,這是continueUrl查詢參數中的深層鏈接。
  • 當直接在應用程序中處理鏈接時,這是動態鏈接的深層鏈接中的continueUrl查詢參數。
iOS ({bundleId:字符串} |未定義)設置iOS捆綁包ID。如果已安裝,它將嘗試在iOS應用中打開鏈接。 iOS應用需要在控制台中註冊。
android ({packageName:字符串,installApp:布爾值|未定義,minimumVersion:字符串|未定義} |未定義)設置Android包名稱。如果已安裝,它將嘗試在android應用中打開鏈接。如果通過installApp ,則它指定是否在設備支持且尚未安裝Android應用的情況下安裝Android應用。如果提供的該字段沒有packageName ,則會引發錯誤,說明必須與該字段一起提供packageName 。如果指定了minimumVersion ,並且安裝了較舊版本的應用程序,則該用戶將被帶到Play商店升級該應用程序。需要在控制台中註冊Android應用。
handleCodeInApp (布爾值|未定義)電子郵件操作鏈接是先在移動應用程序中打開還是在Web鏈接中打開。默認為false。設置為true時,操作代碼鏈接將作為通用鏈接或Android應用鏈接發送,如果已安裝,則由應用打開。在錯誤的情況下,代碼將首先發送到Web小部件,然後繼續將重定向到應用程序(如果已安裝)。
dynamicLinkDomain (字符串|未定義)設置要使用Firebase動態鏈接打開的當前鏈接的動態鏈接域(或子域)。由於每個項目可以配置多個動態鏈接域,因此該字段提供了明確選擇一個的能力。如果未提供任何內容,則默認使用最早的域。

以下示例說明瞭如何發送電子郵件驗證鏈接,該鏈接首先在移動應用程序中作為Firebase動態鏈接打開(iOS應用程序com.example.ios或Android應用程序com.example.android ,如果尚未安裝該應用程序,則將在其中安裝該應用程序;最低版本為12)。深度鏈接將包含繼續URL有效負載https://www.example.com/checkout?cartId=1234 。使用的動態鏈接域是coolapp.page.link ,必須將其配置為與Firebase動態鏈接一起使用。

Node.js

const 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/checkout?cartId=1234',
  // This must be true for email link sign-in.
  handleCodeInApp: true,
  iOS: {
    bundleId: 'com.example.ios',
  },
  android: {
    packageName: 'com.example.android',
    installApp: true,
    minimumVersion: '12',
  },
  // FDL custom domain.
  dynamicLinkDomain: 'coolapp.page.link',
};

爪哇

ActionCodeSettings actionCodeSettings = ActionCodeSettings.builder()
    .setUrl("https://www.example.com/checkout?cartId=1234")
    .setHandleCodeInApp(true)
    .setIosBundleId("com.example.ios")
    .setAndroidPackageName("com.example.android")
    .setAndroidInstallApp(true)
    .setAndroidMinimumVersion("12")
    .setDynamicLinkDomain("coolapp.page.link")
    .build();

蟒蛇

action_code_settings = auth.ActionCodeSettings(
    url='https://www.example.com/checkout?cartId=1234',
    handle_code_in_app=True,
    ios_bundle_id='com.example.ios',
    android_package_name='com.example.android',
    android_install_app=True,
    android_minimum_version='12',
    dynamic_link_domain='coolapp.page.link',
)

actionCodeSettings := &auth.ActionCodeSettings{
	URL:                   "https://www.example.com/checkout?cartId=1234",
	HandleCodeInApp:       true,
	IOSBundleID:           "com.example.ios",
	AndroidPackageName:    "com.example.android",
	AndroidInstallApp:     true,
	AndroidMinimumVersion: "12",
	DynamicLinkDomain:     "coolapp.page.link",
}

C#

var actionCodeSettings = new ActionCodeSettings()
{
    Url = "https://www.example.com/checkout?cartId=1234",
    HandleCodeInApp = true,
    IosBundleId = "com.example.ios",
    AndroidPackageName = "com.example.android",
    AndroidInstallApp = true,
    AndroidMinimumVersion = "12",
    DynamicLinkDomain = "coolapp.page.link",
};

要了解更多信息,請參閱在電子郵件操作中傳遞狀態

要生成密碼重置鏈接,請提供現有用戶的電子郵件和可選的ActionCodeSettings對象。該操作將通過電子郵件操作鏈接解決。使用的電子郵件必須屬於現有用戶。

Node.js

// Admin SDK API to generate the password reset link.
const userEmail = 'user@example.com';
admin
  .auth()
  .generatePasswordResetLink(userEmail, actionCodeSettings)
  .then((link) => {
    // Construct password reset email template, embed the link and send
    // using custom SMTP server.
    return sendCustomPasswordResetEmail(email, displayName, link);
  })
  .catch((error) => {
    // Some error occurred.
  });

爪哇

String email = "user@example.com";
try {
  String link = FirebaseAuth.getInstance().generatePasswordResetLink(
      email, actionCodeSettings);
  // Construct email verification template, embed the link and send
  // using custom SMTP server.
  sendCustomEmail(email, displayName, link);
} catch (FirebaseAuthException e) {
  System.out.println("Error generating email link: " + e.getMessage());
}

蟒蛇

email = 'user@example.com'
link = auth.generate_password_reset_link(email, action_code_settings)
# Construct password reset email from a template embedding the link, and send
# using a custom SMTP server.
send_custom_email(email, link)

email := "user@example.com"
link, err := client.PasswordResetLinkWithSettings(ctx, email, actionCodeSettings)
if err != nil {
	log.Fatalf("error generating email link: %v\n", err)
}

// Construct password reset template, embed the link and send
// using custom SMTP server.
sendCustomEmail(email, displayName, link)

C#

var email = "user@example.com";
var link = await FirebaseAuth.DefaultInstance.GeneratePasswordResetLinkAsync(
    email, actionCodeSettings);
// Construct email verification template, embed the link and send
// using custom SMTP server.
SendCustomEmail(email, displayName, link);

鏈接生成後,可以將其插入自定義密碼重置電子郵件中,然後使用自定義SMTP服務器通過電子郵件發送給相應的用戶。

如果您沒有使用默認的密碼重置登錄頁面並構建自己的自定義處理程序,請參閱創建自定義電子郵件操作處理程序

要生成電子郵件驗證鏈接,請提供現有用戶的未驗證電子郵件和可選的ActionCodeSettings對象。該操作將通過電子郵件操作鏈接解決。使用的電子郵件必須屬於現有用戶。

Node.js

// Admin SDK API to generate the password reset link.
const email = 'user@example.com';
admin
  .auth()
  .generatePasswordResetLink(email, actionCodeSettings)
  .then((link) => {
    // Construct password reset email template, embed the link and send
    // using custom SMTP server.
    return sendCustomPasswordResetEmail(email, displayName, link);
  })
  .catch((error) => {
    // Some error occurred.
  });

// Admin SDK API to generate the email verification link.
const useremail = 'user@example.com';
admin
  .auth()
  .generateEmailVerificationLink(useremail, actionCodeSettings)
  .then((link) => {
    // Construct email verification template, embed the link and send
    // using custom SMTP server.
    return sendCustomVerificationEmail(useremail, displayName, link);
  })
  .catch((error) => {
    // Some error occurred.
  });

爪哇

String email = "user@example.com";
try {
  String link = FirebaseAuth.getInstance().generateEmailVerificationLink(
      email, actionCodeSettings);
  // Construct email verification template, embed the link and send
  // using custom SMTP server.
  sendCustomEmail(email, displayName, link);
} catch (FirebaseAuthException e) {
  System.out.println("Error generating email link: " + e.getMessage());
}

蟒蛇

email = 'user@example.com'
link = auth.generate_email_verification_link(email, action_code_settings)
# Construct email from a template embedding the link, and send
# using a custom SMTP server.
send_custom_email(email, link)

email := "user@example.com"
link, err := client.EmailVerificationLinkWithSettings(ctx, email, actionCodeSettings)
if err != nil {
	log.Fatalf("error generating email link: %v\n", err)
}

// Construct email verification template, embed the link and send
// using custom SMTP server.
sendCustomEmail(email, displayName, link)

C#

var email = "user@example.com";
var link = await FirebaseAuth.DefaultInstance.GenerateEmailVerificationLinkAsync(
    email, actionCodeSettings);
// Construct email verification template, embed the link and send
// using custom SMTP server.
SendCustomEmail(email, displayName, link);

鏈接生成後,可以將其插入到自定義驗證電子郵件中,然後使用自定義SMTP服務器通過電子郵件發送給相應的用戶。

如果您沒有使用默認的電子郵件驗證登錄頁面並構建自己的自定義處理程序,請參閱創建自定義電子郵件操作處理程序

在使用電子郵件鏈接登錄對用戶進行身份驗證之前,您需要為Firebase項目啟用電子郵件鏈接登錄

要生成登錄鏈接,請提供用戶的電子郵件和ActionCodeSettings對象。在這種情況下,需要ActionCodeSettings對象來提供有關在單擊鏈接以完成登錄後將用戶返回哪裡的信息。該操作將通過電子郵件操作鏈接解決。

與密碼重置和電子郵件驗證不同,使用的電子郵件不一定必須屬於現有用戶,因為此操作可用於通過電子郵件鏈接將新用戶註冊到您的應用中。

Node.js

// Admin SDK API to generate the sign in with email link.
const usremail = 'user@example.com';
admin
  .auth()
  .generateSignInWithEmailLink(usremail, actionCodeSettings)
  .then((link) => {
    // Construct sign-in with email link template, embed the link and
    // send using custom SMTP server.
    return sendSignInEmail(usremail, displayName, link);
  })
  .catch((error) => {
    // Some error occurred.
  });

爪哇

String email = "user@example.com";
try {
  String link = FirebaseAuth.getInstance().generateSignInWithEmailLink(
      email, actionCodeSettings);
  // Construct email verification template, embed the link and send
  // using custom SMTP server.
  sendCustomEmail(email, displayName, link);
} catch (FirebaseAuthException e) {
  System.out.println("Error generating email link: " + e.getMessage());
}

蟒蛇

email = 'user@example.com'
link = auth.generate_sign_in_with_email_link(email, action_code_settings)
# Construct email from a template embedding the link, and send
# using a custom SMTP server.
send_custom_email(email, link)

email := "user@example.com"
link, err := client.EmailSignInLink(ctx, email, actionCodeSettings)
if err != nil {
	log.Fatalf("error generating email link: %v\n", err)
}

// Construct sign-in with email link template, embed the link and send
// using custom SMTP server.
sendCustomEmail(email, displayName, link)

C#

var email = "user@example.com";
var link = await FirebaseAuth.DefaultInstance.GenerateSignInWithEmailLinkAsync(
    email, actionCodeSettings);
// Construct email verification template, embed the link and send
// using custom SMTP server.
SendCustomEmail(email, displayName, link);

鏈接生成後,可以將其插入到自定義登錄電子郵件中,然後使用自定義SMTP服務器通過電子郵件發送給相應的用戶。

了解有關使用電子郵件鏈接使用Firebase用戶進行身份驗證的更多信息。這將有助於提供有關在用戶單擊鏈接並將其重定向回應用程序後如何完成登錄的信息。