oAuth 로그인 구현(4)

coolchaem·2022년 7월 12일
0

toyproject

목록 보기
21/21

서버에서 사용자 정보를 가져와 저장하는 과정까지이다.

1. 인가코드받기
2. 토큰받기

3. 사용자 정보가져오기
4. 디비 저장하기

5. 서비스 세션 생성
6. 클라이언트 로그인 프로필 표시
7. 리프레시 토큰 쿠키 생성

이전

인가코드로 받아왔던 토큰정보가 지난주까지 한 것이다.

    const tokenInfo = await axios.post(
      `${process.env.KAKAO_AUTH_TOKEN_URL}?grant_type=authorization_code&client_id=${process.env.KAKAO_CLIENT_ID}&redirect_uri=${process.env.KAKAO_REDIRECT_URL}&code=${req.query.code}&client_secret=${process.env.KAKAO_CLIENT_SECRET}`
    );
    const { access_token, token_type, refresh_token, refresh_token_expires_in, expires_in, scope } =
      tokenInfo.data;

사용자 정보 가져오기

access token으로 정보를 가져올 수 있는데 get method로 사용자 정보를 요청하는 api를 서버에서 호출한다.

    const user = await axios({
      method: 'get',
      url: 'https://kapi.kakao.com/v2/user/me',
      headers: {
        Authorization: `Bearer ${access_token}`,
      },
    });
    console.log(user);

그러고나면 프로필 정보와 계정권한이 나온다.

  data: {
    id: /**/,
    connected_at: '2022-07-11T14:02:33Z',
    properties: {
      nickname: 'coolchaem',
      profile_image: 'http://k.kakaocdn.net/~~~.jpg',
      thumbnail_image: 'http://k.kakaocdn.net/~~~.jpg'
    },
    kakao_account: {
      profile_nickname_needs_agreement: false,
      profile_image_needs_agreement: false,
      profile: [Object],
      has_email: true,
      email_needs_agreement: false,
      is_email_valid: true,
      is_email_verified: true,
      email: '~@~.com'
    }
  }

DB 저장

가져온 프로필 정보로 각자 회원 정보 DB table 스키마에 맞게 저장하면 된다.
user_name, email_addr, velog_name, is_certified, thumbnail 순으로 우린 관리하고 있다.

    // 다양한 예외처리를 생각해볼 수 있다. 계정권한이 대표적
    const accountInfo = user.data.kakao_account;
    if (accountInfo.profile_nickname_needs_agreement || accountInfo.email_needs_agreement) {
      return response.redirect('http://localhost:9000', 401);
    }

    // 실제 DB 저장
    const userProps = user.data.properties;
    const validEmail = accountInfo.is_email_valid && accountInfo.is_email_verified;
    dbConn.query(
      `INSERT INTO public."BLOG_USERS" 
        (user_name, email_addr, velog_name, is_certified, thumbnail) VALUES 
        ('${userProps.nickname}', '${accountInfo.email}', '${userProps.nickname}', ${validEmail}, '${userProps.profile_image}');`,
      err => {
        console.error(err);
      }
    );
profile
Front-end developer

0개의 댓글