Javascript 带有AJAX、非AJAX、JQuery的JWT令牌

Javascript 带有AJAX、非AJAX、JQuery的JWT令牌,javascript,jquery,ajax,node.js,jwt,Javascript,Jquery,Ajax,Node.js,Jwt,我对在登录、提交和重定向期间管理JWT令牌感到有点沮丧。在我开始之前,这里是我的技术堆栈,以防万一: JQuery/Html -> Node.Js -> Java Restful Services -> MySQL. 我的java Restful服务管理创建JWT令牌,并将其返回给Node.js层,该层决定如何处理它并将其传递给客户端。这一切都非常有效 为了获得JWT令牌,我向节点中间层发出了一个基于ajax的身份验证请求,节点中间层对令牌进行身份验证并返回令牌,该令牌被

我对在登录、提交和重定向期间管理JWT令牌感到有点沮丧。在我开始之前,这里是我的技术堆栈,以防万一:

JQuery/Html -> Node.Js -> Java Restful Services -> MySQL.  
我的java Restful服务管理创建JWT令牌,并将其返回给Node.js层,该层决定如何处理它并将其传递给客户端。这一切都非常有效

为了获得JWT令牌,我向节点中间层发出了一个基于ajax的身份验证请求,节点中间层对令牌进行身份验证并返回令牌,该令牌被概要地填充到客户端的本地存储中

现在我不想让整个站点通过ajax加载一个页面,这是一个复杂的站点,这样做简直是愚蠢!我需要在携带JWT令牌的同时前进并导航到子页面


这是问题(最后)。。。如何将JWT令牌发送到中间层(node.js),而不将其作为请求或post参数附加,因为这是一个很大的禁忌?我似乎找不到一种方法将其填充到与承载器关联的标题中。

如果您不想执行上面建议的任何操作,您唯一的选择是将令牌存储在cookie中。您不能在链接中设置http头。

您需要在客户端使用
cookie
localStorage

Ajax请求

  • Cookies:向服务器发出请求时会自动发送cookie,因此您无需添加特定的标头

  • LocalStorage:需要使用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
});
表格提交

表单提交时,您无法控制浏览器设置的标题,因此无法使用承载令牌设置
授权
标题。在这种情况下,你可以

  • Cookie:将JWT存储在将与表单数据一起发送的Cookie中。您需要添加额外的安全性以避免CSRF攻击
  • 表单参数:JWT存储在表单的隐藏字段中
使用always POST(非GET)避免JWT的缓存

链接

链接执行GET请求。您可以构建将JWT添加为查询参数的链接
url?JWT=…

但是,在这种情况下考虑安全风险。浏览器可以缓存url,它将出现在日志中。如果攻击者具有访问权限,则可能获得这些文件。用户还可以复制链接并在web应用程序外部使用(例如通过电子邮件发送…)


如果您使用cookie,令牌将通过单击链接自动发送到服务器,但这仅在用户经过身份验证的情况下起作用。在这种情况下,请注意CSRF漏洞

web是无状态的。你必须在每一个请求上传递它。我意识到了这一点,但我如何在每一个请求上正确地传递它呢。Ajax很简单,因为我可以设置标题,但普通的href或转发则是另一回事。实际上,我的Ajax请求中有这一点,但问题是,处理非Ajax请求的最佳方式是什么,例如单击菜单项从站点的一个部分导航到另一个部分?抱歉,我没有阅读您问题的最后一部分。请参阅更新的答案谢谢您的反馈,这就是我解决问题的方法。我通过一个与链接上的类关联的点击处理程序,动态地将令牌作为请求参数添加到url中。在节点端,我从param、header或post变量中获取令牌,并继续使用逻辑。我认为这至少比在请求或JS中公开要安全一点。有了链接,就没有更多的选择了。我建议也使用短到期时间和HTTPS