NodeJS JWT 令牌验证
NodeJS JWT token verification
我正在尝试使用 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);
});
这个示例应该可以帮助你,它没有经过测试,但确保它是正确的方法,查看 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 returns 对您有效的数据结构(否则我不确定)
您不需要执行任何操作。由于您正在使用此 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
希望对您有所帮助,抱歉我的英语不好。
我正在尝试使用 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);
});
这个示例应该可以帮助你,它没有经过测试,但确保它是正确的方法,查看 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 returns 对您有效的数据结构(否则我不确定)
您不需要执行任何操作。由于您正在使用此 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
希望对您有所帮助,抱歉我的英语不好。