2014-02-19 81 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