본문 바로가기

Youtube Clone Coding

깃허브로 로그인 하기 (4)

이전 글에서 확인 했듯이, 유저의 email이 비공개였다. 나는 유저의 이메일이 필요하므로 이를 알아내는 코드를 작성해보았다. Github API에 가서 내가 필요한 것들을 찾아보았다. 내가 scope에 작성했던 user:email 에 해당하는 api 중에 이메일을 보여주는 것은 다음과 같다.

GET https://api.github.com/user/emails

따라서 유저의 데이터를 얻어오는 과정과 똑같이 액세스토큰을 사용하여 변수에 저장해준다.

const emailData = await (
            await fetch(`${apiUrl}/user/emails`, {
                headers: {
                    Authorization: `token ${access_token}`,
                },
            })
        ).json();

이렇게 한 후, emailData를 console.log 해보면 다음과같이 나온다.

이제 여기서 우리가 원하는 이메일을 가져오면 된다. 우리가 원하는 이메일은 primary 와 verified가 true인 이메일이다. 따라서 다음과같이 코드를 작성한다.

const emailObj = emailData.find(
      (email) => email.primary === true && email.verified === true
);
if (!emailObj) {
    return res.redirect("/login");
}

원하는 이메일을 emailObj 변수에 넣어주게 되었다. 이제 해당 이메일로 특정 유저를 찾을 수 있다. 예를들어 이미 "깃허브로 로그인 하기" 로 계정을 만든 사람이 있다면 이사람은 그냥 로그인 시켜주면 된다. 하지만 이메일을 가진 유저가 찾아봤는데 없다면 , 새로운 계정을 만들어주는 것이다. (비밀번호 칸은 "" 로 초기화 하면 됨) 나는 이미 유저 데이터를 POST로 받은적이 있기 때문에 이를 통해서 이름과 유저네임을 설정해줄 수 있게된다.

let user = await User.findOne({ email: emailObj.email });
if (!user) {
    user = await User.create({
        avatarUrl: userData.avatar_url,
        name: userData.name,
        username: userData.login,
        email: emailObj.email,
        password: "",
        socialOnly: true,
        location: userData.location,
    });
}
req.session.loggedIn = true;
req.session.user = user;
return res.redirect("/");

socialOnly는 깃허브로 로그인하기 를 통해 아이디를 만든경우 비밀번호가 없기 때문에 이를 구분하기 위해서 추가한 것이다. 

또 avatarUrl은 깃허브에서 제공하는 것으로, 이것이 없다면 유저네임과 비밀번호로 아이디를 만들었다는 뜻이 된다. 

'Youtube Clone Coding' 카테고리의 다른 글

사용자 프로필 수정  (0) 2022.11.17
카카오로 로그인 하기  (0) 2022.11.17
깃허브로 로그인 하기 (3)  (0) 2022.11.16
깃허브로 로그인하기 (2)  (0) 2022.11.16
깃허브로 로그인 하기 (1)  (0) 2022.11.16