2

我是 MEAN 堆栈的新手,我正在尝试使用谷歌护照策略设置一个简单的社交登录。我可以成功验证自己,但是在成功调用重定向时,中间件函数 isLoggedIn 一直显示 req.isAuthenticated() 为假。以下是代码片段。我看到有很多关于这个问题的帖子,但似乎没有一个答案对我有用。请帮我解决这个问题。

护照.js

var Auth = require('./auth.js');
var ubCust = require('../models/ubCust.js');

var FacebookStrategy = require('passport-facebook').Strategy;

var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;

//var FacebookStrategy = require('passport-facebook').Strategy;

module.exports= function(passport){

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

    passport.deserializeUser(function(id, done) {
        ubCust.findById(id,function(err,user){
            done(err, user);      
        })

    });

    passport.use(new GoogleStrategy ({
        clientID: Auth.googleAuth.clientID,
        clientSecret: Auth.googleAuth.clientSecret,
        callbackURL : Auth.googleAuth.callbackURL
      },
      function(token, refreshToken, profile, done) {
        // Create or update user, call done() when complete...
         process.nextTick(function(){
            ubCust.findOne({'google.id' : profile.id}, function(err, user) {
              if (err) 
                  return done(err);
              if(user)
                  return done(null,user);
                else
                    {
                        var newUser = new ubCust;
                        newUser.google.id = profile.id;
                        newUser.google.token = token;
                        newUser.google.name = profile.displayName;
                        newUser.google.email = profile.emails[0].value;
                        newUser.save(function(err){
                            if (err)
                                throw err;
                            return done(null,newUser);
                        });
                        console.log(profile);
                    }
                //done(null, profile, tokens);
                }); //findOne
                });//nextTick

      }
    ));
};

路线(authController.js)

module.exports = function(app,passport){

    app.get('/api/getprofauth',isLoggedIn,function(req,res){
        console.log('In getprofile authentication api');
        //console.log('req.query :',req.query);
        res.send(req.user);

    });

    app.get('/auth/google', 
        passport.authenticate('google',{scope:  ['email','profile']})
    );

    app.get('/auth/google/callback',
            passport.authenticate('google', {failureRedirect: '/'}),
           function(req, res) {
            console.log('auth success!! ',req.isAuthenticated(),req.user);
            res.redirect('/api/getprofauth');
            }
        );

    function isLoggedIn(req,res,next) {
        // if user is authenticated in the session, carry on
        if (req.isAuthenticated())
            {
                console.log('isAuthenticated Success');
                return next();    
            }
        else{
            console.log('req.user',req.user,req.isAuthenticated());
            console.log('isAuthenticated Failure');
            res.redirect('/');
        }
        // if they aren't redirect them to the home page
    }//isLoggedIn
}

app.js(服务器)

var express = require('express');
var app = express();
var mongoose = require('mongoose');
var config = require('./config');
var passport = require('passport');
var cookieParser = require('cookie-parser');
app.use(cookieParser());
var session = require('express-session');
app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true }
}));

var authController = require('./controllers/authController.js');


var port = process.env.PORT||3000;

app.use(express.static(__dirname+ '/public'));

app.set('view engine','ejs');


app.get('/',function(req,res){
//redirecting request to home page '/' to index page 
    res.redirect('/index.htm');
});

mongoose.connect(config.getDBConnectionString());



app.use(passport.initialize());

app.use(passport.session());
var pp = require('./config/passport');
pp(passport);

apiController(app);
apibike(app);
appoController(app);

authController(app,passport);

app.listen(port);
4

0 回答 0