【问题标题】:logout using express and passport使用快递和护照注销
【发布时间】:2019-08-07 04:45:04
【问题描述】:

我正在使用 express.js 和 passport-jwt,我正在创建一个中间件,在每个 API 调用中检查用户,然后分配给 req 用户。因此,每次我登录req.user 时,我都会获得有关我的用户的详细信息,并且效果很好。然后,如果我想注销该用户,我使用了req.logout()req.logOut()req.destroy(),甚至尝试将null 分配给req.user,但它仍然登录,我需要帮助。

护照配置

const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
var passport = require('passport')
 const User = require('../schema/userSchema')


var opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = 'social';

exports.Strategy = new JwtStrategy(opts, async (jwt_payload, done) => {
  const user = await User.findOne({ _id: jwt_payload.id})
     if (!user) {
        return done({error:'error'}, false);
     }
     if (user) {
        return done(null, user);
     } else {
        return done({error:'error'}, false);
     }      

})

exports.auth = passport.authenticate('jwt', { session: false })

server.js

var express = require('express')
var app = express()
var bodyParser = require('body-parser')
var cors = require('cors')
var passport = require('passport')
var passportmethods = require('./methods/passport')
var postRoute = require('./router/posts')
var authRoute = require('./router/auth')
var friendRoute = require('./router/friend')
var verif = require('./router/user')

app.use('/uploads',express.static('../backend Social/uploads'))

app.use(cors())
app.use(bodyParser.json())
passport.use(passportmethods.Strategy)

app.use('/auth',authRoute)
app.use('/post',passportmethods.auth,postRoute)
app.use('/friend',passportmethods.auth,friendRoute)
app.use('/user',passportmethods.auth,verif)


app.listen(3000,()=>console.log('server on !'))

登录和注销

const express = require('express');
const router = express.Router();
const logout = require('express-passport-logout');
const User = require('../schema/userSchema')




router.get('/isloggedin', (req, res, next) => {
    if (req.user) res.send(req.user)
    else res.send({ error: 'error' })
})

router.get('/logout',async (req, res, next) => {
    await User.updateOne({_id:req.user._id},{$set :{connected : false}}) 
    console.log(req.user._id)
    req.logOut()
    if(req.user)res.send(req.user._id)
    else res.send('logged out')
})
module.exports = router;

【问题讨论】:

    标签: node.js express passport.js


    【解决方案1】:

    首先 - 您使用端点作为中间件。我会尝试没有“下一个”。然后 - 我会尝试使用 req.logout() 而不是 req.logOut()。还要用 try - catch 块包装你的 await 调用。也许 Schema 承诺有问题。

    【讨论】:

      【解决方案2】:

      据我所知,您不应该从服务器端实现注销。让您的客户处理注销,因为我们不会将令牌存储在服务器的任何位置。因此,要从客户端注销,您只需删除令牌。此外,除非您必须这样做,否则不要将您的令牌存储在数据库中,如果您要这样做,则将它们像密码一样散列。如果数据库中存在安全漏洞,将令牌存储在数据库中是有风险的,入侵者将拥有一切权力。

      【讨论】:

      • 我想删除 req.user 如何删除它我想要什么时候测试它有 req.user 它得到空
      • 您使用的是什么版本的护照?但解决它的方法可能是使用req.session.destroy() 并将回调传递给它清除cookie然后重定向。但我仍然不使用护照,我认为在客户端实现注销是个好主意。
      • "passport": "^0.4.0", "passport-jwt": "^4.0.0"
      • 我不能使用 req.session.destroy() 因为我没有使用 session 和 cookies 如何在我的代码中实现它们?
      • router.get('/logout',async (req, res, next) => { await User.updateOne({_id:req.user._id},{$set :{connected : false}}) console.log(req.user._id) req.session.destroy(function() { res.redirect('/')) if(req.user)res.send(req.user._id) else res.send('logged out') })
      猜你喜欢
      • 1970-01-01
      • 2017-03-07
      • 2018-08-11
      • 2020-09-03
      • 2018-06-07
      • 2019-12-10
      • 2018-03-03
      • 2012-09-10
      • 2015-10-01
      相关资源
      最近更新 更多