req.isAuthenticated () в express и passport-local возвращает false - PullRequest
1 голос
/ 09 февраля 2020

Я надеюсь, что кто-то может пролить свет на мою ситуацию. req.isAuthenticated () всегда возвращает значение false после вызова в конечной точке app.router ( работает в порту 3001 ) через API выборки. По-видимому, connect.sid не был успешно передан по требованию, когда я req.isAuthenticated ()

С другой стороны, мой сервер реагирует на работу с портом 3000

Вот мои текущие настройки.

Маршрут входа в систему, который аутентифицирует имя пользователя и пароль и возвращает connect.sid через значение cook ie.

const express           = require('express')
const router            = express.Router()
const passport          = require('passport')
...
router.post( '/authenticate', passport.authenticate('local'), ( req, res, next ) => {
    res.status( 200 ).json({
        'response': 'Welcome User',
        'redirect' : '/dashboard'
    })
})
...
module.exports = router

На этом этапе мой пользовательский маршрут должен иметь доступ к защищенному маршруту. который просто возвращает всех пользователей в базе данных.

const express           = require('express')
const router            = express.Router()
const SimpleCmsUsers    = require('../models/Users.models.js')
const authPassportLocal = require('../passport/auth.PassportLocal.js') 
...
router.get( '/', authPassportLocal ,( req, res, next ) => {
    console.log( req.headers )
    console.log( req.body )

    SimpleCmsUsers
    .find({})
    .then(( users ) => {
        return res.status( 200 ).json( users )
    })
    .catch(( error ) => {
        return res.status( 403 ).json( error )
    })
})
...
module.exports = router

My auth.PassportLocal. js, который проверяет значение req.isAuthenticated ()

const authPassportLocal = ( req, res, next ) => {
    console.log( req.headers ) // I do not see session has been passed on my request
    console.log( req.body )    // empty
    console.log('isAuthenticated', req.isAuthenticated() ) // log if isAuthenticated returns true. 
    if ( req.isAuthenticated() ) {
         return next()
    }
    return res.redirect('/dashboard/login/index')
}
....
module.exports = authPassportLocal

Теперь, когда я вызываю / dashboard / users API через выборку

fetch( '/dashboard/users', {
    headers :{
        'Content-Type' : 'application/x-www-form-urlencoded'
    },
    credentials: 'include',
})
.then(( response ) => response.json())
.then(( users ) => console.log( users ))
.catch(( error ) => console.log( error ))

, это возвращает isAuthenticated false , я пытался просмотреть заголовки, полученные от / dashboard / users , однако я не вижу файлов cookie, переданных по моему запросу.

Вот мой индекс. js

const express           = require('express')
const session           = require('express-session')
const flash             = require('express-flash')
const cors              = require('cors')
const passport          = require('passport')
const LocalStrategy     = require('passport-local').Strategy
const Users             = require('./routes/Users.routes.js')
const Login             = require('./routes/Login.routes')
const SimpleCmsUsers    = require('./models/Users.models.js')
const app               = express()

app.use( express.json() )
app.use( express.urlencoded({ extended: true }) )
app.use( cors({
     origin: ['http://localhost:3001', 'http://localhost:3000'],
     credentials: true
}))
app.use( flash() )
app.use( session({
    secret: 'EUE7J3lUE01xhmCGQt04S8PbsMpUE5JDcQj0fyS0cy73PQVDLM',       
    resave: true,
    saveUninitialized: true
}))
app.use( passport.initialize() )
app.use( passport.session() )

passport.use( new LocalStrategy(
    {
        // passport-local option here ...
    },
    ( username, password, done ) => {
        try {
            SimpleCmsUsers.find({ user_username : username, user_password : password }, function ( err, docs ) {
                if ( !docs.length ) {
                    return done( null, false, { message: "User not found!" } )
                }
                return done( null, username )
            })
        }
        catch( error ) {
            return done( null, false, { message: error } )
        }
    }
))
passport.serializeUser(function( user, done ) {
    done( null, user );
})
passport.deserializeUser(function( user, done ) {
    done( null, user );
})

app.use('/dashboard/users', Users)
app.use('/dashboard/login', Login)

app.listen( PORT, () => console.log("Express JS is on port " + PORT) )

Что меня больше всего беспокоит, эти текущие настройки работают на Почтальоне без такого типа вызова.

В моем запросе API выборки (http://localhost: 3001 / панель инструментов / пользователи '):

url /
headers {
  host: 'localhost:3001',
  connection: 'keep-alive',
  pragma: 'no-cache',
  'cache-control': 'no-cache',
  'sec-fetch-dest': 'empty',
  'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36',
  dnt: '1',
  'content-type': 'application/x-www-form-urlencoded',
  accept: '*/*',
  origin: 'http://localhost:3000',
  'sec-fetch-site': 'same-site',
  'sec-fetch-mode': 'cors',
  referer: 'http://localhost:3000/dashboard/users',
  'accept-encoding': 'gzip, deflate, br',
  'accept-language': 'en-US,en;q=0.9,fil;q=0.8',
  cookie: 'connect.sid=s%3AJEG3MNSqtl33KqmHR2DhGlslnlkMKIPT.xsI%2F%2B82%2F1x8zTlq%2BkRN6aJVVbrauH8qv8jDhsrvNlbY'
}
body {}
user undefined
session Session {
  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true }
}
isAuthenticated false

В Почтальоне (http://localhost: 3001 / dashboard / users '):

url /
headers {
  'content-type': 'application/x-www-form-urlencoded',
  'user-agent': 'PostmanRuntime/7.22.0',
  accept: '*/*',
  'cache-control': 'no-cache',
  'postman-token': '443a064e-7909-43db-9783-79a6ba8bd4c5',
  host: 'localhost:3001',
  'accept-encoding': 'gzip, deflate, br',
  cookie: 'connect.sid=s%3AsvbYi_oxm4yqXTTa7S-N-3qAT6BdW5-u.QYFAXzayArpV1%2BDbjnwJ3fMMjpLzkM%2Fr9kIUCUCYscY',
  connection: 'keep-alive'
}
body {}
user username
session Session {
  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true },
  passport: { user: 'username' }
}
isAuthenticated true

Просто я не вижу, что пошло не так, почему API выборки не может передать значение cook ie из connect.sid

Любая помощь или руководство, где лучше выделить это поведение, высоко ценится.

TA

Обновление

npm run start // for react dev server running in port 3000
nodemon api/v1/index.js // for express api running in port 3001

Попробовал эти темы ниже, однако, Я не вижу никакого прогресса на моем конце:

req.isAuthenticated паспорта всегда возвращает false, даже когда я жестко кодирую завершено (null, true)

Основы сеанса паспорта (expressjs) - зачем нам сериализовать и десериализовать?

1 Ответ

0 голосов
/ 10 февраля 2020

Ваш код правильный.

Вопрос только в том, как устанавливаются куки.

Так как ваш бэкэнд работает на : 3001 куки установлены как для хоста : localhost: 3001 .

Прочитайте эту проблему: https://github.com/jaredhanson/passport/issues/403

решение состоит в том, чтобы создать промежуточное программное обеспечение сеанса для установки cook ie на другом хосте

app.use( session({
    secret: 'EUE7J3lUE01xhmCGQt04S8PbsMpUE5JDcQj0fyS0cy73PQVDLM',       
    resave: true,
    saveUninitialized: true,
    cookie: {domain: 'localhost:3000'}
}))
...