使用AJAX的JWT令牌,非AJAX,JQuery

时间:2017-02-16 23:36:33

标签: javascript jquery ajax node.js jwt

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

JQuery/Html -> Node.Js -> Java Restful Services -> MySQL.  

我的java Restful服务管理创建JWT令牌,将其返回到Node.js层,该层决定如何处理它并将其传递给客户端。这一切都很有效。

要获取JWT令牌,我正在向Node中间层发出基于ajax的身份验证请求,该中间层对身份验证并返回令牌,该令牌被即时塞入客户端的localstorage中。

现在我不想让整个网站通过ajax从一个页面加载,这是一个复杂的网站,这样做只是愚蠢!我需要在携带JWT令牌的同时转发并导航到子页面。

这是问题(最后)......如何将JWT令牌发送到中间层(node.js)而不将其作为请求或帖子参数附加,因为这是一个很大的不可以?我似乎无法找到将其填入与Bearer相关联的标题中的方法。

2 个答案:

答案 0 :(得分:4)

您需要使用例如cookielocalStorage

在客户端存储令牌

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标头。在这种情况下,你可以

  • Cookie :将JWT存储在将与表单数据一起发送的Cookie中。您需要添加额外的安全性以避免CSRF附加
  • 表单参数:JWT存储在表单的隐藏字段中。

始终使用POST(不是GET)来避免JWT缓存

链接

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

的链接

但是,在这种情况下考虑安全风险。浏览器可以缓存网址,它将出现在日志中。如果攻击者有权访问,他们可能会获得它们。此外,用户可以复制链接并在Web应用程序之外使用它(例如通过电子邮件发送...)

答案 1 :(得分:1)

如果您不想执行上述任何操作,则唯一的选择是将令牌存储在Cookie中。您无法在链接中设置http标头。