Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – Passport中的自定义重定向大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试为我的第@L_197_0@面向公众的节点应用程序设置基本身份验证.我有两种护照策略:1)Facebook和2)Twitter.我不打算至少暂时包含电子邮件/密码系统,直到我了解安全隐患.
我已经能够让他们以开箱即用的方式工作,并在Mongoose中创建新用户.

我现在想要重复扣除社交帐户用户.因此,每当有新用户通过twitter auth进入时,我想将它们重定向到收集电子邮件页面.我保存作为会话变量返回的令牌和配置文件对象,并在将表单作为隐藏字段提交时将在该页面上重用它们.

但是,我无法理解如何使用Passport实现此方面.这是我到目前为止的代码,其中包含对我要对每个部分做什么的评论.基本上我正在检查twitter用户是否是旧用户,如果不是我正在设置我将在/ addemail页面上重用的会话变量,初始化用户对象(以便serialize,Deserialize函数有一些行为(不确定我理解)什么序列化/反序列化实际上.)现在如果用户新用户,会话变量NewTwitterUser为true,我在auth / callBACk url中检查它以将用户重定向到适当的页面.但是这不起作用.

//basic modules and setup
var express = require('express'),passport = require('passport'),mongoose = require('mongoose'),http = require('http'),util = require('util'),TwitterStrategy = require('passport-twitter').Strategy,FacebookStrategy = require('passport-facebook').Strategy,path = require('path');

var app = express();


//Mongodb setup
var scheR_269_11845@a = mongoose.scheR_269_11845@a;
var ObjectId = scheR_269_11845@a.objectId;

var UserscheR_269_11845@a = new scheR_269_11845@a({
  provider: String,uid: String,fb_uid: String,twitter_uid: String,name: String,firs@R_874_6218@: String,gender: String,fb_username: String,twitter_username: String,profile_pic: String,email: String,LOCATIOn: String,birthday: String,created: {type: Date,default: Date.Now}
});


var User = mongoose.model('User',UserscheR_269_11845@a);
mongoose.connect('MongoHQ db connection here')'


//User Authentication - Twitter
passport.use(new TwitterStrategy({
    consumerKey: 'KEY',consumerSecret : 'SECRET',callBACkURL: "CALLBACKURL",passReqToCallBACk: true
},function(req,token,tokenSecret,profile,donE){
        User.findOne({twitter_uid: profile.iD},function(err,user){
            if (err) {
            console.log('this is an error 1' + err);
            return done(err);}
            if(user){
                console.log('this user' + user);
                done(null,user);
            } else {
                console.log('this is a new user');
                req.session.token = token;
                req.session.tokenSecret = tokenSecret;
                req.session.profile = profile;
                req.session.newtwitteruser = true;
                var user = new User();
                user.uid = profile.id;
                done(null,user);

                /* This part is commented and is the default code I had if I needed to simply create a Twitter User right here.
                var user = new User();
                user.provider = profile.provider;
                user.uid = profile.id;
                user.twitter_uid = profile.id;
                user.name = profile.displayName;
                user.firs@R_874_6218@ = profile.displayName[0];
                user.twitter_username = profile._json.screen_name;
                user.profile_pic = profile._json.profile_image_url;
                user.LOCATIOn = profile._json.LOCATIOn;
                user.save(function(err){
                    if(err) {throw err;}
                    else {done(null,user);}
                });*/
            }
        }); 
    }   
));


//User Authentication - Facebook
passport.use(new FacebookStrategy({
    clientID: 'ID',clientSecret: 'SECRET',callBACkURL: "URL"
},function(accessToken,refreshToken,donE){
        User.findOne({fb_uid: profile.iD},user){
            if (err) {return done(err);}
            if(user){
                done(null,user);
            } else {
                var user = new User();
                user.provider = profile.provider;
                user.uid = profile.id;
                user.fb_uid = profile.id;
                user.name = profile.displayName;
                user.firs@R_874_6218@ = profile._json.firs@R_874_6218@;
                user.gender = profile._json.gender;
                user.fb_username = profile._json.username;
                user.profile_pic = 'https://graph.facebook.com/' + profile.id + '/picture';
                user.email = profile._json.email;
                user.LOCATIOn = profile._json.LOCATIOn.name;
                user.birthday = profile._json.birthday;
                user.save(function(err){
                    if(err) {throw err;}
                    else {done(null,user);}
                });
            }
        })  
    }   
));


passport.serializeUser(function(user,donE) {
  done(null,user.uid);
});

passport.deserializeUser(function(uid,donE) {
  User.findOne({uid: uiD},function (err,user) {
    done(err,user);
  });
});  


//app configurations
app.configure(function(){
  app.set('port',process.env.PORT || 3000);
  app.set('views',__dirname + '/views');
  app.set('view ENGIne','jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser("freecookie"));
  app.use(express.session({secret:"freecookie"}));
  app.use(express.static(path.join(__dirname,'public')));
  app.use(express.errorHandler());
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(app.router);
});


//Basic RoutIng
app.get('/',res){
    res.render('home',{title: 'App title',user: req.user});
});


app.get('/auth/twitter',passport.authenticate('twitter'));

app.get('/auth/twitter/callBACk',passport.authenticate('twitter',{failureRedirect: '/login' }),res) {
        if (req.session.newtwitteruser){
        res.redirect('/addemail');}
        else {res.redirect('/');}
    });

app.get('/addemail',res){
    if (req.session.newtwitteruser){
    res.render('email',{title: 'Add your Email'});}
    else {res.redirect('/');}
});


app.get('/auth/facebook',passport.authenticate('facebook',{scope: ['email','user_LOCATIOn','user_birthday'] }));

app.get('/auth/facebook/callBACk',{ successRedirect: '/',failureRedirect: '/login' }));  


app.get('/logout',res){
  req.logout();
  res.redirect('/');
});



//create the server
var server = http.createServer(app);
server.listen(app.get('port'));


//checks if a request is authenticated
function ensureAuthenticated(req,res,next) {
  if (req.isAuthenticated()) { return next(); }
  res.redirect('/login')
}

解决方法

我首先将成功登录重定向到您的twitter路线中的addemail功能
app.get('/auth/twitter',passport.authenticate('twitter'));
  app.get('/auth/twitter/callBACk',{ successRedirect: '/addemail',failureRedirect: '/' }));

然后,在您的addemail功能中,我会检查他们是否已经有电子邮件,之后您可以将它重定向到适当的位置.

app.get('/addemail',res){
      if (req.user.email){
           res.render('email',{title: 'Add your Email'});}
      else {res.redirect('/');}
  });

大佬总结

以上是大佬教程为你收集整理的node.js – Passport中的自定义重定向全部内容,希望文章能够帮你解决node.js – Passport中的自定义重定向所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。