2017-09-28
필자는 최근 google, facebook, kakao, naver에서 제공하는 api로 passport 로그인을 구현 해봤다.
다른 것들은 다 잘 됐는데.. 유독 naver만 오류가 떠서 여기에 올려본다.

일단 오류는 아래와 같다.
TypeError: Cannot read property '0' of undefined at /home/b1ix_API/node_modules/passport-naver/lib/strategy.js:60:51 at Parser. (/home/b1ix_API/node_modules/xml2js/lib/parser.js:303:18) at emitOne (events.js:115:13) at Parser.emit (events.js:210:7) at SAXParser.onclosetag (/home/b1ix_API/node_modules/xml2js/lib/parser.js:261:26) at emit (/home/b1ix_API/node_modules/sax/lib/sax.js:624:35) at emitNode (/home/b1ix_API/node_modules/sax/lib/sax.js:629:5) at closeTag (/home/b1ix_API/node_modules/sax/lib/sax.js:889:7) at SAXParser.write (/home/b1ix_API/node_modules/sax/lib/sax.js:1436:13) at Parser.exports.Parser.Parser.parseString (/home/b1ix_API/node_modules/xml2js/lib/parser.js:322:31) at Parser.parseString (/home/b1ix_API/node_modules/xml2js/lib/parser.js:5:59) at /home/b1ix_API/node_modules/passport-naver/lib/strategy.js:49:24 at passBackControl (/home/b1ix_API/node_modules/oauth/lib/oauth2.js:134:9) at IncomingMessage. (/home/b1ix_API/node_modules/oauth/lib/oauth2.js:157:7) at emitNone (events.js:110:20) at IncomingMessage.emit (events.js:207:7) at endReadableNT (_stream_readable.js:1045:12) at _combinedTickCallback (internal/process/next_tick.js:138:11) at process._tickCallback (internal/process/next_tick.js:180:9)

우선 오류 첫줄인 /home/b1ix_API/node_modules/passport-naver/lib/strategy.js:60:51 이부분으로 가서 소스를 살펴보니,
58    profile.id = json.enc_id[0];
59    profile.displayName = json.nickname[0];
60    profile.emails = [{ value: json.email[0] }];
61    .....
62    .....
위와 같은 구문이 있었다.

그래서 console.log(json)으로 json에 들어가 있는 내용을 살펴보니...
{ nickname: [ 'b1ix' ], enc_id: [ '1234asdf1234asdf234asdf' ], profile_image: [ 'https://ssl.pstatic.net/static/pwe/address/img_profile.png' ], age: [ '30-39' ], gender: [ 'M' ], id: [ '123123123123' ], birthday: [ '12-13' ] }
위처럼.. email만 쏙 빠져 있더라..

그래서, 네이버 개발자 센터의 설정중 email을 추가 권한 설정을 했지만, 여전히 잘 안됐고...

결국
 59    profile.displayName = json.nickname[0];
 60 // profile.emails = [{ value: json.email[0] }];
 61    profile.emails = '';
 62    json.id = json.enc_id[0];
 63    profile._json = {
 64 // email: json.email[0],
 65    email: '',
 66    nickname: json.nickname[0],
위처럼 email을 사용 하는 곳을 주석처리 후, 빈 값을 넣어서 해결을 보았다.

해당 모듈을 예전에 사용할때는 이런 문제가 없었는데, 최근에 사용 할 때는 이렇게 된걸 보면..
뭔가 모듈이 업데이트가 안됐거나, 네이버 정책이 바뀌었거나.. 둘중 하나의 문제일 것 같다.