페이스북 인증처리를 계속해서 진행해보도록 하자.

새로운 페이스북 전략을 작성하는 코드에서, 페이스북 정보를 가져오는 코드를 작성해보자.

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 변수에 새롭게 저장할 형태를 만들고, (authIddisplayName 을 넣어서!!) 사용자의 정보를 저장하는 users 배열에 넣고, serializeUser 로 newuser 객체를 보낸다.