【问题标题】:Passport auth works locally but not on remote serverPassport 身份验证在本地工作,但不在远程服务器上
【发布时间】:2017-06-25 00:58:35
【问题描述】:

我要为这个问题发疯了。我刚刚将 Passport js 与 Google oAuth 2.0 策略一起设置,它在我的本地 Express 4 服务器上运行完美。

但是当我尝试在我的亚马逊服务器上运行它时,调用 req.isAuthenticated() 每次都返回 false 并且 req.user 是未定义的。我不知道出了什么问题。

passport.serializeUser(function(user, done) {
   console.log("serializeUser " + user.id);
   done(null, user.id);
});

passport.deserializeUser(function(id, done) {
   console.log("deserializeUser: " + id);
   User.find({_id: id}, function (error, user) {
       if (error || !user) {
           done(error, null);
       } else {
           done(null, user);
       }
   });
});

passport.use(new GoogleStrategy({
    clientID: config.google.clientID,
    clientSecret: config.google.clientSecret,
    callbackURL: config.google.callbackURL
},
function(accessToken, refreshToken, profile, done) {

    process.nextTick(function () {

        if(profile._json.domain === 'xxx'){

            var query = {googleId: profile.id};
            var options = {upsert: true, new: true, setDefaultsOnInsert: true };

            // Find the document
            User.findOneAndUpdate(query, query , options, function (error, user) {
                if (error) {
                    return done(error);
                }
                return done(null, user);
            });
        }else{
            return done(new Error("Invalid host domain"));
        }
    });

}
));

router.get('/auth/google',
    passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/plus.login', 'https://www.googleapis.com/auth/userinfo.email'] }));

router.get('/auth/google/callback',
    passport.authenticate('google', { failureRedirect: '/login' }), function(req, res) {
        res.redirect('/');
});

router.get('/login', ensureAuthenticated, function(req, res){
     console.log("User is Authenticated");
});

function ensureAuthenticated(req, res, next) {

   console.log("USER " + req.user);

   if (req.isAuthenticated()) {
      console.log("Authorized");
      return next();
   } else {
      console.log("Not authorized");
      res.sendStatus(401);
   }

}

这是 Express 服务器配置。

/ Express
var app = express();
app.use(cookieParser('xxx'));

app.use(bodyParser.json({limit: '100mb'}));
app.use(bodyParser.urlencoded({limit: '100mb', extended: true}));

// Used for production build
app.use(express.static(path.join(__dirname, 'public')));

app.use(session({
    store: sessionStore, //var sessionStore = new MemoryStore();
    secret: 'xxx',
    resave: true,
    saveUninitialized: true,
    cookie: {
        secure: false,
        path: '/',
        httpOnly: true,
        maxAge: new Date(Date.now() + 3600000),
    }
}));

// Compress responses
app.use(compression());

app.use(passport.initialize());
app.use(passport.session());

routes(app);

Similar problem

请帮忙!

【问题讨论】:

    标签: node.js express oauth oauth-2.0 passport.js


    【解决方案1】:

    我认为我的问题已通过将 Session Store 切换到 MongoStore 而不是 MemoryStore 来解决。我希望这可以为你们中的一些人节省一些时间。

     // Express
    var app = express();
    app.use(cookieParser('xxx'));
    
    app.use(bodyParser.json({limit: '100mb'}));
    app.use(bodyParser.urlencoded({limit: '100mb', extended: true}));
    
    // Used for production build
    app.use(express.static(path.join(__dirname, 'public')));
    
    app.use(session({
        cookieName: 'session',
        duration: 30 * 60 * 1000,
        activeDuration: 5 * 60 * 1000,
        store: new MongoStore({
            mongooseConnection: mongoose.connection,
            touchAfter: 24 * 3600 // time period in seconds
        }),
        secret: 'xxx',
        saveUninitialized: false, // don't create session until something stored
        resave: false, //don't save session if unmodified
        cookie: {
            secure: false,
            path: '/',
            httpOnly: true,
            maxAge: new Date(Date.now() + 3600000),
        }
    }));
    

    【讨论】:

      【解决方案2】:

      您是否已将亚马逊服务器添加到授权重定向 URI 列表中?请参阅以下内容:https://developers.google.com/adwords/api/docs/guides/authentication#oauth2_playground

      确保将您的亚马逊重定向 URI 添加到谷歌的控制台以进行身份​​验证

      【讨论】:

        猜你喜欢
        • 2017-02-06
        • 2021-05-07
        • 2011-06-28
        • 1970-01-01
        • 2019-07-04
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        • 2016-09-08
        相关资源
        最近更新 更多