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
User Data
|
- 몽구스(mongoose) : https://mongoosejs.com/docs/queries.html#
Mongoose models provide several static helper functions for CRUD operations. Each of these functions returns amongoose |
반응형
'WEB > Node JS' 카테고리의 다른 글
Nodejs기초 - 16일차 정리(JSON-RPC) (2) | 2019.02.07 |
---|---|
Nodejs기초 - 15일차 정리(채팅 1대1) (0) | 2019.02.04 |
Nodejs기초 - 13일차 정리(패스포트 모듈 사용) (0) | 2019.01.27 |
Nodejs기초 - 12일차 정리(pug템플릿 사용 및 상속, 패스포트 정의) (0) | 2019.01.26 |
Nodejs기초 - 11일차 정리(Semantic UI 활용, MVC패턴, 응답 페이지 모듈화[ejs]) (0) | 2019.01.26 |