后端:Sails.js
res.json(data);
我已经为 REST API 实现了 JSON Web Token,只有当它通过 Authorization Header 接收到正确的 JWT时,从前端到各种控制器的操作的所有 AJAX 请求才会返回数据。它按预期工作。
现在,我已经使用 EJS 创建了一个视图<%= name =>
,现在控制器具有详细信息res.view('/home', {name: "Bill"} );
并配置路由以指向相应的控制器。
如何通过从具有属性的服务器端视图中使用已发布的 JWT(存储在 localStorage 中)进行身份验证,从控制器中检索“名称”<%= name =>
谢谢。
代码:
意见/index.ejs
<%= name =>
api/控制器/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);
};
配置/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