通过API进行护照本地认证策略

时间:2020-05-23 02:50:03

标签: node.js vue.js passport.js

当前,我正在尝试为我的Web应用程序构建一个API,其中包括构建注册和登录路由。目前,注册路由工作正常,但是,我无法实现一种通过JSON响应管理登录请求的好方法。最终,我将对Vue应用程序使用此API。但是,我不知道该怎么做。

这是一些代码,包括我的模型和当前代码。

型号:

const mongoose = require("mongoose"),
    passportLocalMongoose = require("passport-local-mongoose");

const userSchema = new mongoose.Schema({
    email: String,
    username: String,
    password: String,
    avatarURL: String,
    secret: String,
    isAdmin: { type: Boolean, default: false },
    classes: [String],
    date: { type: Date, default: Date.now },
});

userSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model("User", userSchema);

这是我的路由代码...我需要添加JSON响应并为用户提供会话

router.post('/login',
    passport.authenticate('local', {
        successRedirect: '/todolist',
        failureRedirect: '/login',
    })
);

这全部使用护照框架。对于认证格式,我愿意接受其他建议。如果有更好的解决方法,请回复。

1 个答案:

答案 0 :(得分:0)

您可以使用express-session

// Use the session middleware
app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))

// Access the session as req.session
app.get('/', function(req, res, next) {
  if (req.session.views) {
    req.session.views++
    res.setHeader('Content-Type', 'text/html')
    res.write('<p>views: ' + req.session.views + '</p>')
    res.write('<p>expires in: ' + (req.session.cookie.maxAge / 1000) + 's</p>')
    res.end()
  } else {
    req.session.views = 1
    res.end('welcome to the session demo. refresh!')
  }
})

您可以通过执行req.session.newEmailAttribute = "example@gmail.com之类的操作来向会话对象添加属性。通常,您应该在登录或注册事件上执行此操作。然后,当用户发出请求访问应用程序中其他端点的请求时,您将验证该目录是否存在。您可以使用上面的示例中所示的条件语句来验证这一点。

所以在护照上

app.post('/login',
    passport.authenticate('local', {
        successRedirect: '/todolist',
        failureRedirect: '/login',
    }),
    function(req, res) {
        // if this function gets called, the authentication was successful
        req.session.email = req.body.email;
    }
);

然后,验证用户是否已登录:

app.get('/', (req, res) => {
    if(req.session.email) {
        // user is logged in!
    } else {
        // user is not logged in!
    }
})