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

时间:2015-02-23 13:28:51

标签: node.js api rest authentication token

我已经构建了一个API,可以为登录的用户生成身份验证令牌。此时我还有一个用Node.JS编写的客户端应用程序。
当我使用客户端应用程序的用户凭据向API发出请求时,我获得了身份验证令牌:我应该如何将其存储在客户端应用程序中?我每次想要提出API请求时都不应该请求令牌,对吗? 我想过将令牌放在Cookie中,但我不认为这是最好的解决方案。 你会推荐什么?

3 个答案:

答案 0 :(得分:6)

成功登录后,应在服务器端创建一个唯一的一次性令牌,并根据用户ID和时间戳存储在数据库中。您将令牌存储在cookie客户端。然后,将令牌传递给每个后续API调用。然后服务器应该检查令牌是否有效(即没有过期,比如发布或更新少于30分钟前说)。如果它有效,您可以检索针对该令牌存储的用户详细信息,并执行您需要的任何后端功能(当用户通过身份验证时)。然后,您可以更新该令牌的时间戳(刷新会话,因为您希望在没有用户交互的30分钟之后登录超时)。如果在获得API调用时令牌已过期或不存在,请重定向到登录页面。

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

答案 1 :(得分:1)

我认为此链接可以帮助您:

实际上,您应该拥有一个具有过期日期的令牌,因此您不必在每次发送请求之前获取新令牌。当令牌过期时,您只需要从服务“刷新令牌”中获取一个新令牌。

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

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

希望它会对你有所帮助。 亨利

答案 2 :(得分:1)

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

最好的方法是将会话令牌存储在内存中:即,在JS代码中的变量内。如果您的客户端应用程序是单页,那应该不是问题 除此之外,我们还将会话令牌保留在sessionStorage中,以便在用户刷新页面时保留它。要在创建新选项卡时保留令牌(sessionStorage特定于浏览器窗口),我们还会在关闭页面时将其存储在localStorage中,以及打开选项卡的计数器(当应用程序的所有选项卡都关闭时,我们删除令牌。

// 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

为什么不使用cookies? Cookie有两个原因: 1.它们通常更具持久性,在浏览器窗口和选项卡之间共享,即使在浏览器关闭后它们也可以保留。 2.但最重要的是,根据HTTP规范,每次发出请求时都必须将它们发送到Web服务器。如果您正在设计一个客户端与API服务器完全分离的应用程序,那么您不希望客户端的服务器在任何情况下都能看到(或记录!)会话令牌。

一些额外的建议:

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