Node.js
여권 통합
수색…
비고
암호는 항상 해시되어야합니다. NodeJS 를 사용하여 암호를 보호하는 간단한 f} 은 bcrypt-nodejs 모듈을 사용하는 것입니다.
시작하기
여권 은 passport.initialize()
미들웨어를 사용하여 초기화해야합니다. 로그인 세션을 사용하려면 passport.session()
미들웨어가 필요합니다.
passport.serialize()
및 passport.deserializeUser()
메서드를 정의해야합니다. Passport 는 사용자 인스턴스를 세션간에 직렬화 및 비 직렬화합니다.
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const cookieParser = require('cookie-parser');
const app = express();
// Required to read cookies
app.use(cookieParser());
passport.serializeUser(function(user, next) {
// Serialize the user in the session
next(null, user);
});
passport.deserializeUser(function(user, next) {
// Use the previously serialized user
next(null, user);
});
// Configuring express-session middleware
app.use(session({
secret: 'The cake is a lie',
resave: true,
saveUninitialized: true
}));
// Initializing passport
app.use(passport.initialize());
app.use(passport.session());
// Starting express server on port 3000
app.listen(3000);
로컬 인증
Passport-Local 모듈은 로컬 인증을 구현하는 데 사용됩니다.
이 모듈을 사용하면 Node.js 응용 프로그램에서 사용자 이름과 암호를 사용하여 인증 할 수 있습니다.
사용자 등록 :
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
// A named strategy is used since two local strategy are used :
// one for the registration and the other to sign-in
passport.use('localSignup', new LocalStrategy({
// Overriding defaults expected parameters,
// which are 'username' and 'password'
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true // allows us to pass back the entire request to the callback .
},
function(req, email, password, next) {
// Check in database if user is already registered
findUserByEmail(email, function(user) {
// If email already exists, abort registration process and
// pass 'false' to the callback
if (user) return next(null, false);
// Else, we create the user
else {
// Password must be hashed !
let newUser = createUser(email, password);
newUser.save(function() {
// Pass the user to the callback
return next(null, newUser);
});
}
});
});
사용자 로그인 :
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
passport.use('localSignin', new LocalStrategy({
usernameField : 'email',
passwordField : 'password',
},
function(email, password, next) {
// Find the user
findUserByEmail(email, function(user) {
// If user is not found, abort signing in process
// Custom messages can be provided in the verify callback
// to give the user more details concerning the failed authentication
if (!user)
return next(null, false, {message: 'This e-mail address is not associated with any account.'});
// Else, we check if password is valid
else {
// If password is not correct, abort signing in process
if (!isPasswordValid(password)) return next(null, false);
// Else, pass the user to callback
else return next(null, user);
}
});
});
경로 만들기 :
// ...
app.use(passport.initialize());
app.use(passport.session());
// Sign-in route
// Passport strategies are middlewares
app.post('/login', passport.authenticate('localSignin', {
successRedirect: '/me',
failureRedirect: '/login'
});
// Sign-up route
app.post('/register', passport.authenticate('localSignup', {
successRedirect: '/',
failureRedirect: '/signup'
});
// Call req.logout() to log out
app.get('/logout', function(req, res) {
req.logout();
res.redirect('/');
});
app.listen(3000);
Facebook 인증
여권 - 페이스 북 모듈은 페이스 북 인증을 구현하는 데 사용됩니다. 이 예에서 로그인 할 때 사용자가 존재하지 않으면 해당 사용자가 생성됩니다.
전략 구현 :
const passport = require('passport');
const FacebookStrategy = require('passport-facebook').Strategy;
// Strategy is named 'facebook' by default
passport.use({
clientID: 'yourclientid',
clientSecret: 'yourclientsecret',
callbackURL: '/auth/facebook/callback'
},
// Facebook will send a token and user's profile
function(token, refreshToken, profile, next) {
// Check in database if user is already registered
findUserByFacebookId(profile.id, function(user) {
// If user exists, returns his data to callback
if (user) return next(null, user);
// Else, we create the user
else {
let newUser = createUserFromFacebook(profile, token);
newUser.save(function() {
// Pass the user to the callback
return next(null, newUser);
});
}
});
});
경로 만들기 :
// ...
app.use(passport.initialize());
app.use(passport.session());
// Authentication route
app.get('/auth/facebook', passport.authenticate('facebook', {
// Ask Facebook for more permissions
scope : 'email'
}));
// Called after Facebook has authenticated the user
app.get('/auth/facebook/callback',
passport.authenticate('facebook', {
successRedirect : '/me',
failureRedirect : '/'
}));
//...
app.listen(3000);
간단한 사용자 이름 - 암호 인증
경로 / index.js에서
여기서 user
는 userSchema의 모델입니다.
router.post('/login', function(req, res, next) {
if (!req.body.username || !req.body.password) {
return res.status(400).json({
message: 'Please fill out all fields'
});
}
passport.authenticate('local', function(err, user, info) {
if (err) {
console.log("ERROR : " + err);
return next(err);
}
if(user) (
console.log("User Exists!")
//All the data of the user can be accessed by user.x
res.json({"success" : true});
return;
} else {
res.json({"success" : false});
console.log("Error" + errorResponse());
return;
}
})(req, res, next);
});
Google Passport 인증
우리는 고글 authetication 이름 여권 - google-oauth20 npm에서 사용할 수있는 간단한 모듈을 가지고
다음 예를 생각해 봅시다.이 예제에서는 루트 디렉토리에 passport.js 및 google.js 파일이있는 config라는 폴더를 만들었습니다. app.js 파일에는 다음이 포함됩니다.
var express = require('express');
var session = require('express-session');
var passport = require('./config/passport'); // path where the passport file placed
var app = express();
passport(app);
// 서버 초기화를위한 다른 코드, 에러 핸들
config 폴더의 passport.js 파일에 다음 코드가 포함되어 있습니다.
var passport = require ('passport'),
google = require('./google'),
User = require('./../model/user'); // User is the mongoose model
module.exports = function(app){
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function(user, done){
done(null, user);
});
passport.deserializeUser(function (user, done) {
done(null, user);
});
google();
};
동일한 설정 폴더에있는 google.js 파일에는 다음이 포함됩니다.
var passport = require('passport'),
GoogleStrategy = require('passport-google-oauth20').Strategy,
User = require('./../model/user');
module.exports = function () {
passport.use(new GoogleStrategy({
clientID: 'CLIENT ID',
clientSecret: 'CLIENT SECRET',
callbackURL: "http://localhost:3000/auth/google/callback"
},
function(accessToken, refreshToken, profile, cb) {
User.findOne({ googleId : profile.id }, function (err, user) {
if(err){
return cb(err, false, {message : err});
}else {
if (user != '' && user != null) {
return cb(null, user, {message : "User "});
} else {
var username = profile.displayName.split(' ');
var userData = new User({
name : profile.displayName,
username : username[0],
password : username[0],
facebookId : '',
googleId : profile.id,
});
// send email to user just in case required to send the newly created
// credentails to user for future login without using google login
userData.save(function (err, newuser) {
if (err) {
return cb(null, false, {message : err + " !!! Please try again"});
}else{
return cb(null, newuser);
}
});
}
}
});
}
));
};
이 예에서는 사용자가 DB에 있지 않은 경우 사용자 모델에서 googleId라는 필드 이름을 사용하여 로컬 참조를 위해 DB에 새 사용자를 만듭니다.