使用passport-jwt验证节点API

use*_*965 14 javascript node.js passport.js

我正在尝试使用passport-jwt设置JWT身份验证.我想我采取了正确的步骤,但测试GET不会成功,我不知道如何调试它.

这就是我所做的:

  1. 尽可能直接设置passport-jwt

    var jwtOptions = {
        secretOrKey: 'secret',
        issuer: "accounts.examplesoft.com",  // wasn't sure what this was, so i left as defaulted in the doc
        audience: "yoursite.net"   // wasn't sure what this was, so i left as defaulted in the doc
      };
    
    jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeader();
    
    passport.use(new JwtStrategy(jwtOptions, function(jwt_payload, done) {
      User.findOne({id: jwt_payload.sub}, function(err, user) {
        if (err) {
            return done(err, false);
        }
        if (user) {
            done(null, user);
        } else {
            done(null, false);
            // or you could create a new account
        }
      });
    }));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 向我的用户/登录端点添加了令牌结果

    var jwt = require('jsonwebtoken');
    // ...
    
    exports.postLogin = function(req, res, next) {
      passport.authenticate('local', function(err, user, info) {
        if (err) throw err;
        if (!user) {
            return res.send({ msg: 'Login incorrect' });
        }
        req.logIn(user, function(err) {
            if (err) throw err;
            var secretOrKey = jwtOptions.secretOrKey;
            var token = jwt.sign(user, secretOrKey, {
                expiresIn: 631139040 // 20 years in seconds
            });
            res.send({ user: user, jwtToken: "JWT " + token });
        });
      })(req, res, next);
    };
    
    Run Code Online (Sandbox Code Playgroud)

事情看起来很顺利.我可以登录用户(使用护照本地身份验证),响应是我希望...

{"user":{"_ id":"56c8b5bd80d16ef41ec705dd","email":"peachy@keen.com","password":"$ 2a $ 10 $ zd ... etc.","__ v":0,} ,"jwtToken":"JWT eyJ0eXAiOiJ ....等" }

我创建了一个像这样的无保护测试路线......

// in my routes file
app.get('/user/tokenTest', user.tokenTest);
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,一个简单的终点......

exports.tokenTest = function(req, res) {
    console.log(req.headers);
    res.send("token test!!");
};
Run Code Online (Sandbox Code Playgroud)

并且GET-ing也可以正常工作.

  1. 但后来我尝试像这样保护这条路线:

    app.get('/user/tokenTest', passport.authenticate('jwt', { session: false }),
        user.tokenTest);
    
    Run Code Online (Sandbox Code Playgroud)

在我这样做之后,只有悲伤.我发送这样的请求:

curl -k 'https://localhost:3443/user/tokenTest' -H 'Authorization: JWT eyJ0eXAiOiJ... etc.' 
Run Code Online (Sandbox Code Playgroud)

永远,总是得到401:

擅自

控制器中的控制台日志似乎没有执行,也没有登录passport.use策略方法.我已经调整和调整,但我有点失落.护照-jwt文档仅提供示例,几乎没有其他帮助.

请问,关于我上面的错误,或者至少如何进行调试的任何想法?

use*_*965 26

对于跟随我的任何可怜的灵魂:passport-jwt doc意味着auth标题看起来像这样......

授权:JWT JSON_WEB_TOKEN_STRING .....

这结果是误导(对我来说,无论如何).

幸运的是,由于这篇文章,我能够学习如何构建令牌.(令牌的前缀直到第一个'.'是该方案的base64编码.前面的"JWT"是阻止验证工作的噪音.

所以解决方法是更改​​用户控制器返回的令牌:

    res.send({ user: user, jwtToken: "JWT " + token });
Run Code Online (Sandbox Code Playgroud)

更简单:

    res.send({ user: user, jwtToken: token });
Run Code Online (Sandbox Code Playgroud)

唷.是这样的,还是在这么多节点包文档中解释这些东西是不是真的有点不可思议?

  • 您是否尝试通过`fromHeader()`选项使用另一个头参数?我无法以任何方式使其工作...... (2认同)