我遇到了我制定的Sails Js政策问题。它应该充当任何已发送请求和目标控制器之间的中间件。
期望
应该验证在请求的标头中发送的JWT,解码播放量,并将其内容分配给可从任何控制器访问的req.user
变量。
问题
当我发送带有先前生成的JWT(带有邮递员的)的Barear Token授权类型请求时,我没有从后端服务器收到任何答案(甚至没有500)。
我构建的东西
登录策略:
module.exports = async function (req, res, next) {
var token;
// Check if authorization header is present
if(req.headers && req.headers.authorization) {
// If so, isolate each parts
var parts = req.headers.authorization.split(' ');
if(parts.length == 2) {
var scheme = parts[0];
var credentials = parts[1];
if(/^Bearer$/i.test(scheme)) {
token = credentials;
}
} else {... error return ...}
// If all test succeed, use TokenService.verify
var decoded = TokenService.verify(token);
User.findOne({id: decoded.id}).exec((error, user) => {
if (error) return res.serverError(error)
if (user) {
req.token = decoded;
next();
}
});
};
我的令牌服务:
const jwt = require('jsonwebtoken');
const tokenSecret = 'secretissecret';
module.exports = {
[...]
verify: token => jwt.verify(token, tokenSecret)
};
策略配置:
module.exports.policies = {
'*': 'is-logged-in',
// Bypass the `is-logged-in` policy for:
'entrance/*': true,
'account/logout': true,
'deliver-contact-form-message': true,
};
最简单的目标控制器
module.exports = {
[Actions 2 description, no-inputs, exits]
fn: async function (inputs, exits) {
// Look up by the user.id
var userRecord = await User.findOne({ id: this.req.token.id}) <== Fix here
// If there was no matching user, respond thru the "unfound" exit.
if(!userRecord) {
throw 'unfound';
}
return exits.success({
user: userRecord
});
}
};
答案 0 :(得分:0)
您还需要在config / policies.js中注册策略
sails网络应用程序模板中的示例:
module.exports.policies = {
'*': 'is-logged-in',
// Bypass the `is-logged-in` policy for:
'entrance/*': true,
'account/logout': true,
'view-homepage-or-redirect': true,
'deliver-contact-form-message': true,
};
答案 1 :(得分:0)
我以这种方式解决了问题。
要访问Actions2中的请求token
对象,我使用了this.req.token
。