Выйти используя экспресс и паспорт - PullRequest
0 голосов
/ 16 марта 2019

Я использую express.js и passport-jwt, и я создаю промежуточное ПО, которое проверяет пользователя при каждом вызове API, а затем назначает запрос пользователю.Итак, каждый раз, когда я регистрирую 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;

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Первый - вы используете конечную точку в качестве промежуточного программного обеспечения. Я бы попробовал без «следующего». Тогда - я бы попробовал с req.logout (), а не с req.logOut (). Также оберните ваш ожидающий вызов блоком try - catch. Возможно, есть проблема с обещанием Схемы.

0 голосов
/ 16 марта 2019

Насколько я знаю, вы не должны реализовывать выход со стороны сервера. Пусть ваши клиенты обрабатывают выход из системы, потому что мы не храним токен нигде на сервере. Таким образом, чтобы выйти из клиента, вы просто удалите токен. Кроме того, не храните свои токены в базе данных, если вы не обязаны это делать, и если вы хотите это сделать, то хешируйте их как пароли. Хранение токенов в базе данных сопряжено с риском, так как в случае уязвимости в базе данных злоумышленник будет наделен всеми полномочиями.

...