2014-02-19 79 views
10

我使用node.js和express.js与express-jwt模块,并且我已经设置了一个简单的HTTP服务器来测试所有内容:Node.js - Express.js JWT总是返回浏览器响应中的无效令牌错误

这是所涉及的节点代码:

app.set('port', process.env.PORT || 3000); 
    app.use(express.methodOverride()); 
    app.use(allow_cross_domain); 
    app.use('/api', expressJwt({secret: '09qrjjwef923jnrge$5ndjwk'})); 
    app.use(express.json()); 
    app.use(express.urlencoded()); 
    app.use('/', express.static(__dirname + '/')); 
    app.use(function(err, req, res, next){ 
     if (err.constructor.name === 'UnauthorizedError') { 
     res.send(401, 'Unauthorized'); 
     } 
    }); 

    app.get('login',function(req,res){ 

    //... 
    jwt.sign(results.username+results.email, secret, { expiresInMinutes: 9000000000*9393939393393939393939 }); 
    }); 

    app.post('api/profile',function(req,res){ 
    console.log(req.user); // this return undefined in console 
    res.send(req.user); // response is pending and dunno why it returns error in browser console 
    }); 

所以一旦我打开/login网址我得到登录,我发送会话令牌api/post,这在浏览器控制台返回此响应错误:

{"error":{"message":"invalid signature","code":"invalid_token","status":401,"inner":{}}} 

我不明白为什么会发生这种情况,因为存储在前端的令牌和JWT中的令牌是相同的。可能是这个错误的原因是什么?

头的一个例子POST版的api/post网址:

enter image description here

+0

可以显示“秘密”的jwt.sign价值?另外,results.username + results.email是一个JSON? jwt.sign接受一个json对象。 – woloski

+0

@woloski感谢回复我的人,我没有在sign()中为secret var设置一个值,因为我认为使用** app.use('/ api',expressJwt({secret:'09qrjjwef923jnrge $ 5ndjwk'}) ); **已经设置:P我错了? – sbaaaang

+0

@woloski用户不是JSON实际上我需要将它设置为JSON是的我会尝试它!谢谢 – sbaaaang

回答

11

下面是一个例子

http://blog.auth0.com/2014/01/07/angularjs-authentication-with-cookies-vs-token/

var expressJwt = require('express-jwt'); 
var jwt = require('jsonwebtoken'); 

var SECRET = 'shhhhhhared-secret'; 

app.use('/api', expressJwt({secret: SECRET})); 

app.post('/authenticate', function (req, res) { 
    //TODO validate req.body.username and req.body.password 
    //if is invalid, return 401 
    if (!(req.body.username === 'john.doe' && req.body.password === 'foobar')) { 
    res.send(401, 'Wrong user or password'); 
    return; 
    } 

    var profile = { 
    first_name: 'John', 
    last_name: 'Doe', 
    email: '[email protected]', 
    id: 123 
    }; 

    // We are sending the profile inside the token 
    var token = jwt.sign(profile, SECRET, { expiresIn: 18000 }); // 60*5 minutes 

    res.json({ token: token }); 
}); 

app.get('/api/protected', 
    function(req, res) { 
    res.json(req.user); 
    }); 
+0

只是如果我可能会问...是否可以安全地将用户的电子邮件放入令牌? – sbaaaang

+0

是的,令牌已签名无人可以更改它 – woloski

+0

真棒:D感谢 – sbaaaang

7

此外,还要确保你不把一个:在持票人之后。例如。

不好! Authorization: Bearer: eyJ0eXAiOiI1NiJ9.eyJpZCMjEyNzk2Njl9.4eU6X1wAQieH 打印“UnauthorizedError:智威汤逊必须提供”,以记录

Authorization: Bearer eyJ0eXAiOiI1NiJ9.eyJpZCMjEyNzk2Njl9.4eU6X1wAQieH