如何实现请求认证?

Posted

技术标签:

【中文标题】如何实现请求认证?【英文标题】:How do I implement request authentication? 【发布时间】:2019-03-30 18:30:20 【问题描述】:

我想实现请求认证,但是一直报这个错误:

错误:参数传递给 findByPk 无效:[object Object] 在 Function.findByPk (/home/admin/Desktop/project/node_modules/sequelize/lib/model.js:1714:13) 在 Function.Model.findById (/home/admin/Desktop/project/node_modules/sequelize/lib/model.js:4209:25) 在 JwtStrategy.passport.use.JwtStrategy [as _verify] (/home/admin/Desktop/project/middleware/passport.js:16:41) 在/home/admin/Desktop/project/node_modules/passport-jwt/lib/strategy.js:123:34 在/home/admin/Desktop/project/node_modules/jsonwebtoken/verify.js:196:12 在 getSecret (/home/admin/Desktop/project/node_modules/jsonwebtoken/verify.js:76:14) 在 Object.module.exports [作为验证] (/home/admin/Desktop/project/node_modules/jsonwebtoken/verify.js:80:10) 在 Function.module.exports [作为 JwtVerifier] (/home/admin/Desktop/project/node_modules/passport-jwt/lib/verify_jwt.js:4:16) 在/home/admin/Desktop/project/node_modules/passport-jwt/lib/strategy.js:104:25 在 JwtStrategy._secretOrKeyProvider (/home/admin/Desktop/project/node_modules/passport-jwt/lib/strategy.js:40:13) 在 JwtStrategy.authenticate (/home/admin/Desktop/project/node_modules/passport-jwt/lib/strategy.js:99:10) 尝试(/home/admin/Desktop/project/node_modules/passport/lib/middleware/authenticate.js:361:16) 在验证(/home/admin/Desktop/project/node_modules/passport/lib/middleware/authenticate.js:362:7) 在 Layer.handle [as handle_request] (/home/admin/Desktop/project/node_modules/express/lib/router/layer.js:95:5) 在下一个(/home/admin/Desktop/project/node_modules/express/lib/router/route.js:137:13) 在 Route.dispatch (/home/admin/Desktop/project/node_modules/express/lib/router/route.js:112:3) 在 Layer.handle [as handle_request] (/home/admin/Desktop/project/node_modules/express/lib/router/layer.js:95:5) 在/home/admin/Desktop/project/node_modules/express/lib/router/index.js:281:22 在 Function.process_params (/home/admin/Desktop/project/node_modules/express/lib/router/index.js:335:12) 在下一个(/home/admin/Desktop/project/node_modules/express/lib/router/index.js:275:10) 在 Function.handle (/home/admin/Desktop/project/node_modules/express/lib/router/index.js:174:3) 在路由器(/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)
    


【问题讨论】:

【参考方案1】:

在您的护照代码中,您正在调用 User.findById 并传递一个 where 子句。

我认为应该只是User.findById(payload.id)

【讨论】:

我已经试过了,但是又出现了一个错误User.findById(...).select is not a function 我在文档中没有看到 select 方法,但您可以使用 toJSON 方法获取一个简单的对象并直接对其进行解构

以上是关于如何实现请求认证?的主要内容,如果未能解决你的问题,请参考以下文章

FLUTTER 如何实现 Digest 认证

.Net Core中AuthorizationHandlerContext如何获取当前请求的相关信息

.Net Core中AuthorizationHandlerContext如何获取当前请求的相关信息

SpringSecurity:认证成功后如何继续向 RestController 转发请求?

Flask中如何实现用户登陆认证?

http请求如何修改请求头?