TOPコラム一覧ユースカジノ 登録ログイン/ログアウトを考える

ユースカジノ 登録
ユースカジノ 登録/ログアウトを考える

はじめに

こんにちは、build service でユースカジノ 登録アーキテクトをしている丸山です。

今回は Amazon Cognito を使用して、別々のユースカジノ 登録ケーションに同じユーザー情報を使ってログインする方法と global sign out を実施したときのユースカジノ 登録ケーション挙動についてご紹介します。

※ 正式名称は ユースカジノ 登録 ですが、以降 Cognito と表記させていただきます。

Cognito とは?

Cognito とはモバイルや Web ユースカジノ 登録ケーションを作る際の認証/認可のために使用することができるサービスです。

ユーザーによるサインアップ機能や外部の ID プロバイダーなどと連携したユーザー認証、SAML、OpenID Connect、ソーシャル ID プロバイダー (Amazon、 Apple、 Facebook、 Google、 X など) による認証など、ユーザー認証/認可に必要な機能が一通り揃っており、インフラのスケールも AWS 管理のため運用負荷を最小限に抑えて認証機能を Web/Mobile ユースカジノ 登録ケーションに組み込むことができます。

念の為、ユースカジノ 登録と認可についての補足も記載して起きます。

  • 認証: ユースカジノ 登録の身元を確認することを意味する
  • 認可: ユースカジノ 登録にリソースにアクセスするための権限を与えることを意味する

今回は Cognito の機能のうち、ユースカジノ 登録た認証の機能について取り上げますが、詳細な説明については下記の公式ドキュメントを参照ください。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools.html

1つの User pool を使用して複数のユースカジノ 登録ケーションにログイン機能を実装する

まずそれぞれのユースカジノ 登録ケーションでログインできるようにする

ユースカジノ 登録User pool は 1 つで、複数のユースカジノ 登録ケーションに同じユーザー情報を使用してログインするユースカジノ 登録について取り上げます。

コンシューマー向けユースカジノ 登録ケーションの場合、最近ではソーシャル ID プロバイダーを利用して認証するものも一般的になっているので上記のようなケースはそれほど多くはないと思いますが、外部の ID プロバイダーを使用できない環境下で、複数のユースカジノ 登録ケーションを運用する必要がある場合には Cognito の User pool を使って実現することもできます。

以降で CDK (TypeScript 版) ユースカジノ 登録て必要なリソースを定義する方法を紹介します。
(リソース定義でユースカジノ 登録な部分のみ抜き出して記載しています)

まずは ユースカジノ 登録 の作成です。

今回はユースカジノ 登録する処理だけを作ることにしますので Identity pool の設定は不要になりますが、ユースカジノ 登録したユーザーで S3 など AWS リソースにアクセスが必要な場合には Identity pool も設定してください。

const userPool = new UserPool(this, 'UserPool', {
    userPoolName: 'multi-app-test-pool',
    removalPolicy: cdk.RemovalPolicy.DESTROY,
  });

CDK ユースカジノ 登録ている場合、デフォルトの設定が存在するため userPoolName, removalPolicy どちらも設定せずとも使用することはできます。

今回は User pool を見つけやすくするためと、検証終了後に User pool を残すユースカジノ 登録がないので上記のような設定にしておりますが、これ以外にもカスタマイズ可能な多くの設定が存在しますので、ユースカジノ 登録に応じて設定を追加していただければと思います。

次はこの User pool を使用して Web ユースカジノ 登録からログインできるように App client を追加しますが、この App client は使用するユースカジノ 登録毎に作成します。

App client の詳細ユースカジノ 登録は下記の公式ドキュメントを参照ください。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-settings-client-apps.html

userPool.addClient('FirstAppClient', {
    userPoolClientName: 'FirstAppClient',
    authFlows: {
      userSrp: true,
    },
  });

  userPool.addClient('SecondAppClient', {
    userPoolClientName: 'SecondAppClient',
    authFlows: {
      userSrp: true,
    },
  });

今回は 2 つのユースカジノ 登録ケーションを使用しますので、2 つの client を作成しました。

これらをデプロイすると、userPoolId、userPoolClientId などは具体的な ID が割り当てられるのでそれらを使って Web ユースカジノ 登録側で認証機能の設定を行います。
ユースカジノ 登録 Amplify v6 の設定の例で見てみます。

interface AuthConfig {
    Cognito: {
      userPoolClientId: string;
      userPoolId: string;
    };
  }

  type AmplifyConfig = {
    Auth: AuthConfig;
  };

  const amplifyConfig: AmplifyConfig = {
    Auth: {
      Cognito: {
        userPoolId: 'ユースカジノ 登録',
        userPoolClientId: 'ユースカジノ 登録',
      },
    },
  };

  Amplify.configure(amplifyConfig);

AuthConfig は下記を参考に定義していますので、より詳しいユースカジノ 登録は Amplify のドキュメントを参照ください。

https://docs.amplify.aws/gen1/javascript/tools/libraries/configure-categories/

ユースカジノ 登録設定をし、Amplify の auth module が提供しているsignInmethod を呼び出すことで Cognito に登録したユーザーでユースカジノ 登録ケーションにログインすることができます。

ユースカジノ 登録情報入力の回数を減らす

ここまでで、それぞれのユースカジノ 登録ケーションで username と password を入力して signIn 処理を実施すればログインできますが、同じユーザー情報を使ってログインする必要のある別のユースカジノ 登録ケーションの場合、 username と password の入力の回数 (現在は FirstApp で 1 回、SecondApp で 1 回の計 2 回) を減らすことができるとユーザーとしても使い勝手が良くなりそうです。

上記を実現するためにユースカジノ 登録変更を加えます。

  • ユースカジノ 登録画面を Cognito の Hosted UI に変更して各 Web app では username, password の入力をしないように変更
  • 各 Web app ユースカジノ 登録signInユースカジノ 登録なくsignInWithRedirectユースカジノ 登録 Cognito の Hosted UI にリダイレクトして認証するように変更

Cognito の Hosted UI ユースカジノ 登録するに当たり User pool に domain を追加します。

userPool.addDomain('CognitoDomain', {
    cognitoDomain: {
      domainPrefix: 'multi-app-test-domain',
    },
  });

さらに、各 Web app 用の UserPoolClient に OAuth の設定を追加します。

import { OAuthScope } from 'aws-cdk-lib/aws-cognito';

  // ...

  userPool.addClient('FirstAppClient', {
    userPoolClientName: 'FirstAppClient',
    authFlows: {
      userSrp: true,
    },
    oAuth: {
      callbackUrls: ['http://localhost:3001'],
      logoutUrls: ['http://localhost:3001'],
      flows: { authorizationCodeGrant: true, implicitCodeGrant: false },
      scopes: [OAuthScope.EMAIL, OAuthScope.OPENID, OAuthScope.PHONE, OAuthScope.COGNITO_ADMIN],
    }
  });

  userPool.addClient('SecondAppClient', {
    userPoolClientName: 'SecondAppClient',
    authFlows: {
      userSrp: true,
    },
    oAuth: {
      callbackUrls: ['http://localhost:3002'],
      logoutUrls: ['http://localhost:3002'],
      flows: { authorizationCodeGrant: true, implicitCodeGrant: false },
      scopes: [OAuthScope.EMAIL, OAuthScope.OPENID, OAuthScope.PHONE, OAuthScope.COGNITO_ADMIN],
    }
  });

CDK のユースカジノ 登録はここまでです。

次は Web app の Amplify の設定を見直します。

type OAuthScope = 'openid' | 'email' | 'phone' | 'profile' | 'aws.cognito.signin.user.admin';

  // loginWith 以下が追加
  interface AuthConfig {
    Cognito: {
      userPoolClientId: string;
      userPoolId: string;
      loginWith: {
        oauth: {
          domain: string;
          scopes: OAuthScope[];
          redirectSignIn: string[];
          redirectSignOut: string[];
          responseType: 'code' | 'token';
        };
      };
    };
  }

  // 変更なし
  type AmplifyConfig = {
    Auth: AuthConfig;
  };

  // loginWith 以下の設定を追加
  // FirstApp の設定例
  const amplifyConfig: AmplifyConfig = {
    Auth: {
      Cognito: {
        userPoolId: 'ユースカジノ 登録',
        userPoolClientId: 'ユースカジノ 登録',
        loginWith: {
          oauth: {
            // https:// 部分は不要
            // <cognito-domain で設定した prefix.auth.<region.amazoncognito.com の形式で記載
            domain: 'ユースカジノ 登録',
            scopes: ['openid', 'email', 'phone', 'aws.cognito.signin.user.admin'],
            redirectSignIn: ['http://localhost:3001'],
            redirectSignOut: ['http://localhost:3001'],
            responseType: 'code',
          },
        },
      },
    },
  };

  Amplify.configure(amplifyConfig);

ユースカジノ 登録 Web app を起動している server が local PC 上の開発サーバーを想定して localhost の URL を記載していますが、実際には Web app が配信されている server の URL を設定します。

同様の Amplify 設定を 2 つの Web app で行い、FirstApp で ユースカジノ 登録 に遷移して username と password を実施します。

その後、SecondApp を開き signInWithRedirect を呼び出すボタンを押すと Cognito の Hosted UI に遷移したあと既にユースカジノ 登録済みの扱いとなり、すぐに redirectSignIn の項目で設定した URL にリダイレクトが行われます。

リダイレクトされたあとの SecondApp では Cognito のユーザー情報が Amplify の API (getCurrentUser など) を使用して取得可能になっているため、ユースカジノ 登録を完了している状態として扱うことができます。

今回は SecondApp 側でもサユースカジノ 登録ユースカジノ 登録のボタンを設置し、それを押すことで認証処理が実行されるようにしましたが、特定の URL や特定のパラメータが付与されている場合は自動的に認証処理を実行するように実装を行うことで、より自然な画面遷移を実現できるのではないかと思います。

ユースカジノ 登録時の挙動の注意

サインアウト時の挙動が Web app のユースカジノ 登録しているユーザーを確認する機能の実装に影響を与えることがありますので、注意事項として共有しておきます。

ユースカジノ 登録 を見るとsignOutユースカジノ 登録 method には{ global: boolean }というオプションが存在し、これを true で指定したうえで signOut を呼び出すと、同じ UserPool を使用している他のユースカジノ 登録ケーションからもログアウトすることができます。

ユースカジノ 登録、sign out に関する Amplify の公式ドキュメントです。

https://docs.amplify.aws/javascript/build-a-backend/auth/connect-your-frontend/sign-out/

ドキュメントを確認すると、global sign-out が呼び出されると refresh token が無効になるため access token、 id token の更新時にエラーが出るようになりますが、access token と id token の有効期限は token 発行後 1 時間であるため、最長で 1 時間は他のユースカジノ 登録ケーションでログインセッションが継続される可能性があります。

access token や id token の期限が切れるまではそのまま動作しても問題なければ特段対策を講じる必要はないのですが、他の端末、他のユースカジノ 登録ケーションでログアウトが行われた際、今操作しているユースカジノ 登録ケーションでも即座にログアウトさせたい場合には、使用している token (access token か id token) が有効なのかをチェックする必要があります。

Amplify には token の有効性を確認するためだけの用途の関数は用意されていないため、以下のような方法を検討するユースカジノ 登録がありそうです。

  • ユースカジノ 登録
  • token ユースカジノ 登録する API を call して API 側で token の有効性をチェックしてもらう

ユースカジノ 登録については、Cognito のドキュメントに JWT の検証のためのユースカジノ 登録とライブラリが紹介されているので参考にしていただければと思います。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html#amazon-cognito-user-pools-using-tokens-aws-jwt-verify

2 つ目のユースカジノ 登録として紹介したtoken ユースカジノ 登録する API を call して API 側で token の有効性をチェックしてもらうという方法ですが、今回はちょうど Cognito に登録された User に設定されている属性情報を取得するユースカジノ 登録があったのでこちらを活用してみました。

ユースカジノ 登録 から提供されているfetchUserAttributesがこれに該当するのですが、ユースカジノ 登録関数を呼び出すと cognito-idp の endpoint に通信が行われ、access token が無効だとNotAuthorizedException: ユースカジノ 登録 has been revokedユースカジノ 登録エラーが返却されます。

これを活用してユースカジノ 登録ように処理を作成してみました。

{
    try {
      const { userId, username } = await getCurrentUser();
      const { locale } = await fetchUserAttributes();

      const userInfo: UserInfo = {
        userId,
        username,
        locale: locale ?? 'none',
      };

      return userInfo;
    } catch (e) {
      console.warn(`findUserInfo error: `, e);

      // 他のユースカジノ 登録ケーションでサインアウトしている場合はこのエラー処理にたどり着くので この app からもサインアウトする
      // 本来であれば Error の詳細を確認して `NotAuthorizedException: Access Token has been revoked`
      // だった場合にのみこの処理を呼び出すほうがよい
      await signOut();

      return null;
    }
  };

こちらの処理をユースカジノ 登録ケーション起動時や何かしらのユーザー操作に紐づけて実行されるように実装することで、他のユースカジノ 登録ケーションでログアウト処理が行われた場合に即座にログアウトするという挙動を実現することができるようになります。

※ 今回の実装では、開いているユースカジノ 登録ケーションが自動的にログアウトする挙動ではなく、ユーザーによる何らかの処理をトリガーに上記の判定処理を回してログアウトする処理になります。ユーザー操作なしに自動的にログアウトさせる必要がある場合はもう少し工夫が必要になります。

まとめ

Cognito の User pool を活用して、複数のユースカジノ 登録ケーションでログインに必要な手間を削減する方法と、複数のユースカジノ 登録ケーションから同時にサインアウトする方法についてご紹介しました。

要件によっては Cognito を利用できないケースなども存在するかもしれませんが、Cognito が提供している機能と同等の仕組みを自前で用意しようと思うと多大な工数が必要となると思いますので、Web/Mobile ユースカジノ 登録の開発を検討中で Cognito の利用に対して何らかの制約 (社内のルールやネットワーク的にそもそも Cognito の API と通信できないなど) がない場合には積極的に活用を検討すると良いのではないかと思います。

カジノゲームは、AWSのビジネス利活用に向けて、お客様のステージに合わせた幅広い構築・運用支援サービスを提供しています。
経験豊富なエンジニアが、ワンストップかつ柔軟にご支援します。
ぜひ、お気軽にお問い合わせユースカジノ 登録。

お問い合わせ

関連ウェビナー

【著者プロフィール】

丸山 貴嗣(まるやま たかし)

伊藤忠テクノユースカジノ 登録ズ株式会社 ユースカジノ 登録アーキテクト

自社 Cloud サービスの企画開発からプログラマーに転向し、モバイルユースカジノ 登録、Web ユースカジノ 登録、API 開発など様々な開発プロジェクトに従事。 現在は build service のソリューションアーキテクトとして Cloud を活用したシステム/ユースカジノ 登録の設計/開発の領域で活動中。

丸山 貴嗣(まるやま たかし)

TOPコラム一覧ユースカジノ 登録ログイン/ログアウトを考える

pagetop