使用JSON Web令牌和node.js / express保护URL的正确方法

我目前使用node.js授权用户使用JSON Web令牌,并使用EJS作为视图引擎进行expression。

在我的server.js文件中使用简单的中间件:

app.use(function(request, response, next){ var token = request.body.token || request.query.token || request.headers['x-access-token']; console.log(request.body); if(token){ jwt.verify(token, app.get('superSecret'), function(err, decoded){ if(err){ response.json({"message": "Failed to authenticate user"}); } else{ request.decoded = decoded; next(); } }); } else{ return response.status(403).json({"message":"No token was provided"}); } }); 

并保护下面的路线,例如:

 app.post('/userlist', function(request, response) { response.json({some: json}) }); 

我无法理解或弄清楚如何保护GET路线,如:

 app.get('/userprofile', function(request, response) { response.render('pages/userprofile'); }); 

如果我直接通过某个url进行请求www.example.com/userprofile访问被拒绝,因为请求中没有包含令牌。

如果我通过ajax:

 $.ajax({ type:"GET", url:"https://www.example.com/userprofile", headers:{"x-access-token": token }, success: function(result, success){ }, error: function (result, error){ } }); 

响应不会呈现,但会返回到结果对象中。 我的电线穿过了这里的某个地方。

需要传递令牌才能使用。 如果服务器无法访问它,服务器将无法validation它。 所以,你可以在path中传递令牌:

 app.get('/userprofile/:token',function(request,response){ console.log(request.params.token); }); 

在查询string中:

 app.get('/userprofile',function(request,response){ console.log(request.query.token); }); 

或者作为一个cookie:

 var cookieParser = require('cookie-parser'); app.use(cookieParser); app.get('/userprofile',function(request,response){ console.log(request.cookies.token); }); 

http响应代码应该被发送,默认是200,如你的情况response.json({"message": "Failed to authenticate user"});

尝试response.json(401, {"message": "Failed to authenticate user"});