티스토리 뷰

Node.js에는 고맙게도 OAuth 처리를 해주는 모듈들이 존재하는데 대표적으로 사용하는 것 중에 하나인 passport-facebook을 테스트 해보다 생긴 이슈들을 정리해본다.


1. facebook 개발자 사이트에 앱을 추가할 때 콜백 URL을 명시해야 한다.

처음에 호스트 주소만 입력했더니 콜백 값을 못 받아와서 무슨 문제인지 한참 찾아보았는데 요청을 보낸 후 정보를 받아올 라우터 주소까지 입력을 해야 한다.


2. facebook에서 가져오는 정보를 설정하는 법

passport-facebook을 사용하기 위해 처음 참조한 책에 따르면 아무런 설정 없이 emails, username, providerId 등을 참조하는데 현재 사용하는 모듈에서는 적용되지 않는 것으로 나타났다.


검색 결과 profileField를 FacebookStrategy를 생성할 때 적용하면 된다고 나와 있어서 해보았다.

passport.use(new FacebookStrategy({

clientID: 클라이언트 ID,

clientSecret: 앱 시크릿 코드,

callbackURL: 콜백 URL,

passReqToCallback: true,

profileFields: ['id','emails','username'] //이 필드는 적용이 되지 않는 것 같다.

},

하지만 이 프로파일이 제대로 적용되지 않았고 username은 facebook OAuth가 v2.0이 넘어가면서 deprecated되었나는 에러 메시지가 나왔다.


다음으로 찾아본 정보에 의하면 라우팅에서 passport.authenticate을 할 때 scope 설정값을 넣는 방법이었는데 

passport 공식 사이트의 레퍼런스에 나온 정보여서 확실히 믿을만 했다.



다음과 같이 scope 설정을 하니 원하는 정보가 제대로 들어왔다.


페이스북에서 제공 받을 수 있는 정보는 페이스북 개발자 페이지에서 찾을 수 있었는데 현재 지원하는 권한은 다음과 같다.


그 중 기본 권한인 public_profile은 다음과 같은 정보를 제공하는데 

scope: ['public_profile', 'email'] 로 설정을해서

받은 profile 객체를 콘솔에 찍어보면


{ id: '아이디',

  username: undefined,

  displayName: undefined,

  name: 

   { familyName: '성',

     givenName: '이름',

     middleName: undefined },

  gender: undefined,

  profileUrl: undefined,

  emails: [ { value: '이메일' } ],

  provider: 'facebook',

  _raw: '{"id":"아이디","email":"이메일","last_name":"성","first_name":"이름"}',

  _json: 

   { id: '아이디',

     email: '이메일',

     last_name: '성',

     first_name: '이름',

     accessToken: '액세스 토큰',

     refreshToken: undefined } }


이런 구조로 기본 권한으로 주는 정보와 emails 필드로 이메일 정보가 value 필드안에 들어 있는 것을 볼 수 있다.


댓글