[TIL] 25.01.13 MON

GDORI·2025년 1월 13일
0

TIL

목록 보기
161/184
post-thumbnail

Git OAuth

어제 OAuth 이론에 이어 오늘은 Node.js 서버에 작성하여 올려보았다.

oAuthLogin 서비스 레이어

oAuthLogin 메서드

  async oAuthLogin(code) {
    // OAuth 액세스토큰 취득
    const gitAccessToken = await this.getAccessToken(code);

    // 액세스토큰으로 사용자 정보 취득
    const userData = await this.getGitData(gitAccessToken);

    // 사용자 정보로 DB 조회 (없으면 생성)
    const isExistUser = await this.authRepository.getUserById(userData.login);
    let { username, nickname, profile_image } = isExistUser;

    if (!isExistUser) {
      await this.authRepository.createUser(userData);
      username = userData.login;
      nickname = userData.name;
      profile_image = userData.avatar_url;
    }

    // JWT 토큰 생성
    const accessToken = await this.tokenManager.createAccessToken(userData.login);
    const refreshToken = await this.tokenManager.createRefreshToken(userData.login);

    if (!accessToken || !refreshToken) {
      console.log(accessToken, refreshToken);
      throw new CustomErr(ERR_CODES.INTERNAL_SERVER_ERROR, 'Error creating token');
    }

    return {
      accessToken,
      refreshToken,
      username,
      nickname,
      profile_image,
    };
  }

getAccessToken 메서드

async getAccessToken(code) {
    // OAuth 액세스토큰 취득 로직
    const response = await fetch(url.git.accessToken, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        client_id: config.git.client_id,
        client_secret: config.git.client_secret,
        code,
      }),
    });

    if (!response.ok) {
      // 에러 처리
      logger.error(`Error getting git access token : ${response.status}`);
      throw new CustomErr(ERR_CODES.INTERNAL_SERVER_ERROR, 'Error getting git access token');
    }

    const data = await response.text();
    const accessToken = new URLSearchParams(data).get('access_token');

    return accessToken;
  }

getGitData 메서드

  async getGitData(accessToken) {
    // 사용자 정보 취득 로직
    const response = await fetch(url.git.userData, {
      method: 'GET',
      headers: {
        Authorization: `token ${accessToken}`,
        'Content-Type': 'application/json',
      },
    });

    if (!response.ok) {
      // 에러 처리
      logger.error(`Error getting git Data : ${response.status}`);
      throw new CustomErr(ERR_CODES.INTERNAL_SERVER_ERROR, 'Error getting git Data');
    }

    const userData = await response.json();

    return userData;
  }

catch의 경우 컨트롤러에서 에러핸들러가 처리해주고 있기 때문에 따로 try-catch로 감싸지는 않았다.
위의 메서드들은 서비스레이어 클래스 일부이다.

깃 로그인 요청 후 리디렉션 되는 로직으로 반환이 잘 되는 것을 확인했다.

profile
하루 최소 1시간이라도 공부하자..

0개의 댓글

관련 채용 정보