当前位置: 首页 > 面试题库 >

使用password-jwt验证节点API

锺离声
2023-03-14
问题内容

我正在尝试使用password-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
        }
      });
    }));
  1. 向我的用户/ login端点添加了令牌结果
        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);
    };

到现在为止一切都很好。我可以登录用户(使用护照本地身份验证),响应是我希望的…

{“ user”:{“ _id”:“ 56c8b5bd80d16ef41ec705dd”,“ email”:“ peachy@keen.com”,“
password”:“ $ 2a $ 10 $ zd …等。”,“ __v”:0,} ,“ jwtToken”:“ JWT eyJ0eXAiOiJ
....等。” }

我创建了这样的不受保护的测试路线…

// in my routes file
app.get('/user/tokenTest', user.tokenTest);

在我的控制器中,有一个简单的端点…

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

而且GET-ing也很好用。

  1. 但是,然后我尝试像这样保护该路线:
    app.get('/user/tokenTest', passport.authenticate('jwt', { session: false }),
    user.tokenTest);
    

在我做完那件事之后,只有悲伤。我发送这样的请求:

curl -k 'https://localhost:3443/user/tokenTest' -H 'Authorization: JWT eyJ0eXAiOiJ... etc.'

而且总是,总是得到401:

未经授权

控制器中的控制台日志似乎没有执行,passport.use策略方法中的日志也没有执行。我进行了调整,但是我有点迷失了。护照-jwt文件仅提供示例,几乎没有其他帮助。

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


问题答案:

对于任何在这里跟随我的可怜人:passport-jwt doc意味着auth标头应如下所示…

授权:JWT JSON_WEB_TOKEN_STRING .....

事实证明这是一种误导(无论如何对我而言)。

幸运的是,由于这篇文章,我能够学习令牌的构建方式。(令牌的前缀直到第一个“。”是该方案的base64编码。前面的“ JWT”是噪音,阻止了验证的进行。

因此,解决方法是将用户控制器返回的令牌从以下位置更改:

    res.send({ user: user, jwtToken: "JWT " + token });

简单来说:

    res.send({ user: user, jwtToken: token });

ew 是我,还是真的很不高兴,为什么在这么多的节点包文档中对这些内容的解释不充分?



 类似资料:
  • 我想验证一些来自Microsoft的JWT的签名。我正在使用Spring-Boot、JJWT库和以下endpoint:https://login.microsoftonline.com/common/discovery/v2.0/keys endpoint返回JSON公钥数组。下面是数组中的一个示例。

  • 我正在进行一个项目,我们将在微服务架构中使用不同的服务,我们还希望使用一些Firebase服务。我正在开发一个身份验证服务器,它将铸造定制的JWT,用于Firebase和其他应用编程接口项目。 我们希望使用Firebase Auth SDK轻松与FB、谷歌、Twitter等集成,但我们需要用更多数据丰富用户的令牌。因此,我的思维过程是创建一个节点。使用Firebase Admin SDK执行此操作

  • 问题内容: 我正在创建一个登录身份验证页面,用户将在其中输入活动目录的用户名和密码,并使用NodeJS进行检查,以查看其是否有效,但是我一直在获取 要么 当我尝试搜索用户名和密码时,我的代码如下: 我正在使用:https : //github.com/jeremycx/node-LDAP,假设用户输入的用户名是hhill 有人对我做错了什么建议吗? 更新 如果有人需要,这是我想出的解决方案,借助以

  • SCS English Version 子链是MOAC区块链中非常重要的一个模块。其主要目的在于分流母链中的业务逻辑,把一些比较繁琐的业务操作放在子链中执行。 子链由合约节点(Smart Contract Server - SCS)节点组成,必须部署在母链Vnode上。 子链支持分片,每个分片都能独立完成业务逻辑。 子链中的节点随机组合,支持动态增减。 同时,在主链上,我们增加了代理的Vnode节

  • 这就是我面临的问题, https://play.golang.org/p/Pq8xHAERD57 如果运行上述代码,第一个令牌JWKS对不会验证签名,但第二个会验证!但两者都在jwt中验证签名。木卫一。有什么办法可以用一个Golang图书馆来验证它吗? 奇怪的是如果你拿了失败的代币?我调试后发现函数func VerifyPKCS1v15(pub*PublicKey,hash crypto.hash

  • 我正在使用SpringBoot开发具有微服务架构的Rest Backend。为了保护endpoint,我使用了JWT令牌机制。我正在使用Zuul API网关。 如果请求需要权限(来自JWT的角色),它将被转发到正确的微服务。Zuul api网关的“WebSecurityConfigrerAdapter”如下。 这样,我必须在这个类中编写每个请求授权部分。因此,我希望使用方法级安全性,即“Enabl