[유튜브 클론코딩] 6.8 Github Login Part.3

2021. 3. 11. 18:10Projects/유튜브 클론코딩

728x90
반응형

6.8 Github Login Part.3

githubLoginCallback 함수 수정하기

export const githubLoginCallback = (accessToken, refreshToken, profile, cb) => {

    console.log(accessToken, refreshToken, profile, cb);

};

지난시간에 깃허브 로그인 누르고 콜백함수로 돌아올 때

console에 주어진 정보를 확인만 했었다. 이제 그것을 수정하려고 한다.

사실 accessToken, refreshToken이런건 필요 없고 profile에 있는 github ID, 이메일, 이름, 그리고 아바타(프로필 사진) 이게 중요하다!

 

그리고 여기서 cb 함수는 passport에서 제공된 callback 함수이다. 이 콜백 함수는 인증에 성공한 상황에서 호출이 되어야 한다.

예를 들면 이 부분에서 user를 찾거나(find) 생성할 것이다.(create)

그 다음에는 두 가지 경우가 가능한데,

  • 성공했을 때 : 하나는 cb를 호출할 때 에러 없이 user를 넣어주는 것- 에러가 없다고 하고 user object를 넣고 함수를 호출하면 passport는 사용자를 찾았다고 알게 될 것이다. 그러면 passport user ID 쿠키에 넣어줄 거고 그리고 local 방식(username+password 방식) 인증할 때와 똑같은 것을 해줄 것이다.
  • 실패했을 때 : 만약 user object 없이 에러만 넣어서 cb 함수를 호출하면 passport는 우리가 사용자를 찾지 못한 걸로 알게 될 것이다.

 

export const githubLoginCallback = async (accessToken, refreshToken, profile, cb) => {

    const {_json : { id, avatar_url, name, email}} = profile;

    try{

        const user = await User.findOne({email});

        if(user){

            user.githubId = id;

            user.save();

            return cb(null, user);

        }

            const newUser = await User.create({

                email,

                name,

                githubId:id,

                avatarUrl : avatar_url

            });

            return cb(null, newUser);

    }catch(error){

        return cb(error);

    }

};

↑ userController.js

 

우리는 try 구문에서 깃헙으로 부터 온 email과 동일한 email을 가진 사용자를 찾을 것이다.

우리가 전에 User 스키마를 작성할 때 githubId를 선언해준 적이 있었다.

만약에 그 동일한 email을 가진 사용자를 발견하면 그 사용자의 정보를 업데이트할 것이다.

그런 유저를 찾으면 그 유저의 githubId를 id(이건 _json에서 가져온 id)로 할당해주고, save를 해준다.

그리고 이메일이 동일한 사용자를 찾았을 때 cb 함수를 호출할 것이다. - 첫번째 매개변수인 에러는 없음(null) , 두번째 매개변수인 user는 찾았습니다. - 그래서 이걸 쿠키에 저장할 수 있게 된다.

만약 사용자를 찾지 못했다면 새로운 계정을 만들어 준다.

그리고 이 때는 콜백함수로 null,newUser를 전달해준다.

 

깃허브 계정 이메일을 private가 아닌 public으로 바꿔주기

깃허브 계정이 private로 되어 있으면 실행해도 오류가 날 수 있다.

public으로 바꿔주면 잘 된다.

 

 

 

 

728x90
반응형