Tạo đường liên kết đến tác vụ email

Đôi khi, ứng dụng di động cần tương tác với người dùng và nhắc họ thực hiện một số hành động nhất định bằng cách gửi email.

SDK ứng dụng của Firebase cho phép gửi cho người dùng email chứa các đường liên kết mà họ có thể dùng để đặt lại mật khẩu, xác minh địa chỉ email và đăng nhập dựa trên email. Những email dựa trên mẫu này do Google gửi và có khả năng tuỳ chỉnh hạn chế.

Nếu bạn muốn sử dụng các mẫu email của riêng mình và dịch vụ gửi email của riêng bạn, thì trang này sẽ giải thích cách sử dụng SDK quản trị của Firebase để tạo đường liên kết hành động cho các quy trình trên theo phương thức lập trình mà bạn có thể đưa vào email cho người dùng.

Điều này đi kèm với những lợi ích sau:

  • Tuỳ chỉnh mẫu email. Trong đó bao gồm cả khả năng thêm kiểu mới và tuỳ chỉnh thương hiệu, thay đổi từ ngữ và biểu trưng, gọi người dùng bằng tên thay vì họ tên, v.v.
  • Áp dụng các mẫu khác nhau tuỳ theo ngữ cảnh. Ví dụ: nếu người dùng đang xác minh email để đăng ký nhận bản tin, thì có thể bạn cần cung cấp ngữ cảnh trong nội dung email. Một ví dụ khác là đăng nhập bằng đường liên kết email: trong một trường hợp, điều này có thể được cùng một người dùng kích hoạt hoặc dưới dạng lời mời của một người dùng khác. Bạn cần phải thêm bối cảnh vào email.
  • Bản địa hoá mẫu email tuỳ chỉnh.
  • Có thể tạo đường liên kết từ một môi trường máy chủ bảo mật.
  • Có thể tuỳ chỉnh cách mở đường liên kết, thông qua ứng dụng dành cho thiết bị di động hoặc trình duyệt, cũng như cách truyền thông tin bổ sung về trạng thái, v.v.
  • Khả năng tuỳ chỉnh miền đường liên kết động dùng cho các luồng ứng dụng di động khi tạo đường liên kết hành động qua email và thậm chí là chỉ định một miền đường liên kết động khác tuỳ thuộc vào ngữ cảnh hoặc ứng dụng dành cho thiết bị di động.

Khởi chạy ActionCodeSettings

Trước khi tạo đường liên kết hành động qua email, có thể bạn cần khởi chạy một thực thể ActionCodeSettings.

ActionCodeSettings cho phép bạn chuyển trạng thái bổ sung thông qua một URL tiếp tục. Bạn có thể truy cập URL này sau khi người dùng nhấp vào đường liên kết trong email. Điều này cũng cho phép người dùng quay lại ứng dụng sau khi hoàn tất thao tác. Ngoài ra, bạn có thể chỉ định xem có xử lý đường liên kết hành động qua email trực tiếp từ ứng dụng dành cho thiết bị di động khi liên kết này được cài đặt hoặc từ trình duyệt hay không.

Đối với những đường liên kết sẽ được mở thông qua ứng dụng di động, bạn sẽ cần bật Liên kết động của Firebase và thực hiện một số thao tác để phát hiện những đường liên kết này từ ứng dụng dành cho thiết bị di động của bạn. Hãy tham khảo hướng dẫn về cách định cấu hình Đường liên kết động của Firebase cho các thao tác qua email.

Để khởi tạo một thực thể ActionCodeSettings, hãy cung cấp dữ liệu sau:

Thông số Loại Mô tả
url chuỗi

Đặt đường liên kết (URL trạng thái/URL tiếp tục) có ý nghĩa riêng tuỳ theo ngữ cảnh:

  • Khi đường liên kết được xử lý trong các tiện ích thao tác trên web, đây sẽ là đường liên kết sâu trong tham số truy vấn continueUrl.
  • Khi đường liên kết được xử lý trực tiếp trong ứng dụng, đây là tham số truy vấn continueUrl trong đường liên kết sâu của Đường liên kết động.
iOS ({bundleId: string}|không xác định) Đặt mã nhận dạng gói. Thao tác này sẽ tìm cách mở đường liên kết trong một ứng dụng của Apple nếu bạn đã cài đặt ứng dụng này. Bạn cần đăng ký ứng dụng này trong Console.
android ({packageName: string, installApp:boolean|unknown, minimumVersion: string|updated}|không xác định) Đặt tên gói Android. Thao tác này sẽ cố mở đường liên kết trong một ứng dụng Android nếu bạn đã cài đặt đường liên kết đó. Nếu installApp được truyền, thuộc tính này sẽ chỉ định xem có cài đặt ứng dụng Android hay không nếu thiết bị hỗ trợ và ứng dụng chưa được cài đặt. Nếu bạn cung cấp trường này mà không có packageName, sẽ xảy ra lỗi giải thích rằng bạn phải cung cấp packageName cùng với trường này. Nếu bạn chỉ định minimumVersion và cài đặt một phiên bản cũ của ứng dụng, thì người dùng sẽ được đưa đến Cửa hàng Play để nâng cấp ứng dụng. Bạn cần đăng ký ứng dụng Android trong Console.
handleCodeInApp (boolean|không xác định) Liệu đường liên kết hành động qua email sẽ được mở trong ứng dụng di động hay đường liên kết web trước tiên. Giá trị mặc định là "false". Khi bạn đặt chính sách này thành true, thì đường liên kết đến mã hành động sẽ được gửi dưới dạng Đường liên kết phổ quát hoặc Đường liên kết trong ứng dụng Android và sẽ được ứng dụng mở nếu được cài đặt. Trong trường hợp sai, mã sẽ được gửi đến tiện ích web trước tiên, sau đó tiếp tục sẽ chuyển hướng đến ứng dụng nếu đã cài đặt.
dynamicLinkDomain (chuỗi|không xác định) Đặt miền đường liên kết động (hoặc miền con) để sử dụng cho đường liên kết hiện tại nếu bạn mở miền này bằng Đường liên kết động của Firebase. Vì có thể định cấu hình nhiều miền liên kết động cho mỗi dự án, nên trường này cho phép bạn chọn rõ ràng một miền. Nếu bạn không cung cấp miền cũ nhất, thì miền cũ nhất sẽ được sử dụng theo mặc định.

Ví dụ sau minh hoạ cách gửi đường liên kết xác minh qua email. Đường liên kết này sẽ mở trước tiên trong ứng dụng di động dưới dạng Đường liên kết động Firebase (ứng dụng Apple com.example.ios hoặc ứng dụng Android com.example.android, trong đó ứng dụng sẽ cài đặt nếu chưa được cài đặt và phiên bản tối thiểu là 12). Đường liên kết sâu sẽ chứa tải trọng URL tiếp tục https://www.example.com/checkout?cartId=1234. Miền liên kết động được sử dụng là coolapp.page.link. Bạn phải định cấu hình miền này để sử dụng cùng với Đường liên kết động của 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',
};

Java

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',
)

Tiến hành

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",
};

Để tìm hiểu thêm, hãy xem bài viết Chuyển trạng thái trong thao tác qua email.

Để tạo một đường liên kết đặt lại mật khẩu, hãy cung cấp địa chỉ email của người dùng hiện tại và một đối tượng ActionCodeSettings không bắt buộc. Thao tác này sẽ được giải quyết bằng đường liên kết hành động qua email. Email bạn dùng phải thuộc về một người dùng hiện tại.

Node.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.
  });

Java

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)

Tiến hành

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);

Sau khi tạo, đường liên kết có thể được chèn vào email đặt lại mật khẩu tuỳ chỉnh rồi gửi qua email cho người dùng tương ứng bằng máy chủ SMTP tuỳ chỉnh.

Nếu bạn không sử dụng trang đích đặt lại mật khẩu mặc định và tạo trình xử lý tuỳ chỉnh của riêng mình, hãy xem phần tạo trình xử lý thao tác với email tuỳ chỉnh.

Để tạo đường liên kết xác minh email, hãy cung cấp email chưa được xác minh của người dùng hiện tại và đối tượng ActionCodeSettings (không bắt buộc). Thao tác này sẽ được giải quyết bằng đường liên kết hành động qua email. Email bạn dùng phải thuộc về một người dùng hiện tại.

Node.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.
  });

Java

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)

Tiến hành

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);

Sau khi tạo, bạn có thể chèn đường liên kết vào email xác minh tuỳ chỉnh rồi gửi qua email tới người dùng tương ứng bằng máy chủ SMTP tuỳ chỉnh.

Nếu bạn không sử dụng trang đích xác minh email mặc định và tạo trình xử lý tuỳ chỉnh của riêng mình, hãy xem bài viết tạo trình xử lý thao tác với email tuỳ chỉnh.

Để có thể xác thực người dùng bằng tính năng đăng nhập bằng đường liên kết email, bạn cần bật tính năng đăng nhập bằng đường liên kết email cho dự án Firebase của bạn.

Để tạo đường liên kết đăng nhập, hãy cung cấp email của người dùng và đối tượng ActionCodeSettings. Trong trường hợp này, đối tượng ActionCodeSettings cần phải cung cấp thông tin về vị trí trả về người dùng sau khi người dùng nhấp vào đường liên kết để hoàn tất quy trình đăng nhập. Thao tác này sẽ được giải quyết bằng đường liên kết hành động qua email.

Không giống như đặt lại mật khẩu và xác minh email, email được sử dụng không nhất thiết phải thuộc về người dùng hiện tại, vì thao tác này có thể được dùng để đăng ký người dùng mới vào ứng dụng của bạn thông qua đường liên kết email.

Node.js

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

Java

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)

Tiến hành

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);

Sau khi tạo, bạn có thể chèn đường liên kết vào email đăng nhập tuỳ chỉnh, sau đó gửi qua email tới người dùng tương ứng bằng máy chủ SMTP tuỳ chỉnh.

Tìm hiểu thêm về cách xác thực người dùng bằng Firebase bằng đường liên kết email. Việc này sẽ giúp cung cấp thông tin về cách hoàn tất quy trình đăng nhập sau khi người dùng nhấp vào đường liên kết và được chuyển hướng trở lại ứng dụng.