Jwt授权书/护照

你好,我有一个关于JWT的问题,验证:

我创建了我的身份验证类:

const passport = require('passport');
const Strategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;

module.exports = (app) => {
    const jwtConfig = app.config.jwt;
    const Users = app.datasource.models.tb_users;
    const options = {};

    options.secretOrKey = jwtConfig.secret;
    options.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();

    const strategy = new Strategy(options,(payload,done) => {

        Users
        .findOne({where: payload.id})
        .then(user => {

            if(user){
                return done(null,{
                    id: user.id,login: user.login
                });
            }
            return done(null,false);
        })
        .catch(error => done(error,null));

    });

    passport.use(strategy);
    return {
        initialize: () => passport.initialize(),authenticate: () => passport.authenticate('jwt',jwtConfig.session)
    };
} 

这是我的app.js:

const express = require('express');
const bodyParser = require('body-parser');

const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
const authRouter = require('./routes/auth');

const authorization = require('./auth');

const config = require('./config/config');
const datasource = require('./config/datasource');

const Email = require('./utils/email');

const app = express();
const port = 3000;

app.set('port',port);
app.config = config;
app.email = new Email(app.config);
app.datasource = datasource(app);

console.log(app.config);

app.use(bodyParser.json({
limit: '5mb'
}));

const auth = authorization(app);
app.use(auth.initialize());
app.auth = auth;

indexRouter(app);
usersRouter(app);
authRouter(app);

module.exports = app;

然后我有我的令牌登录和验证方法

app.route('/login')
    .post(async (req,res)=>{
        try {
            const response = await usersControllers.signin(req.body);
            const login = response.login;
            console.log(login);
            if(login.id && login.isValid){
                const payload = {id: login.id};
                res.json({
                    token: jwt.sign({data:payload},app.config.jwt.secret,{expiresIn: '1h'})
                });
            }else{
                console.log('entrou here');
                res.sendStatus(HttpStatus.UNAUTHORIZED);
            } 
        } catch (error) {
            console.log('entrou here');
            console.error(error.message);
            res.sendStatus(HttpStatus.UNAUTHORIZED);
        }
    })

在搜索所有用户的方法中,我将此授权称为:

app.route('/users')
    .all(app.auth.authenticate())
    .get((req,res)=>{
        usersController
            .getall()
            .then(data => {
                res.json(data);
            })
            .catch(error=>{
                console.log(error);
                res.status(400);
            });

    })

此处:.all(app.auth.authenticate())

这时我开始感到困惑 在失眠中,如果我进入登录路径,然后在“获取所有用户”路径中,即使得到登录路径的授权,他也会给出未经授权的信息

我想知道我能做什么,所以我可以将我的get路由与我的令牌一起使用 这是前端工作吗?

基本上,我想知道如何用我的代币访问失眠以外的其他路线

我需要改进的代码缺少实现此目的的东西?

a22037181 回答:Jwt授权书/护照

不清楚所要询问的内容,并且您引用的“失眠”在共享代码中未表示。您已询问前端的令牌工作,并将分享一些想法。

当令牌从 POST 返回到/login时,您需要将令牌保存在客户端上。如您所指定的,护照应该尝试从请求标头中提取令牌:options.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();,当您尝试访问安全路由时,需要在标头中发送令牌。将其作为键/值添加到“授权”中,格式为“载体” +令牌。

例如,使用chaihttp测试运行程序将数据发布到安全路由:

            chai.request(server)
                .post(`/books`)
                .set('Authorization',`Bearer ${token.token}`) // set the auth header with the token
                .send(data)
                ...
本文链接:https://www.f2er.com/3113607.html

大家都在问