我应该如何存储由RESTful API生成的令牌?

我已经构build了一个API来为login的用户生成身份validation令牌。此时,我还有一个用Node.JS编写的客户端应用程序。
当我使用用户证书从客户端应用程序向API发出请求时,我得到身份validation令牌:我应该如何将其存储在客户端应用程序中? 我不应该每次我想要API的请求时要求一个令牌,对吗?
我想把这个标记放入Cookie中,但我认为这不是最好的解决scheme。 你会推荐什么?

成功login后,应该在服务器端创build一个唯一的一次性令牌,并将其存储在数据库中,与用户ID和时间戳相对应。 您将令牌存储在Cookie客户端。 然后将令牌传递给每个后续的API调用。 然后,服务器应该检查令牌是否有效(即没有过期,比如发出或更新less于30分钟前)。 如果它是有效的,您可以检索存储在该令牌上的用户详细信息,并执行所需的任何后端function(如用户通过身份validation)。 然后,您更新该令牌的时间戳(刷新会话,因为您希望login在超过30分钟没有用户交互后超时)。 如果在获取API调用时令牌已过期或不存在,请redirect到login页面。

此外,你可能已经知道这一点,但要确保令牌是唯一的和不可猜测的,我倾向于生成新的随机GUID并encryption它们,不要使用sequentail ID或类似的东西。

我认为这个链接可以帮助你:

实际上,您应该有一个带有过期date的令牌,所以您在发送请求之前不必每次都获取新的令牌。 当令牌到期时,您只需从服务“刷新令牌”中获取新的令牌。

关于如何在客户端应用程序中存储令牌的问题,我认为您可以将其保存在内存(地图或embedded式数据库)中。

否则,我不认为在这种用例中使用cookie是一个好主意。

希望它会帮助你。 蒂埃里

我们正在研究一个使用非常类似的方法的应用程序。 客户端应用程序是一个静态的HTML5 / JS单页面应用程序(无需任何服务器端生成)并与API服务器进行通信。

最好的方法是将会话令牌存储在内存中:也就是在JS代码中的一个variables内。 如果你的客户端应用程序是一个单一的页面,这应该不成问题。
除此之外,我们还将会话令牌保存在sessionStorage中,以便在用户刷新页面的情况下保留会话令牌。 为了在创build新选项卡时保留标记(sessionStorage特定于浏览器窗口),我们还在closures页面的同时将其存储在localStorage中,并与打开的选项卡的计数器一起存储(当应用程序的所有选项卡closures时,我们删除令牌。

// Handle page reloads using sessionStorage var sess = sessionStorage.getItem('session-token') if(sess && sess !== 'null') { // Sometimes empty values are a string "null" localStorage.setItem('session-token', sess) } // Set a counter to check when all pages/tabs of the application are closed var counter = parseInt(localStorage.getItem('session-counter') || 0, 10) counter++ localStorage.setItem('session-counter', counter) // Event fired when the page/tab is closing window.onbeforeunload = function() { var counter = parseInt(localStorage.getItem('session-counter') || 0, 10) counter-- localStorage.setItem('session-counter', counter) // All pages are closed: remove the session token if(counter <= 0) { // Handle page reloads using sessionStorage sessionStorage.setItem('session-token', localStorage.getItem('session-token')) localStorage.removeItem('session-token') } } 

有关localStorage和sessionStorage的更多信息: https : //developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API

为什么不cookie? Cookie不好有两个原因:1.它们通常更加持久,在浏览器窗口和标签之间共享,甚至在浏览器closures后也可以保留。 2.然而,最重要的是,根据HTTP规范,每次请求都必须发送到Web服务器。 如果你正在devise一个客户端与API服务器完全分离的应用程序,你不希望客户端的服务器在任何情况下都看到(或login)会话令牌。

一些额外的build议:

  1. 会话令牌必须到期。 您可以通过将会话令牌存储在服务器上的数据库中并在每个请求上对其进行validation和/或对它们进行“签名”(以明文forms向令牌添加时间戳,然后添加签名部分(例如HMAC哈希)与您只知道密钥编码的时间戳)。
  2. 令牌可以在其生命中多次重复使用。 但是,在几秒钟之后,您可能希望服务器刷新令牌,使旧令牌无效并向客户端发送新令牌。