我已经构建了一个API,可以为登录的用户生成身份验证令牌。此时我还有一个用Node.JS编写的客户端应用程序。
当我使用客户端应用程序的用户凭据向API发出请求时,我获得了身份验证令牌:我应该如何将其存储在客户端应用程序中?我每次想要提出API请求时都不应该请求令牌,对吗?
我想过将令牌放在Cookie中,但我不认为这是最好的解决方案。
你会推荐什么?
答案 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服务器完全分离的应用程序,那么您不希望客户端的服务器在任何情况下都能看到(或记录!)会话令牌。
一些额外的建议: