7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cognitoを使用したOIDCログインとユーザー情報の取得

Last updated at Posted at 2025-01-31

はじめに

前回の記事では、AWS Cognitoを用いたOIDC(OpenID Connect)に関する設定方法について解説しました。前回はCognitoのマネージドログイン(ホスト型UI)を使用しましたが、今回はその仕組みを外し、直接OIDCのログインを行う方法を説明します。

注意点

IDトークンの署名検証

  • 取得したIDトークンは、そのまま使用せず、必ず署名検証を行ってください。

ユーザー情報の適切な管理

  • 取得したユーザー情報はセキュリティを考慮し、適切に扱う必要があります。

  • 不要なデータの保存や漏洩を防ぐため、ログへの出力などには特に注意してください。

リダイレクトURLの変更

今回の実装ではCognitoのマネージドログインを使用せず、oidc-client-ts を利用してログイン処理を行います。

そのため、CognitoのリダイレクトURLを適切に設定する必要があります。

CognitoのリダイレクトURLは適切に設定しないと認証フローが正常に動作しません。
OIDCプロバイダー(Google, LINE, Facebookなど)を使用する場合でも、認証後にCognitoがリダイレクトするため、AWS Cognitoのアプリクライアント設定で正しいURLを登録する必要があります。

設定例

本番環境: https://example.com/callback
ローカル環境: http://localhost:3000/callback

TypeScriptによる実装

以下のTypeScriptコードでは、Cognitoを利用したOIDC認証を行い、ユーザー情報を取得する方法を実装しています

必要なライブラリ

oidc-client-ts を使用します。

import type { UserManagerSettings, User } from "oidc-client-ts";
import { UserManager } from "oidc-client-ts";

// `UserManager` の設定

const cognitoAuthConfig: UserManagerSettings = {
  authority: `https://cognito-idp.${AWS_REGION}.amazonaws.com/${COGNITO_USER_POOL_ID}`,
  client_id: COGNITO_CLIENT_ID,
  redirect_uri: REDIRECT_URI,
  response_type: "code",
  scope: "openid", //設定したスコープを指定
};


const userManager = new UserManager(cognitoAuthConfig);

/**
 * ユーザー情報を取得
 */
const getUser = async () => {
  try {
    const user = await userManager.getUser();
    return user;
  } catch (error) {
    console.error("ユーザー情報の取得に失敗しました:", error);
    return null;
  }
};
/**
 * ログイン処理 (リダイレクト方式)
 * @param identity_provider - ログインするIDプロバイダー(Cognitoで設定したプロバイダー名)
 */
const login = async (identity_provider: string) => {
  await userManager.signinRedirect({
    extraQueryParams: {
      identity_provider,
    },
  });
};

/**
 * ログイン状態を確認
 */
const checkLoginStatus = async () => {
  const user = await userManager.getUser();
  if (user && user.id_token) {
    return
  } else {
    await userManager.signinRedirectCallback();
  }
};


/**
 * ログアウト処理
 */
const logout = async () => {
  await userManager.signoutRedirect();
};

export function useUserManager() {
  return {
    getUser,
    login,
    logout,
    checkLoginStatus,
  };
}

リダイレクトURL

REDIRECT_URIはCognitoに設定するURLと合わせてください。

ログイン処理

login(identity_provider: string): 指定したIDプロバイダーでリダイレクト方式のログインを実行します。

identity_provider には、Cognitoに設定したプロバイダー名(例: Google や Facebook など)を指定します。

ログイン状態の確認

checkLoginStatus(): ユーザーのログイン状態を確認し、未ログインの場合はログイン画面へリダイレクトします。

ユーザー情報の取得

getUser(): ログイン済みのユーザー情報を取得します。

ログアウト処理

logout(): Cognitoからのログアウト処理を行います。

まとめ

本記事では、AWS Cognitoを用いたOIDC認証の設定から、ログイン・ユーザー情報の取得・ログアウトまでの基本的な実装方法を紹介しました。Cognitoの設定でGoogleなどもIDプロバイダーとして追加すれば、複数の認証方法をサポートできます。

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?