2015-10-19 150 views
1

我試圖驗證簽名令牌並使用NodeJS從它提取信息。NodeJS JWT令牌驗證

我在瀏覽器中現在有一個名爲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); 
}); 
+1

節點告訴你'jwt'沒有'verify'函數,實際上它看起來好像沒有。 –

+0

它看起來像express-jwt和jsonwebtokens之間有一個連接,我試圖弄清楚。 https://github.com/auth0/node-jsonwebtoken – salep

+0

是的,'jsonwebtoken'爲'express-jwt'創建(或標記)標記以處理 –

回答

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爲你返回有效的數據結構(因爲我不確定)

+0

謝謝,這幾乎完成了。如果我將該標記作爲字符串傳遞,它將起作用。但是,如果我嘗試req,headers.userToken或req.body.userToken,它會返回無效標記,因爲它可能無法在其中找到標記。造成這種情況的原因是什麼?我怎樣才能找到哪個req對象來調用(頭文件,正文等)來獲取userToken? – salep

+0

我的代幣位於本地存儲中,我應該安裝一個模塊來獲取它還是有內置的方式來獲取它? – salep

+1

@salep瀏覽器必須發送包含標題(或主體)的標記,才能執行此操作,從localstorage獲取標記,並使用該標記修補所有傳出的http請求(添加到標題),就是這樣 –

2

你不需要執行任何操作。由於您使用此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您的智威湯遜的有效載荷數據。你可以用console.log(req.payload)進行檢查。

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

我希望它能幫助,和我的英語很抱歉。