【问题标题】:Jwt authorization/ passportJwt授权/护照
【发布时间】:2020-03-08 17:41:08
【问题描述】:

您好,我有一个关于 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 路由与我的令牌一起使用 这是前端工作吗?

基本上我想知道我将如何使用我的令牌访问其他路线而不是失眠

而我可以改进我的代码的地方是缺少一些东西来实现这一点?

【问题讨论】:

  • ...失眠了... ...除了失眠...你这是什么意思?您的请求如何?您是否提供了 Authorization 标头?

标签: node.js jwt passport.js


【解决方案1】:

不清楚要问什么,您所指的是您共享的代码中未表示的“失眠”。您已经询问了前端的令牌工作并将分享一些想法。

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

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

            chai.request(server)
                .post(`/books`)
                .set('Authorization', `Bearer ${token.token}`) // set the auth header with the token
                .send(data)
                ...

【讨论】:

  • 我错了失眠,我设法让我的客户保存 jwt,但我无法验证此客户端 jwt 以用于另一条路线。
  • pastebin.com/3Yd0zH5r 如果你能帮我看看我从客户端发送我的令牌但我无法在我的后端验证我不知道为什么
  • 发布一个新问题,我可以在那里查看它的那部分
  • 感谢兄弟我的帖子:stackoverflow.com/questions/58847651/… 如果你能提供帮助,谢谢。
猜你喜欢
  • 2018-03-18
  • 2018-02-04
  • 2017-10-18
  • 2019-08-29
  • 2018-05-19
  • 1970-01-01
  • 2018-09-26
  • 2017-12-22
  • 1970-01-01
相关资源
最近更新 更多