언리얼 엔진 - 게임 프로젝트/AWS GameLift를 활용한 데디케이트 FPS 프로젝트

Access Tokens - 10) GetUser API의 사용

monstro 2026. 6. 21. 16:34
728x90
반응형

- 개요

AWS Cognito UserPools에서 제공하는 GetUser API를 사용하여 

로그인한 사용자가 자신의 프로필 정보 속성을 조회할 수 있도록 설정한다

조회한 정보중에서 사용자명이메일 주소를 가져오고 이를 위젯 블루프린트에서 사용하도록 설계한다

 

- AWS 콘솔 작업

1) CognitoSignIn 람다 함수에 적용할 정책 생성 및 적용

CognitoSignIn 람다 함수에 적용할 정책 생성

 

로그인을 진행하는 CognitoSignIn 람다 함수에 적용할 정책을 생성한다

해당 정책은 로그인에서만 사용하므로 인라인 정책으로 생성한다

CognitoUserPools 서비스의 GetUser API를 사용한다

 

 

위와 같이 생성한 인라인 정책CognitoSignIn 람다 함수에 적용한다

 

2) CognitoSignIn 람다 함수 코드 수정

import { CognitoIdentityProviderClient, InitiateAuthCommand, GetUserCommand } from "@aws-sdk/client-cognito-identity-provider";

export const handler = async (event) => {
  const cognitoIdentityProviderClient = new CognitoIdentityProviderClient( { region: process.env.REGION } );
  const { username, password, refreshToken } = event;

  if (refreshToken) {
    const refreshTokensInput = {
      AuthFlow: "REFRESH_TOKEN_AUTH",
      ClientId: process.env.CLIENT_ID,
      AuthParameters: {
        REFRESH_TOKEN: refreshToken
      }
    };
    
    const initiateAuthCommand = new InitiateAuthCommand(refreshTokensInput);
    
    try {
      const initiateAuthResponse = await cognitoIdentityProviderClient.send(initiateAuthCommand);
      return initiateAuthResponse;
    } catch(error) {
      console.error(error);
      return error;
    }
  } else {
    const initiateAuthInput = {
      AuthFlow: "USER_PASSWORD_AUTH",
      ClientId: process.env.CLIENT_ID,
      AuthParameters: {
        USERNAME: username,
        PASSWORD: password
      }
    };
    
    const initiateAuthCommand = new InitiateAuthCommand(initiateAuthInput);
  
    try {
      const initiateAuthResponse = await cognitoIdentityProviderClient.send(initiateAuthCommand);
      const getUserInput = {
        AccessToken: initiateAuthResponse.AuthenticationResult.AccessToken
      };
      const getUserCommand = new GetUserCommand(getUserInput);
      const getUserResponse = await cognitoIdentityProviderClient.send(getUserCommand);

      let emailAttribute;
      for(const attribute of getUserResponse.UserAttributes){
        if(attribute.Name === "email") {
          emailAttribute = attribute.Value;
          break;
        }
      }
      const response = {
        ...initiateAuthResponse,
        email: emailAttribute
      };

      return response;
    } catch(error) {
      return error;
    }
  }
};

 

기존의 CognitoSignIn 람다 함수의 코드를 위와 같이 수정한다

  • 로그인 성공 후에 GetUserCommand 명령어를 사용하여 사용자 상세 정보를 조회
  • 조회된 사용자 속성 배열을 순회하면서 이메일 주소를 찾아 저장
  • 인증 결과만 반환하던 기존의 코드와 다르게 새로운 오브젝트를 생성하여 인증 결과 + 이메일 주소를 반환

 

- 스크립트 작업

1) HTTPRequestTypes 클래스

헤더 파일

 

cpp 파일

 

서버에서 반환된 인증 처리 결과를 저장하는 DSInitiateAuthResponse 구조체

이메일 주소 멤버변수를 추가하여 이메일 주소를 저장한다

또, Dump 함수에서 이메일 주소와 관련된 로그를 남기도록 수정한다

 

2) DSLocalPlayerSubsystem 클래스

 

DSLocalPlayerSubsystem 클래스멤버변수를 추가하여

서버에서 반환된 인증처리 결과를 바탕으로 유저 이름이메일 주소를 저장한다

 

3) PortalManager 클래스

 

서버에서 반환된 로그인 수행 결과를 처리하는 SignIn_Response 함수에 위의 로직을 추가한다

로그인 수행 결과를 바탕으로 DSLocalPlayerSubsystem에 추가한 사용자 이름이메일 주소를 저장한다

 

4) AccountDropdown 클래스

 

기존의 드롭다운 UI 클래스를 확장한 AccountDropdown 클래스를 추가한다

사용중인 드롭다운 위젯 블루프린트부모 클래스를 해당 클래스로 변경한다

 

 

필요한 데이터를 연동하는 NativeConstruct 함수를 위와 같이 구성하여

DSLocalPlayerSubsystem에서 저장한 사용자명을 사용하여 버튼의 텍스트를 설정한다

 

 

GetLocalPlayerSubsystem 함수를 구현하여 DSLocalPlayerSubsystem을 반환한다

 

5) AccountDropdown_Expanded 클래스

 

TextBlock_Email 멤버변수를 추가하여 로그인한 사용자의 이메일 주소를 표현한다

 

헤더 파일

 

cpp 파일

 

GetLocalPlayerSubsystem 함수를 구현하여 DSLocalPlayerSubsystem을 반환한다

 

 

NativeConstruct 함수에 로직을 추가하여

DSLocalPlayerSubsystem에 저장된 이메일 주소를 텍스트 블록 UI에 적용한다

 

 

SignOutButton_OnClicked 함수에서 GetLocalPlayerSubsystem 함수를 사용하도록 수정한다

 

- 블루프린트 작업

1) WBP_Dropdown 위젯 블루프린트

 

드롭다운 위젯 블루프린트부모 클래스를 변경한다

 

2) WBP_Expanded 위젯 블루프린트

 

로그인한 사용자의 이메일 주소를 보여줄 텍스트 블록 위젯을 추가한다

 

- 최종 실행 결과

로그인 실행 결과 (1)

 

로그인 실행 결과 (2)

728x90
반응형