はじめに
私が担当しているシステムではユーザー認証に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
最後に
調べたことは以上になります。もっといい方法があるかもしれませんが、目的は達成できました。最後まで読んでいただきありがとうございました。