【问题标题】:No logs after Passport.js authenticate middlewarePassport.js 验证中间件后没有日志
【发布时间】:2017-07-06 01:29:36
【问题描述】:

我正在尝试调试失败的 JWT 身份验证设置,它总是返回 401。

我的护照设置 (middleware/auth.js)

import passport from 'passport'
import { Strategy as JwtStrategy, ExtractJwt } from 'passport-jwt'

module.exports = function() {
  var options = {};
  options.jwtFromRequest = ExtractJwt.fromAuthHeader()
  options.secretOrKey = 'superdupersecret'

  var strategy = new JwtStrategy(options, function(payload, done) {
    console.log('this is not printing')              <---------------
    var user = payload.sub || null;
    if (user) {
      return done(null, { id: user._id });
    } else {
      return done(new Error("User not found"), null);
    }
  });

  passport.use(strategy);

  return {
    initialize: () => {
      console.log('this only prints on boot');       <---------------
      return passport.initialize();
    },
    authenticate: () => {
      console.log('this too')                        <---------------
      return passport.authenticate("jwt", {session: false});
    }
  };
};

我初始化护照的 server.js 文件:

import express from 'express'
(...)
var auth = require("./middleware/auth.js")();


// Instantiate app
const app = express();

// Initialize passport for auth use
app.use(auth.initialize())

我的受保护路由总是返回 401:

import express from 'express'
var auth = require("../middleware/auth.js")();

const userRouter = express.Router()

userRouter.get('/dashboard', auth.authenticate(), (req, res) => {
    res.send('It worked! User id is: ' + req.user + '.')
})

export default userRouter

我尝试在实际的 passport.js 模块本身以及 passport-jwt 中添加打印语句,但没有成功。

在受保护路由上的身份验证中间件之后,没有任何记录。

我已经尝试了大量的设置排列over the past 3 days now。任何帮助将不胜感激

【问题讨论】:

  • auth.authenticate 里面有什么?它被调用了吗?
  • @yBrodsky auth.authenticate 在第一个代码示例的返回对象中。它没有根据请求记录任何内容,但仍返回 401
  • 从 userRouter.get('/dashboard', auth.authenticate() 中去掉括号 ()
  • @yBrodsky 让请求挂起
  • 问题是你的函数应该有 3 个参数。要求,水库,CB。所以当你完成你所做的一切时,调用回调继续前进。 expressjs.com/en/guide/using-middleware.html

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


【解决方案1】:

好的,我按照您提到的教程进行操作,它似乎有效。 以下是一些注释(有些可能很明显,无意冒犯)。

  • 完全按照教程复制代码
  • 拥有一切后,您需要“登录”。向 /token 发出 POST 请求。内容类型必须是 application/json 并且在请求正文中,您需要发送带有电子邮件和密码的对象(来自教程)。
  • 登录后,服务器会返回一个令牌。
  • 获取该令牌,然后向 /user 发出 GET 请求。在请求的标头中添加: Authorization: JWT [your token here]。你必须写“JWT”和token用一个空格隔开。
  • 服务器返回状态 200。我修改后返回用户。

    app.get("/user", auth.authenticate(), function(req, res) { res.json({user: req.user}); });

【讨论】:

  • 感谢@yBrodsky 的帮助。事实证明,当我将 JWT 附加到 auth 标头时,它必须预先添加 'JWT ' 字符串。这解决了一切。
  • 是的。我有一个自己的应用程序,它使用 JWT,我自己做了,没有使用护照。 Passport 在这种情况下并没有做太多的事情,所以自己动手可以增加一些灵活性(比如通过参数或正文检索具有不同标头的令牌。
  • 我同意。但是,我将实施各种身份验证策略,因此我认为将它们整合到一个综合包中是有意义的。
  • 我还有一个问题一直困扰着我,这个问题更简单,如果你能帮助stackoverflow.com/questions/42283841/…
猜你喜欢
  • 1970-01-01
  • 2014-10-25
  • 2022-06-16
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 2015-05-05
相关资源
最近更新 更多