Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

生成電子郵件操作鏈接

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

在火力地堡管理軟件開發工具包提供發送包含他們可以使用密碼重置,電子郵件地址驗證和鏈接的用戶電子郵件的能力電子郵件為基礎的登錄。這些電子郵件由 Google 發送,可定制性有限。

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

這帶來了以下好處:

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

初始化 ActionCodeSettings

在可以生成電子郵件操作鏈接,則可能需要初始化ActionCodeSettings實例。

ActionCodeSettings允許你通過附加的狀態通過繼續URL用戶點擊電子郵件中的鏈接後訪問。這也為用戶提供了在操作完成後返回應用程序的能力。此外,您可以指定是在安裝時直接從移動應用程序還是從瀏覽器處理電子郵件操作鏈接。

對於打算通過移動應用打開的鏈接,您需要啟用 Firebase 動態鏈接並執行一些任務以從您的移動應用中檢測這些鏈接。請參閱如何說明配置火力地堡動態鏈接的電子郵件的行動。

初始化一個ActionCodeSettings實例,提供以下數據:

範圍類型描述
url細繩

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

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

下面的例子說明了如何發送電子郵件驗證鏈接,將在移動應用程序首先打開一個火力地堡動態鏈接(iOS應用com.example.ios或Android應用com.example.android若沒安裝該應用程序將安裝並最低版本為 12)。深層鏈接將包含URL繼續有效載荷https://www.example.com/checkout?cartId=1234 。使用的動態鏈接域是coolapp.page.link ,其必須被配置為與火力地堡動態鏈接使用。

節點.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();

Python

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對象。該操作將通過電子郵件操作鏈接解決。使用的電子郵件必須屬於現有用戶。

節點.js

// Admin SDK API to generate the password reset link.
const userEmail = 'user@example.com';
getAuth()
  .generatePasswordResetLink(userEmail, actionCodeSettings)
  .then((link) => {
    // Construct password reset email template, embed the link and send
    // using custom SMTP server.
    return sendCustomPasswordResetEmail(userEmail, 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());
}

Python

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對象。該操作將通過電子郵件操作鏈接解決。使用的電子郵件必須屬於現有用戶。

節點.js

// Admin SDK API to generate the email verification link.
const useremail = 'user@example.com';
getAuth()
  .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());
}

Python

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 服務器通過電子郵件發送給相應的用戶。

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

之前,你可以驗證的電子郵件鏈接登錄的用戶,您將需要啟用電子郵件鏈接登錄您的火力地堡項目。

要生成登錄鏈接,提供用戶的電子郵件和ActionCodeSettings對象。該ActionCodeSettings對象在這種情況下,需要提供上點擊了登錄完成鏈接後,其中返回的用戶信息。該操作將通過電子郵件操作鏈接解決。

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

節點.js

// Admin SDK API to generate the sign in with email link.
const usremail = 'user@example.com';
getAuth()
  .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());
}

Python

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 服務器通過電子郵件發送給相應的用戶。

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