【问题标题】:NodeJS JWT token verificationNodeJS JWT 令牌验证
【发布时间】:2016-01-17 08:36:47
【问题描述】:

我正在尝试使用 NodeJS 验证签名令牌并从中提取信息。

我现在浏览器中有一个叫userToken的token,登录后已经保存(顺便用auth0登录)。

我尝试在此处手动验证我的令牌:http://jwt.io,它可以正常工作并毫无问题地为我提供有效负载数据。但是,我不能用 NodeJS 做同样的事情。我该怎么做?

我阅读了文档,但无法理解。 https://github.com/auth0/express-jwt

这是我的 server.js

var http = require('http');
var express = require('express');
var cors = require('cors');
var app = express();
var jwt = require('express-jwt');
var dotenv = require('dotenv');

dotenv.load();

var authenticate = jwt({
    secret: new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'),
    audience: process.env.AUTH0_CLIENT_ID
});


// view engine setup
var path = require('path');
app.set('views', path.join(__dirname, 'views'));
app.use(express.static(path.join(__dirname, 'public')));

app.set('view engine', 'jade');


app.configure(function () {

    // Request body parsing middleware should be above methodOverride
    app.use(express.bodyParser());
    app.use(express.urlencoded());
    app.use(express.json());
    app.use(cors());

    app.use(app.router);
});


app.get('/', function (req, res) {
    res.render('index');
});

app.get('/test', function(req,res) {
    // how do I check it?
});


var port = process.env.PORT || 3001;

http.createServer(app).listen(port, function (err) {
    console.log('listening in http://localhost:' + port);
});

【问题讨论】:

  • Node 告诉你jwt 没有verify 函数,实际上它看起来没有。
  • 看起来 express-jwt 和 jsonwebtokens 之间存在联系,我正试图弄清楚这一点。 github.com/auth0/node-jsonwebtoken
  • 是的,jsonwebtokenexpress-jwt 创建(或签名)令牌以进行处理

标签: javascript node.js auth0


【解决方案1】:

您无需执行任何操作。既然你使用的是这个express-jwt,只需将userProperty标签传递给jwt

var authenticate = jwt({
    secret: new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'),
    audience: process.env.AUTH0_CLIENT_ID,
    userProperty: 'payload'
});

因此,您可以在控制器中使用 req.payload 获取所有 jwt 有效负载数据。你可以通过console.log(req.payload)查看。

你可以在这里看到它是如何工作的:https://github.com/auth0/express-jwt/blob/master/lib/index.js#L121

希望对我有帮助,对我的英语感到抱歉。

【讨论】:

  • 什么是 userProperty?
  • 这应该是最好的答案了。
【解决方案2】:

这个示例应该可以帮助你,它没有经过测试,但确定它是正确的,查看express-jwt 的来源,它确实是literally same behind the scenes

app.get('/test', function(req, res) {
    var jsonwebtoken = require('jsonwebtoken'); //install this, move to declarations
    var loginToken = req.headers.authentication || req.body.userToken || req.headers.Bearer; //or your own, it's just headers that pass from browser to client
    jsonwebtoken.verify(loginToken, new Buffer(process.env.AUTH0_CLIENT_SECRET, 'base64'), function(err, decoded) {
        if(err) {
            return res.status(401).send({message: 'invalid_token'});
        }
        //be aware of encoded data structure, simply console.log(decoded); to see what it contains
        res.send(decoded); //`decoded.foo` has your value
    });
});

问题是您必须自己对数据进行编码,然后再解码,因此请注意 auth0 会为您返回有效的数据结构(否则我不确定)

【讨论】:

  • 谢谢,快搞定了。如果我将令牌作为字符串传递,它可以工作。但是如果我尝试 req,headers.userToken 或 req.body.userToken,它会返回无效的令牌,因为它可能在那里找不到令牌。造成这种情况的原因可能是什么?如何找到调用哪个 req 对象(标题、正文等)来获取 userToken?
  • 我的令牌在本地存储中,我应该安装一个模块来获取它还是有内置的方法来获取它?
  • @salep 浏览器必须发送带有标头(或正文)的令牌,为此,从本地存储中获取令牌,并使用该令牌修补所有传出的 http 请求(添加到标头),就是这样跨度>
  • 我成功实现了它,它适用于 jQuery Ajax 发布请求,但在获取请求时仍然存在问题。谢谢你的帮助,我很感激。
猜你喜欢
  • 2017-06-22
  • 2019-06-23
  • 2019-09-08
  • 2020-11-22
  • 2019-09-14
  • 2017-07-27
  • 2019-10-20
  • 2018-03-07
  • 2018-10-16
相关资源
最近更新 更多