gpt4 book ai didi

node.js - 如何通过 Header 传递 JWT 并通过 Sails.js 中的服务器端 View 检索数据

转载 作者:太空宇宙 更新时间:2023-11-03 22:44:07 24 4
gpt4 key购买 nike

后端:Sails.js

我已经为 REST API 实现了 JSON Web Token,其中从前端到各个 Controller 操作的所有 AJAX 请求都会返回数据 res.json(data);仅当它通过授权 header 接收到正确的 JWT 时。它按预期工作。

现在,我已经使用 EJS 创建了一个 View <%= name => ,现在 Controller 具有详细信息 res.view('/home', {name: "Bill"} );并将路由也配置为指向相应的 Controller 。

如何通过使用属性 <%= name => 从服务器端 View 中使用已颁发的 JWT(存储在 localStorage 中)进行身份验证,从 Controller 检索“名称”

谢谢。

代码:

View /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);
};

配置/routes.js

module.exports.routes = {
'/': {
controller: 'UsersController',
action: 'info'
},
};

解决方案:

要使用 JWT 作为从客户端浏览器到服务器的身份验证因素,可以使用 localStorage 或 session cookie。由于服务器中的实现更容易,我最终将范围缩小到使用 cookie。

对用户进行身份验证后,将 JWT 存储在客户端浏览器中,

res.cookie('jwttoken', sailsTokenAuth.issueToken(profile.name));

然后可以使用 req.cookies.jwttoken 检索它并通过服务(jwt.verify)验证它,以通过res.json访问请求的信息或res.view

最佳答案

无法看到您的任何代码,因为未提供,但可以说您设置了自定义策略 api/policies/jwt.js 等,并在其中检查 JWTToken每个请求。类似于(为了简单起见,忽略任何错误处理):

module.exports = function (req, res, next) {

var token = req.headers.authorization.split(' ')[1];
var payload = jwt.decode(token, config.TOKEN_SECRET);
req.userId = payload.sub;
next();
};

请注意我如何将 userId 附加到 req 对象上 (req.userId = payload.sub;)。这意味着在您的 Controller 中,您将可以访问userId(或者在您的情况下,您用于识别登录用户等的任何ID),因为您可以简单地从传入的 req 对象引用它。

显然,您对 JWT 策略的实现可能会有所不同,但只需将其自定义为类似上面的内容即可。如果您实际上将 name 保留在 jwt token 本身中(看不到您的实现),则只需将其附加到 req 对象(不需要模型查找)。

一旦您获得了所需的名称,请将其传递到您的 View (就像您当前对上面的硬编码值 Bill 所做的那样。

根据更新的问题进行更新

因此,根据您的评论和更新的问题,您已成功从 JWT token 中提取个人资料信息,并从模型查找中获取所需的个人资料信息。您现在无法在 EJS View 上显示该名称。

所以你可以实现这样的目标:

Controller :

res.view('index', {
name: profile.name
}

请注意,我删除了 profile.name 之后的逗号;)

如果您正在使用的模板引擎,

config/views.js 应设置为“ejs”。

剩下的看起来不错。至少,符合我的预期。

最好的办法是显式使用调试器,或者至少在controller.info方法返回之前使用console.log语句,并确保profile.name按预期设置。如果您做到了这一点,那么您就会知道问题出在以某种方式查看的路由上。

您可以尝试在 View 下创建一个子文件夹,并重命名 View 文件(索引有点特殊..)。执行类似 views/xxx/yyy.ejs

的操作

还暂时注释掉您的controller.info方法,并将其替换为非常简单的内容,例如:

res.view('xxx/yyy', {
name: 'bob'
});

根据进一步的用户反馈进行进一步更新

从您上次的评论开始,您的问题正在逐渐演变......

我认为您现在所说的是 Sails 代码全部正常工作,并且使用 Postman 证明可以正常工作。但在使用 Web 浏览器客户端时会失败,因为您的客户端代码未在 http header 中传递正确的 token 信息。

如果是这种情况,您需要在客户端上创建一个拦截器,以编程方式应用 header 信息。

例如。 (只是从 Angular 工厂 authInterceptor 中获取的片段,但这里没有显示任何特定于 Angular 的内容):

 request: function (config) {
var token = authToken.getToken();

if (token) {
config.headers.Authorization = 'Bearer ' + token;
}

return config;
},

上面,根据请求,从本地存储(您说您正在工作)检索 JWT,如果 token 存在,则使用“承载 token ”形式的授权 header 更新 http header 信息'。

我还没有看过你的存储库,说实话,我确实觉得我已经给了你很多信息。根据我提供的内容,也许再多一点谷歌搜索/测试,您应该能够得到一个可行的解决方案。

关于node.js - 如何通过 Header 传递 JWT 并通过 Sails.js 中的服务器端 View 检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34812892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com