Javascript 从节点访问JWT的最佳方式是什么?

Javascript 从节点访问JWT的最佳方式是什么?,javascript,angularjs,node.js,html,Javascript,Angularjs,Node.js,Html,我已经使用Node.js实现了JWT身份验证。当用户登录时,Node.js会签署/创建一个JWT并将其发回。此后,它将存储在localStorage中。现在,这可能是我错的地方,但是。。。为了前进,我使用了express路由器,在路由器代码(显然是在节点级别)中,我希望能够访问令牌(位于localStorage),以便调用API获取更多数据。但是,我刚刚意识到localStorage位于客户端,而node/express/router无法识别localStorage。所以我被卡住了。显然,我在做

我已经使用Node.js实现了JWT身份验证。当用户登录时,Node.js会签署/创建一个JWT并将其发回。此后,它将存储在localStorage中。现在,这可能是我错的地方,但是。。。为了前进,我使用了express路由器,在路由器代码(显然是在节点级别)中,我希望能够访问令牌(位于
localStorage
),以便调用API获取更多数据。但是,我刚刚意识到localStorage位于客户端,而node/express/router无法识别
localStorage
。所以我被卡住了。显然,我在做一些根本错误的事情。。。我不需要从express router文件访问
localStorage
。也许,我真的应该从客户端调用API,而不是从express router文件


有任何提示/说明吗?

本地存储是保存令牌的糟糕方式。您应该将令牌保存在cookies中,然后在需要的地方使用

例如:

new Cookies(req,res).set('access_token',token,{
  httpOnly: true,
  secure: true      // for your production environment
});
然后读:

var token = new Cookies(req,res).get('access_token');

每次向服务器端发出API请求时,都需要发送存储在客户端的JWT

向下滚动至JSON Web令牌如何工作?JWT应以以下形式发送到API调用的标题中:
授权:持票人

如何做到这一点取决于将HTTP请求发送到API的确切方式,但在任何方面都应该非常简单。您可以通过以下链接了解如何向angular$http请求添加头: $http


然后,您的每个经过身份验证的express Route都要检查标头,拉出JWT,确保其有效,然后继续执行请求(或者在JWT无效时停止请求)。

是什么让本地存储比cookie更糟糕?它在客户端的存储方式与服务器端无关。唯一真正的问题是如何形成请求,以及是否同时存在HTTP和HTTPS页面。(我使用cookie,我只是看不到从本地存储获取cookie和设置请求头有什么主要的缺点。)cookie主要用于读取服务器端,本地存储只能读取客户端LocalStorage是存储接口的实现。它存储的数据没有过期日期,只能通过JavaScript清除,或者清除浏览器缓存/本地存储的数据-这与cookie过期不同。是的,我知道这一点,但设置正确的头很容易。我不反对使用cookie,但JWT的本质应该是无会话的,因此,用户信息不会存储在服务器端。使用cookies而不是localStorage只是为了在服务器端访问令牌,这似乎是错误的。我应该能够通过路由器代码(即服务器端代码)访问令牌的唯一方法是从请求中检索令牌。所以我仍然觉得我需要将API调用从express移动到客户端。谢谢。但是,要每次将JWT发送到API,我需要首先从localStorage中提取它。这是我的主要问题,我无法这样做,因为localStorage在node/express级别不可用。也许我误解了这个问题,但我认为您需要从客户端的localStorage中提取它,然后通过HTTP请求将其发送到node/express。您的服务器端不是运行node/express服务器,而客户端只是浏览器吗?还是我错了?您绝对应该从客户端向服务器进行API调用。“也许,我真的不应该从express router文件进行API调用,而是从客户端进行API调用。”如果您不需要从服务器向客户端发送任何私钥或“隐藏”信息来完成此任务,那么这样做似乎会更好。很酷,谢谢你的建议。很高兴看到我的思路是正确的。非常感谢。