javascript - 如何快速通过护照认证

标签 javascript node.js express express-jwt passport-jwt

我最近将我在 es6 中制作的样板更改为稍旧的 es5 版本。我不得不重新创建导出,要求而不是使用导入,路由现在可以正常工作。

我有这样的结构:

index.js (app)
api/index.js (/api endpoint)
api/auth.js (/api/auth endpoint)
api/protected.js (/api/protected endpoint)

在我的授权 route ,我有登录和注册功能并生成 token :

const token = jwt.sign({id: req.body.username},  config.jwtSecret)

在我的 protected.js 中,我有以下内容:

const express = require('express');
const router = express.Router();
const passport = require('../config/passport');
router.use(passport.initialize({ session: false }));
router.use(passport.session());
router.get('/test', passport.authenticate('jwt') , (req, res) => {
    res.status(200).json({ message: 'Hello sweetie', auth: req.isAuthenticated(), user: req.session.passport.user})
});
module.exports = router;

在我的 passport.js 中

const
  passport = require('passport'),
  config = require('./../config'),
  passportJwt = require('passport-jwt'),
  JwtStrategy = passportJwt.Strategy,
  ExtractJwt = passportJwt.ExtractJwt,
  userSchema = require('./../schemas/userSchema');

passport.serializeUser(function(user, done) {
    console.log(JSON.stringify(user));
    done(null, user[0].username);
});

passport.deserializeUser(function(username, done) {
    console.log('DESER -- '+username);
    userSchema.checkUsername(username)
    .then(user => {
        console.log(user[0]);
        done(null, user[0]);
    })
    .catch(err =>{
        console.log(JSON.stringify(err));
    });
});

const jwtOptions = {
    secretOrKey: config.jwtSecret,
    jwtFromRequest: ExtractJwt.fromHeader('authorization'),
}

passport.use('jwt', new JwtStrategy(jwtOptions, function(jwt_payload, done) {
    console.log('Strategy: '+ jwt_payload.id);
    userSchema.checkUsername(jwt_payload.id)
    .then(user => {
        console.log(user[0].username);
        if(user[0]) return done(null, user)
        else return done(null, false)
    })
    .catch(err =>{
        console.log(JSON.stringify(err));
    });
}));

module.exports = passport;

问题是当我尝试访问:127.0.0.1:8080/api/protected/test 使用我登录时获得的 token ,它会给我一个:Unauthorized

此外 console.log 里面的:

  • 序列化用户
  • 反序列化用户
  • 智威汤逊战略

从未显示,因此我认为没有使用护照中间件。

如何让 /protected 路由使用 passport 中间件?

编辑:我已经尝试打印 passport 对象,我可以看到我的 jwt 策略确实被定义了。所以我不明白为什么它不想通过它。

There si a strategy

最佳答案

问题是您的护照正在寻找 authorization header 而不是 Authorization header 。

改变你的

jwtFromRequest: ExtractJwt.fromHeader('授权')

ExtractJwt.fromAuthHeaderAsBearerToken()

所以你的选项看起来像

const jwtOptions = {
    secretOrKey: config.jwtSecret,
    jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
}

现在,护照将查找具有值 bearer your_jwt_tokenAuthorization header 。 https://www.npmjs.com/package/passport-jwt

关于javascript - 如何快速通过护照认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51511067/

相关文章:

javascript - 无法提醒 href val?

javascript - Angularjs 使用 Node js 将复选框 1 或 0 值添加到 mysql

javascript - ReactJS 和 Node——错误 400 错误请求

node.js - 如何修复 'Content Security Policy: The page’ s 设置阻止在 http ://localhost:8080/favicon. ico (“default-src” 处加载资源。'

javascript - 将 sails.js 应用程序绑定(bind)到特定的 ip

javascript - nodejs 快速登录失败

javascript - Angular 2 访问 REST API 错误 - 没有 Http 提供程序

javascript - 出现错误 : Cannot set property 'innerHTML' of null

javascript - 将多个结果插入到express.js路由中的req对象中

javascript - 带链接的 D3 TreeMap