Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // config/passport.js
- var LocalStrategy = require('passport-local').Strategy;
- var FacebookStrategy = require('passport-facebook').Strategy;
- var User = require('../models/user');
- var configAuth = require('./auth');
- module.exports = function(passport) {
- // passport session setup ==================================================
- // required for persistent login sessions
- // passport needs ability to serialize and unserialize users out of session
- // used to serialize the user for the session
- passport.serializeUser(function(user, done) {
- done(null, user.id);
- });
- // used to deserialize the user
- passport.deserializeUser(function(id, done) {
- User.findById(id, function(err, user) {
- done(err, user);
- });
- });
- // FACEBOOK ================================================================
- passport.use(new FacebookStrategy({
- // pull in our app id and secret from our auth.js file
- clientID : configAuth.facebookAuth.clientID,
- clientSecret : configAuth.facebookAuth.clientSecret,
- callbackURL : configAuth.facebookAuth.callbackURL,
- passReqToCallback : true,
- profileFields :['id', 'name', 'emails']
- },
- // 處理 facebook 回傳的 token & 個人資料
- function(req, token, refreshToken, profile, done) {
- process.nextTick(function() {
- if(!req.user){
- // 在 DB 找 facebook id
- User.findOne({ 'facebook.id' : profile.id }, function(err, user) {
- if (err)
- return done(err);
- if (user) {
- if (!user.facebook.token) {
- user.facebook.token = token;
- user.facebook.name = profile.name.givenName + ' ' + profile.name.familyName;
- user.facebook.email = profile.emails[0].value;
- user.save(function(err) {
- if (err)
- throw err;
- return done(null, user);
- });
- }
- return done(null, user); // user found, return that user
- } else {
- // 如果沒有該USER則新增
- var newUser = new User();
- // set all of the facebook information in our user model
- newUser.facebook.id = profile.id;
- newUser.facebook.token = token;
- newUser.facebook.name = profile.name.familyName + ' ' + profile.name.givenName;
- newUser.facebook.email = profile.emails[0].value;
- newUser.save(function(err) {
- if (err)
- throw err;
- return done(null, newUser);
- });
- }
- });
- }else{
- // user already exists and is logged in, we have to link accounts
- var user = req.user; // pull the user out of the session
- // update the current users facebook credentials
- user.facebook.id = profile.id;
- user.facebook.token = token;
- user.facebook.name = profile.name.givenName + ' ' + profile.name.familyName;
- user.facebook.email = profile.emails[0].value;
- // save the user
- user.save(function(err) {
- if (err)
- throw err;
- return done(null, user);
- });
- }
- });
- }));
- // LOCAL 註冊 ============================================================
- passport.use('local-signup', new LocalStrategy({
- usernameField : 'email',
- passwordField : 'password',
- passReqToCallback : true
- },
- function(req, email, password, done) {
- process.nextTick(function() {
- User.findOne({'local.email' : email}, function(err, user) {
- if (err)
- return done(err);
- if (user) {
- return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
- } else {
- var newUser = new User();
- newUser.local.email = email;
- newUser.local.password = newUser.generateHash(password);
- newUser.save(function(err) {
- if (err)
- throw err;
- return done(null, newUser);
- });
- }
- });
- });
- }));
- // LOCAL 帳號綁定 ============================================================
- passport.use('local-connect', new LocalStrategy({
- usernameField : 'email',
- passwordField : 'password',
- passReqToCallback : true
- },
- function(req, email, password, done) {
- process.nextTick(function() {
- User.findOne({$or :[{'local.email' : email}, {'facebook.email' : email}]}, function(err, user) {
- if (err)
- return done(err);
- if (user && user.local.email == email) {
- return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
- } else {
- var connect_user;
- if(user.facebook.email == email){
- connect_user = user;
- }else{
- connect_user = new User();
- }
- connect_user.local.email = email;
- connect_user.local.password = connect_user.generateHash(password);
- connect_user.save(function(err) {
- if (err) throw err;
- return done(null, connect_user);
- });
- }
- });
- });
- }));
- // =========================================================================
- // LOCAL LOGIN =============================================================
- // =========================================================================
- // we are using named strategies since we have one for login and one for signup
- // by default, if there was no name, it would just be called 'local'
- passport.use('local-login', new LocalStrategy({
- // by default, local strategy uses username and password, we will override with email
- usernameField : 'email',
- passwordField : 'password',
- passReqToCallback : true // allows us to pass back the entire request to the callback
- },
- function(req, email, password, done) { // callback with email and password from our form
- // find a user whose email is the same as the forms email
- // we are checking to see if the user trying to login already exists
- User.findOne({ 'local.email' : email}, function(err, user) {
- // if there are any errors, return the error before anything else
- if (err)
- return done(err);
- // if no user is found, return the message
- if (!user)
- return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash
- // if the user is found but the password is wrong
- if (!user.validPassword(password))
- return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata
- // all is well, return successful user
- return done(null, user);
- });
- }));
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement