Nodejs기초 - 14일차 정리(페이스북 활용)
1. 페이스북으로 로그인
- 페이스북은 Oauth 인증으로 외부 앱이나 사이트에서 페이스북 계정에 접근할 수 있도록 허용
- Oauth 인증은 개방형 표준 프토로콜(Open Standard Protocol)로 만들어짐
- npm 설치환경(package.json)
{ "name": "PassportExample2", "version": "0.0.1", "private": true, "scripts": { "start": "node app.js" }, "dependencies": { "body-parser": "^1.18.3", "connect-flash": "^0.1.1", "cookie-parser": "^1.4.3", "ejs": "^2.6.1", "errorhandler": "^1.5.0", "express": "^4.16.4", "express-error-handler": "^1.1.0", "express-session": "^1.15.6", "mongoose": "^4.13.18", "passport": "^0.3.2", "passport-facebook": "^2.1.1", "passport-google-oauth": "^1.0.0", "passport-local": "^1.0.0", "passport-twitter": "^1.0.4", "serve-static": "^1.13.2" } }
- 페이스북 개발자 홈페이지 사이트 : https://developers.facebook.com/
1) 오른쪽 상단에 내앱 클릭후 새 앱 추가
2) 새 앱 ID만들기
3) 필요한 API 선택후 클릭
4) 페이스북 로그인 설정 클릭하면 웹 Oauth 로그인 예로 되어있는지 체크 + 유효한 Oauth 리디렉션 URI 설정
(단, localhost 인경우 설정안해도됨)
- 페이스북 로그인을 위한 환경설정 적용
- passport 모듈사용시 필요한 정보들
module.exports = { server_port: 7001, db_url: 'mongodb://localhost:27017/local', db_schemas: [ {file:'./user_schema', collection:'users6', schemaName:'UserSchema', modelName:'UserModel'} ], route_info: [ ], facebook: { // passport facebook clientID: '123456789', clientSecret: '123456789', callbackURL: '/auth/facebook/callback' } }
- 스키마 정의
// 스키마 정의 var UserSchema = mongoose.Schema({ email: {type: String, 'default':''} , hashed_password: {type: String, 'default':''} , name: {type: String, index: 'hashed', 'default':''} , salt: {type:String} , created_at: {type: Date, index: {unique: false}, 'default': Date.now} , updated_at: {type: Date, index: {unique: false}, 'default': Date.now} , provider : {type : String, 'default' : ''} , authToken : {type : String, 'default' :''} , facebook : { } });
- 에러:
- 에러코드 :
var FacebookStrategy = require('passport-facebook').Strategy; var config = require('../config'); module.exports = function(app, passport) { return new FacebookStrategy({ clientID: config.facebook.clientID, clientSecret: config.facebook.clientSecret, callbackURL: config.facebook.callbackURL }, function(accessToken, refreshToken, profile, done) { console.log('passport의 facebook 호출됨.'); console.dir(profile); var options = { criteria: { 'facebook.id': profile.id } }; var database = app.get('database'); database.UserModel.load(options, function (err, user) { if (err) return done(err); if (!user) { var user = new database.UserModel({ name: profile.displayName, email: profile.emails[0].value, provider: 'facebook', authToken: accessToken, facebook: profile._json }); user.save(function (err) { if (err){ console.log(err);} return done(err, user); }); } else { return done(err, user); } }); }); };
- 해결코드 :
var FacebookStrategy = require('passport-facebook').Strategy; var config = require('../config'); module.exports = function(app, passport) { return new FacebookStrategy({ clientID: config.facebook.clientID, clientSecret: config.facebook.clientSecret, callbackURL: config.facebook.callbackURL, profileFields: ['id', 'emails', 'displayName'] // 수집할 데이터컬럼명 }, function(accessToken, refreshToken, profile, done) { console.log('passport의 facebook 호출됨.'); console.dir(profile); var options = { 'facebook': { 'facebook' : profile.id} }; var database = app.get('database'); database.UserModel. findOne (options, function (err, user) { if (err) return done(err); if (!user) { var user = new database.UserModel({ name: profile.displayName, email: profile.emails[0].value, provider: 'facebook', authToken: accessToken, facebook: profile._json }); user.save(function (err) { if (err){ console.log(err);} return done(err, user); }); } else { return done(err, user); } }); }); };
- 해결화면 :
- 페이스북 수집할수있는 데이터 : https://developers.facebook.com/docs/facebook-login/permissions
- 몽구스(mongoose) : https://mongoosejs.com/docs/queries.html#
from http://kururu.tistory.com/31 by ccl(A) rewrite - 2020-03-07 02:54:09
댓글
댓글 쓰기