メールのアクション リンクを生成する

モバイルアプリでは、メールを送信してユーザーに働きかけ、特定の操作を行うことを促す場合があります。

Firebase のクライアント SDK は、パスワードの再設定、メールアドレスの確認、メールベースのログインに使用できるリンクを含むメールをユーザーに送信する機能を備えています。テンプレート ベースのこれらのメールは Google によって送信され、カスタマイズには制限があります。

代わりに独自のメール テンプレートとメール配信サービスを使用する場合は、このページで、Firebase Admin SDK を使用して上記のフローのアクション リンクをプログラムで生成する方法をご確認ください。このアクション リンクはユーザーへのメールに含めることができます。

これには、次の利点があります。

  • メール テンプレートのカスタマイズ。これには、新しいスタイルやカスタム ブランディングの追加、表現やロゴの変更、フルネームではなくファーストネームによるユーザーへの呼びかけなどの機能が含まれます。
  • コンテキストに応じた異なるテンプレートの適用。たとえば、ユーザーがニュースレターに登録するために自分のメールアドレスを確認している場合は、メール コンテンツでコンテキストを提供する必要があります。別の例として、メールリンク ログインがあります。これは同じユーザーによってトリガーされる場合や、別のユーザーからの招待としてトリガーされる場合があります。コンテキストをメールに含める必要があります。
  • カスタマイズされたメール テンプレートのローカライズ。
  • 安全なサーバー環境からリンクを生成する機能。
  • モバイルアプリやブラウザでリンクを開く方法や、追加の状態情報を渡す方法などをカスタマイズする機能。
  • メール アクション リンクの構築時にモバイルアプリ フローに使用されるダイナミック リンク ドメインをカスタマイズし、コンテキストやモバイルアプリに応じて異なるダイナミック リンク ドメインを指定する機能。

ActionCodeSettings を初期化する

メール アクション リンクを生成するには、ActionCodeSettings インスタンスを初期化する必要が生じる場合があります。

ActionCodeSettings により、ユーザーがメールリンクをクリックした後にアクセスできる続行 URL を介して追加の状態を渡すことができます。これにより、ユーザーはアクションの完了後にアプリに戻ることもできます。また、モバイルアプリ(モバイルアプリがインストールされている場合)やブラウザからメール アクション リンクが直接処理されるようにデベロッパー側で指定することも可能です。

モバイルアプリで開かれるリンクについては、Firebase Dynamic Links を有効にして、モバイルアプリからこれらのリンクを検出するためのタスクを実行する必要があります。メール アクションについては、Firebase Dynamic Links の構成方法をご覧ください。

ActionCodeSettings インスタンスを初期化するには、次のデータを入力します。

パラメータ 説明
url 文字列

コンテキストによって異なる意味を持つリンク(状態 / 続行 URL)を設定します。

  • リンクがウェブ アクション ウィジェットで処理される場合、これは continueUrl クエリ パラメータのディープリンクを表します。
  • リンクがアプリ内で直接処理される場合、これはダイナミック リンクのディープリンク内の continueUrl クエリ パラメータを表します。
iOS ({bundleId: string}|undefined) バンドル ID を設定します。これにより、Apple アプリがインストールされていれば、そのアプリでリンクを開くことを試みます。このアプリはコンソールに登録されている必要があります。
android ({packageName: string, installApp:boolean|undefined, minimumVersion: string|undefined}|undefined) Android パッケージ名を設定します。これにより、Android アプリがインストールされている場合に、そのアプリでリンクを開くことを試みます。デバイスでサポートされている Android アプリがまだインストールされていない状態で installApp が渡された場合は、その値によってそのアプリをインストールするかを決定します。packageName を指定せずにこのフィールドが渡された場合、「このフィールドの packageName を指定する必要があります」という内容のエラーがスローされます。minimumVersion が指定され、古いバージョンのアプリがインストールされている場合、ユーザーは Play ストアにリダイレクトされ、アプリのアップグレードを促されます。Android アプリはコンソールに登録されている必要があります。
handleCodeInApp (boolean|undefined) メール アクション リンクがモバイルアプリとウェブリンクのどちらで最初に開かれるかを示します。デフォルトは false です。true に設定すると、アクション コード リンクはユニバーサル リンクまたは Android アプリリンクとして送信され、アプリがインストールされている場合はそのアプリで開かれます。false の場合、コードは最初にウェブ ウィジェットに送信され、続いてアプリがインストールされている場合はそのアプリにリダイレクトされます。
dynamicLinkDomain (string|undefined) Firebase Dynamic Links を使用してリンクを開く場合は、現在のリンクに使用するダイナミック リンク ドメイン(またはサブドメイン)を設定します。プロジェクトごとに複数のダイナミック リンク ドメインを構成できるため、このフィールドでドメインを明示的に選択できます。指定しない場合、デフォルトで最も古いドメインが使用されます。

次の例は、モバイルアプリで最初に Firebase ダイナミック リンクとして開かれるメール確認リンクを送信する方法を示しています(Apple アプリ com.example.ios または Android アプリ com.example.android がまだインストールされていない場合はインストールされます。また、最小バージョンは 12 です)。ディープリンクには、続行 URL ペイロード https://www.example.com/checkout?cartId=1234 が含まれています。使用されるダイナミック リンク ドメインは coolapp.page.link です。このドメインは、Firebase Dynamic Links で使用するように構成する必要があります。

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

Go

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

Go

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

Go

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

Go

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 でのユーザーの認証をご覧ください。これは、ユーザーがリンクをクリックしてアプリにリダイレクトされた後に、ログインを完了する方法を提供するのに役立ちます。