Как реализовать аутентификацию запроса?

Я хочу реализовать аутентификацию запроса, но эта ошибка постоянно:

Error: Argument passed to findByPk is invalid: [object Object] at Function.findByPk (/home/admin/Desktop/project/node_modules/sequelize/lib/model.js:1714:13) at Function.Model.findById (/home/admin/Desktop/project/node_modules/sequelize/lib/model.js:4209:25) at JwtStrategy.passport.use.JwtStrategy [as _verify] (/home/admin/Desktop/project/middleware/passport.js:16:41) at /home/admin/Desktop/project/node_modules/passport-jwt/lib/strategy.js:123:34 at /home/admin/Desktop/project/node_modules/jsonwebtoken/verify.js:196:12 at getSecret (/home/admin/Desktop/project/node_modules/jsonwebtoken/verify.js:76:14) at Object.module.exports [as verify] (/home/admin/Desktop/project/node_modules/jsonwebtoken/verify.js:80:10) at Function.module.exports [as JwtVerifier] (/home/admin/Desktop/project/node_modules/passport-jwt/lib/verify_jwt.js:4:16) at /home/admin/Desktop/project/node_modules/passport-jwt/lib/strategy.js:104:25 at JwtStrategy._secretOrKeyProvider (/home/admin/Desktop/project/node_modules/passport-jwt/lib/strategy.js:40:13) at JwtStrategy.authenticate (/home/admin/Desktop/project/node_modules/passport-jwt/lib/strategy.js:99:10) at attempt (/home/admin/Desktop/project/node_modules/passport/lib/middleware/authenticate.js:361:16) at authenticate (/home/admin/Desktop/project/node_modules/passport/lib/middleware/authenticate.js:362:7) at Layer.handle [as handle_request] (/home/admin/Desktop/project/node_modules/express/lib/router/layer.js:95:5) at next (/home/admin/Desktop/project/node_modules/express/lib/router/route.js:137:13) at Route.dispatch (/home/admin/Desktop/project/node_modules/express/lib/router/route.js:112:3) at Layer.handle [as handle_request] (/home/admin/Desktop/project/node_modules/express/lib/router/layer.js:95:5) at /home/admin/Desktop/project/node_modules/express/lib/router/index.js:281:22 at Function.process_params (/home/admin/Desktop/project/node_modules/express/lib/router/index.js:335:12) at next (/home/admin/Desktop/project/node_modules/express/lib/router/index.js:275:10) at Function.handle (/home/admin/Desktop/project/node_modules/express/lib/router/index.js:174:3) at router (/home/admin/Desktop/project/node_modules/express/lib/router/index.js:47:12)

Я использую PostgreSQL как базу данных и Sequelize как ORM.

маршруты:

const express = require('express')
const router = express.Router()
const controller = require('../controllers/user')
const passport = require('passport')


// localhost:5000/api/admin/users
router.get('/users', passport.authenticate('jwt', {session: false}), controller.getAll)

module.exports = router

заграничный пасспорт:

const JwtStrategy = require('passport-jwt').Strategy
const ExtractJwt = require('passport-jwt').ExtractJwt
const db = require('../config/db.config.js')
const User = db.user


const options = {
    jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), 
    secretOrKey: process.env.SECRET_OR_KEY
}

module.exports = passport => {
    passport.use(
        new JwtStrategy(options, async (payload, done) => {
            try {
                const user = await User.findById({
                    where: {
                        id:  payload.id
                    }
                }).select('username id')

                if (user) {
                    done(null, user)
                } else {
                    done(null, false)
                }
            } catch(e) {
                console.log(e)
            }
        })
    )
}

контроллер:

const db = require('../config/db.config.js')
const User = db.user
const errorHandler = require('../utils/errorHandler')

module.exports.getAll = async function(req, res) {
    try {
        const users = await User.findAll({user: req.user.id})
        res.status(200).json(users)
    } catch(e) {
        errorHandler(req, e)
    }

}
0
0
902
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В коде вашего паспорта вы вызываете User.findById и передаете пункт where.

Я считаю, что это должен быть просто User.findById(payload.id)

Я уже пробовал, но возникает другая ошибка User.findById(...).select is not a function

user10493107 26.10.2018 06:22

Я не вижу метода select в документации, но вы можете просто использовать метод toJSON, чтобы получить простой объект и деструктурировать его напрямую.

Pramodh Valavala 26.10.2018 06:30

Другие вопросы по теме