NodeJS JWT令牌验证

时间:2015-10-19 05:04:15

标签: javascript node.js auth0

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

我现在在浏览器中有一个名为userToken的令牌,它在我登录后已保存(我使用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);
});

2 个答案:

答案 0 :(得分:5)

你不需要什么都不实施。由于您使用的是此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

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

答案 1 :(得分:3)

此示例应该对您有所帮助,但未经过测试,但确定它是正确的,请查看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会为您返回有效的数据结构(因为我不确定)