【问题标题】:Can you use NodeJs Passport Sessions in a RESTFUL environment?你可以在 RESTFUL 环境中使用 NodeJs Passport Sessions 吗?
【发布时间】:2015-01-08 06:28:02
【问题描述】:

我正在尝试在 RESTful 环境中设置通行证,但无法让用户序列化到会话数据中。不过,登录和注册效果很好。

我或多或少地遵循 scotch.io 的教程,但我做了一些调整,使其可以通过 RESTful API 工作。

简而言之,这是我的服务器设置:

var express = require("express"); // v 4.8.5
var cookieParser = require("cookie-parser"); // v 1.3.3
var bodyParser = require("body-parser"); // v 1.9.0
var session = require("express-session"); // v 1.8.2
var passport = require("passport"); // v 0.2.1, passport-local is v 1.0.0
var app = express();

require("./config/Passport")(passport);

app.use( morgan('dev') );

app.use( cookieParser(secret) );
app.use( bodyParser.json() );
app.use( bodyParser.urlencoded({extended:true}) );

app.use( session({secret:secret, resave:true, saveUninitialized:true, cookie:{httpOnly: false, secure:false, maxAge:cookie_max_age}}) );

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

app.use( less(publicPath, {compiler:{compress:false}}) );
app.use( express.static(publicPath) );

var router = express.Router();
require( appBase + "Routes" )(router, passport);
app.use( '/api', router );

var server = app.listen(8088);

现在,在我的路由器中,我已将登录路由定义如下:

router.post("/login", function(req, res, next)
{
    passport.authenticate("local-login", function(error, user, info)
    {
        if(error) return next(error);
        if(!user) return response.send({success:false, message:info.message});
        return response.send({success:true, message:"Login successful.", user:user});
    })(request, response, next);
});

我想在这里简明扼要,但我的用户序列化和反序列化函数中也有控制台跟踪,它们没有受到影响。我也有一些日志记录来告诉我会话变量发生了什么,这几乎也没有显示任何内容。 cookie 信息中有一个护照变量,但它是空的。

我猜我的问题在于我没有使用默认情况下应该使用的重定向护照的默认机制,但到目前为止我一直无法弄清楚它到底是什么。我的第二个猜测是 cookie 和会话的东西没有正确设置。 scotch.io 教程是为更旧版本的 express 编写的,我不得不进行更改以使所有内容都保持最新。

【问题讨论】:

    标签: node.js rest session cookies passport.js


    【解决方案1】:

    没有“默认的重定向机制”,但为了您的方便提供了一个。

    您正在使用自定义回调,所以我怀疑问题是由于根本没有调用 req.login() 引起的。如上所述in the documentation

    请注意,当使用自定义回调时,应用程序负责建立会话(通过调用 req.login())并发送响应。

    所以,试试它是否会像这样工作:

    router.post("/login", function(req, res, next)
    {
        passport.authenticate("local-login", function(error, user, info)
        {
            if(error) return next(error);
            if(!user) return res.send({success:false, message:info.message});
            req.logIn(user, function(err) {
                if(error) return next(error);
                return res.send({success:true, message:"Login successful.", user:user});
            }
        })(req, res, next);
    });
    

    【讨论】:

    • 我知道我在文档中遗漏了一些东西 :) 这就像一个魅力。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    相关资源
    最近更新 更多