【发布时间】:2016-04-21 03:42:37
【问题描述】:
后端:Sails.js
我已经为 REST API 实现了 JSON Web Token,只有当它通过 Authorization Header 接收到正确的 JWT 时,从前端到各种控制器的操作的所有 AJAX 请求才会返回数据res.json(data);。它按预期工作。
现在,我使用 EJS 和 <%= name => 创建了一个视图,现在控制器具有详细信息 res.view('/home', {name: "Bill"} ); 并配置路由以指向相应的控制器。
如何通过使用属性 <%= name => 的服务器端视图中已发布的 JWT(存储在 localStorage 中)进行身份验证,从控制器中检索“名称”
谢谢。
代码:
views/index.ejs
<%= name =>
api/controllers/UsersController.js
info: function(req, res) {
var userId = req.token;
Users.findOne(userId).exec(function(err, profile) {
if(err) {
res.json(err);
} else {
res.view('index',{
name: profile.name,
});
}
});
},
api/policies/tokenAuth.js
module.exports = function(req, res, next) {
var token;
if (req.headers && req.headers.authorization) {
var parts = req.headers.authorization.split(' ');
if (parts.length == 2) {
var scheme = parts[0],
credentials = parts[1];
if (/^Bearer$/i.test(scheme)) {
token = credentials;
}
} else {
return res.json(401, {err: 'Format is Authorization: Bearer [token]'});
}
} else if (req.param('token')) {
token = req.param('token');
delete req.query.token;
} else {
return res.json(401, {err: 'No Authorization header was found'});
}
sailsTokenAuth.verifyToken(token, function(err, token) {
if (err) return res.json(401, {err: 'Please Logout and Login again!'});
req.token = token;
next();
});
};
api/services/sailsTokenAuth.js
var jwt = require('jsonwebtoken');
module.exports.issueToken = function(payload) {
var token = jwt.sign(payload, process.env.TOKEN_SECRET || "xxxxxxx");
return token;
};
module.exports.verifyToken = function(token, verified) {
return jwt.verify(token, process.env.TOKEN_SECRET || "xxxxxxx", {}, verified);
};
config/routes.js
module.exports.routes = {
'/': {
controller: 'UsersController',
action: 'info'
},
};
解决方案:
要将 JWT 用作从客户端浏览器到服务器的身份验证因素,可以使用 localStorage 或会话 cookie。由于在服务器中更容易实现,我终于将其范围缩小到使用 cookie。
验证用户身份后,将 JWT 存储在客户端浏览器中,
res.cookie('jwttoken', sailsTokenAuth.issueToken(profile.name));
然后可以使用req.cookies.jwttoken 检索它并通过服务 (jwt.verify) 对其进行验证,以通过res.json 或res.view 访问请求的信息
【问题讨论】:
标签: node.js express sails.js jwt express-jwt