Amazon Cognitoの招待メール、パスワードリセット メールを多言語化する

2024.01.30

はじめに

私が担当しているシステムではユーザー認証にAWS Cognitoを使っています。システムを多言語化する計画があるため、Cognitoから送信されるメールを多言語化する方法を調べました。

前提

  • Cognitoは サインアップ時とパスワードリセット時にコードの入ったメールが来ます。
  • Cognitoのメールの文面はカスタムメッセージトリガーで作成しています。カスタムメッセージトリガーに関しては以下の記事をご覧ください。

CognitoのカスタムメッセージLambdaトリガーを使ってみた

サインアップとパスワードリセットの呼び出し

サインアップ、パスワードリセット時にAuthクラスのファンクションの呼び出しますが、これに言語の情報を含めるようにします。以下はTypescriptの例です。

サインアップの場合

navigator.language でブラウザの言語設定を取得します。Chromeで試したところ、日本語の場合は "ja" でした。この値をattributesのlocaleプロパティに入れます。

const param = {
  username: [メール名],
  password: [パスワード],
  attributes: {
    email: [メールアドレス],
    locale: navigator.language
  },
};
await Auth.signUp(param);

パスワードリセットの場合

パスワードリセットの場合は以下の例の様に forgotPassword の第2引数にlocaleを指定します。

await Auth.forgotPassword(username, { locale: navigator.language });

カスタムメッセージトリガー

カスタムメッセージトリガーのLambdaを実装します。日本語以外のlocaleが設定されていた場合は英語にしています。サインアップとパスワードリセットでそれぞれ日本語、英語のパターンがあるので4パターンあります。今回はPython3で実装してみました。

サインアップとパスワードリセットのメール本文はほぼ同じですが、コードの有効期限が違うため、そこだけ後から代入しています。サインアップは24時間でパスワードリセットは1時間です。有効期限は固定で変更できません。。

import os

message_template_ja = '''<html>
<head></head>
<body>
  <p>コード:{{####}} </p>
  <p>※コードの有効期限は{limit}となります。</p>
  </body>
</html>
'''.strip()

message_template_en = '''<html>
<head></head>
<body>
  <p>Your code is {{####}} </p> <br/>
  <p>* The code expires after {limit}.</p>
</body>
</html>
'''.strip()

def custom_message_create_handler(event, context):
    subject = None
    message_template = None
    limit = None

    if event['triggerSource'] == 'CustomMessage_SignUp':
        if event['request']['userAttributes']['locale'] == 'ja':
            # サインアップ 日本語の場合
            subject='新規アカウント作成'
            message_template = message_template_ja
            limit='24時間'
        else:
            # サインアップ 英語の場合
            subject='Registration Confirmation'
            message_template = message_template_en
            limit='24 hours'
    elif event['triggerSource'] == 'CustomMessage_ForgotPassword':
        if event['request']['clientMetadata']['locale'] == 'ja':
            # パスワードリセット 日本語の場合
            subject='パスワードリセット'
            message_template = message_template_ja
            limit='1時間'
        else:
            # パスワードリセット 英語の場合
            subject='Reset password'
            message_template = message_template_en
            limit='1 hour'

    message = message_template.format(limit=limit)        
    event['response']['emailSubject'] = subject
    event['response']['emailMessage'] = message
    event['response']['smsMessage'] = message
    return event

最後に

調べたことは以上になります。もっといい方法があるかもしれませんが、目的は達成できました。最後まで読んでいただきありがとうございました。