이전 글에서 확인 했듯이, 유저의 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 |