😊

Amplifyでメールを使った招待機能を実装する方法

2024/03/18に公開

株式会社 Purpom-Media-Lab でエンジニアをしております、おかやんです!
とある案件で「Amplify」を使い、契約管理画面でよく使う、招待機能を実装しました。
Amplify を使って、招待機能を実装しようとしている方の参考になれば幸いです。

Hello! Purpom-Media-Lab

Purpom Media Lab inc では、AWS Amplify や、Lambda などの Serverless Stack を中心とした高速 MVP 構築及びサービス価値の検証を行っています。
https://purpom-media-lab.com/

また、MVP を構築するだけでなく、AWS Amplify を中心としたオープンソースの機能改善、基盤構築を行っています。
https://zenn.dev/purpom/articles/12538dec010be8
https://zenn.dev/kaiki_kk/articles/a4af3086c54914
https://zenn.dev/kaiki_kk/articles/24c5b95df8daa8

前提

下記のことが実装済みの前提で作成。

  • Next.js に Amplify を追加
  • Amplify に、下記を追加
    • auth
    • api
    • function(lambda)

やったこと

以下の流れに沿った招待フローを、amplify を使って実装しました。
また、lambda を呼び出す際に、appSync 経由で呼び出しています。

「メールを使った招待フロー」

  1. 指定したメールアドレスに招待の送信
  2. 届いたメールからアカウントの登録
  3. 認証完了

ここから、上記のフローの実装例をご紹介します。

1. メールアドレスに招待の送信

admin 権限でユーザーを招待するには、AWS SDK の「AdminCreateUserCommand」を使用する必要があります。

import * as AWS from "@aws-sdk/client-cognito-identity-provider";

const client = new AWS.CognitoIdentityProviderClient({
  region: "ap-northeast-1",
});

const createInviteUserMutation = async (
  email: string,
  familyName: string,
  givenName: string,
  userPoolId: string
) => {
  const input: AWS.AdminCreateUserCommandInput = {
    UserPoolId: userPoolId,
    Username: email,
    UserAttributes: [
      {
        Name: "family_name",
        Value: familyName,
      },
      {
        Name: "given_name",
        Value: givenName,
      },
    ],
  };

  await client.send(new AWS.AdminCreateUserCommand(input));
};

このように、client に対して AdminCreateUserCommand を呼び出すことで、よくある招待メールを簡単に送ることができます。

export const handler = async (
  event: HandlerArguments
): Promise<CognitoCustomMessageResponse> => {
  if (!event.triggerSource) {
    console.error("missing triggerSource parameter");
    const e = new Error("internal server error");
    throw e;
  }

  try {
    switch (event.triggerSource) {
      case "CustomMessage_AdminCreateUser": {
        const url = `${process.env.DOMAIN}/auth/login`;

        event.response.emailMessage = `
            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br>
            管理者から招待されました<br>
            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br>
            以下の情報でログインを実施し、パスワードの再設定をお願いします。<br>
            <br>
            メールアドレス: ${event.request.usernameParameter}<br>
            仮パスワード: ${event.request.codeParameter}<br>
            <br>
            ${url}<br>
            <br>
            認証コードの有効期限は7日間になります。<br>
            期限を過ぎると記載のURLから登録できなくなるのでご注意ください。<br>
            <br>
            `;
        event.response.emailSubject = "アカウント招待のお知らせ";
        break;
      }

      default:
        break;
    }
    return event;
  } catch (e) {
    console.error("Failed to custom message");
    return event;
  }
};

2~3. 届いたメールからアカウントの登録から認証

以下の様なメールが届きました。
あとはあらかじめ指定しておいた URL から認証画面に飛んでいただき、仮パスワードを入力すればアカウント登録が完了します。

最後に

今回は、Amplify と AWS SDK を使用してメールアドレスを使用したユーザの招待フローの実装例をご紹介させていただきました。
Amplify を使った初めての実装だったため、appsync 経由で typescript を使った lambda を呼び出す方法から苦労しましたが、なんとか実装できました。

今後も、引き続き Amplify を使った実装をチャレンジしていきます。

参考

https://docs.amplify.aws/javascript/build-a-backend/functions/build-options/

https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/cognito-identity-provider/command/AdminCreateUserCommand/

https://docs.amplify.aws/javascript/tools/cli/usage/lambda-triggers/

PURPM MEDIA LAB Tech blog

Discussion