在登录,提交和重定向期间管理我的JWT令牌时,我感到有点沮丧。在我开始之前,这是我的技术堆栈以防万一:
JQuery/Html -> Node.Js -> Java Restful Services -> MySQL.
我的java Restful服务管理创建JWT令牌,将其返回到Node.js层,该层决定如何处理它并将其传递给客户端。这一切都很有效。
要获取JWT令牌,我正在向Node中间层发出基于ajax的身份验证请求,该中间层对身份验证并返回令牌,该令牌被即时塞入客户端的localstorage中。
现在我不想让整个网站通过ajax从一个页面加载,这是一个复杂的网站,这样做只是愚蠢!我需要在携带JWT令牌的同时转发并导航到子页面。
这是问题(最后)......如何将JWT令牌发送到中间层(node.js)而不将其作为请求或帖子参数附加,因为这是一个很大的不可以?我似乎无法找到将其填入与Bearer相关联的标题中的方法。
答案 0 :(得分:4)
您需要使用例如cookie
或localStorage
Ajax请求
需要使用HTTP标头在每个请求中提供令牌。例如
POST /authenticatedService
Host: example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
这是一个示例代码,用于说明如何使用jquery
执行ajax POST请求$.ajax({
type: "POST", //GET, POST, PUT
url: '/authenticatedService' //the url to call
data: yourData, //Data sent to server
contentType: contentType,
beforeSend: function (xhr) { //Include the bearer token in header
xhr.setRequestHeader("Authorization", 'Bearer '+ jwt);
}
}).done(function (response) {
//Response ok. process reuslt
}).fail(function (err) {
//Error during request
});
表单提交
使用表单提交您无法控制浏览器设置的标头,因此无法使用Bearer令牌设置Authorization
标头。在这种情况下,你可以
始终使用POST(不是GET)来避免JWT缓存
链接强>
链接执行GET请求。您可以构建将JWT添加为查询参数url?jwt=...
但是,在这种情况下考虑安全风险。浏览器可以缓存网址,它将出现在日志中。如果攻击者有权访问,他们可能会获得它们。此外,用户可以复制链接并在Web应用程序之外使用它(例如通过电子邮件发送...)
答案 1 :(得分:1)
如果您不想执行上述任何操作,则唯一的选择是将令牌存储在Cookie中。您无法在链接中设置http标头。