필자는 최근 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을 사용 하는 곳을 주석처리 후, 빈 값을 넣어서 해결을 보았다.
해당 모듈을 예전에 사용할때는 이런 문제가 없었는데, 최근에 사용 할 때는 이렇게 된걸 보면..
뭔가 모듈이 업데이트가 안됐거나, 네이버 정책이 바뀌었거나.. 둘중 하나의 문제일 것 같다.