페이스북 인증처리를 계속해서 진행해보도록 하자.
새로운 페이스북 전략을 작성하는 코드에서, 페이스북 정보를 가져오는 코드를 작성해보자.
function(accessToken, refreshToken, profile, done) {
// console.log 를 통해서 profile에 무엇이 들어가있는지 확인해보자.
console.log(profile);
// 페이스북 상에서의 id 값을 가져와야한다. (굉장히 중요한 요소)
// 페이스북으로 인증한 사용자이기 때문에, facebook 과 식별값인 profile.id 를 가져온다.
var authId = 'facebook:' + profile.id;
// user 객체로 넣을 객체 배열을 정의한다.
// 사용자가 이미 존재하다면, 추가할 필요가 없기 때문에 존재한지 먼저 파악해야한다.
for (var i = 0; i < users.length; i++) {
var user = users[i];
// user 객체에 authid 값과 현재 로그인할때의 authId 과 같다면,
// 이미 존재한 사용자이다.
if (user.authId === authId) {
// 이미 user 객체에 사용자가 있을 때
// done 의 두 번째 인자로 user가 들어가면, 이미 존재한 유저라는 것을 의미한다.
return done(null, user);
}
}
// user 객체에 사용자가 없다면
var newuser = {
'authId': authId,
// local과 facebook 둘 다 displayName 이 똑같은 요소로 들어가고있다.
'displayName': profile.displayName
//username 으로 계속해서 식별을 했는데, 이제는 authId를 통해서 식별을 해야한다.
//그렇게 되면, 어떤 값을 식별값으로 해야할지 정해야하는데, 우리는 authId 로 통일한다.
};
users.push(newuser);
// 새로운 사용자를 보내서, serializeUser 를 실행한다.
done(null, newuser);
}
함수를 통해서 전달받은 정보를 담는 인자 profile 을 찍어보면 해당 정보를 담고있다는 것을 볼 수 있다.
(console.log(profile)
)
{
id: '3013299475421902',
username: undefined,
displayName: '김지훈',
name: {
familyName: undefined,
givenName: undefined,
middleName: undefined
},
gender: undefined,
profileUrl: undefined,
provider: 'facebook',
_raw: '{"name":"\\\\uae40\\\\uc9c0\\\\ud6c8","id":"3013299475421902"}',
_json: { name: '김지훈', id: '3013299475421902' }
}
해당 정보에서 가져와야할 정보는 id 와 displayName 이다.
페이스북에서 가져온 id 를 새로운 변수에 담고, for 문을 통해서 users 배열에 해당 사용자의 정보가 있는지 없는지를 파악한다.
만약, 사용자의 정보가 있다면,
return done(null, user);
을 통해서 serializeUser 로 해당 유저의 정보를 담은 객체를 보내고,
만약, 사용자의 정보가 없다면, newuser
변수에 새롭게 저장할 형태를 만들고, (authId
와 displayName
을 넣어서!!) 사용자의 정보를 저장하는 users 배열에 넣고, serializeUser 로 newuser 객체를 보낸다.