Rest JWT认证&;刷新令牌实现

Rest JWT认证&;刷新令牌实现,rest,security,authentication,jwt,Rest,Security,Authentication,Jwt,我正在开发一个具有自己的身份验证和授权机制的REST应用程序。我想使用JSON Web令牌进行身份验证。以下是有效且安全的实现吗 将开发一个RESTAPI来接受用户名和密码并进行身份验证。要使用的HTTP方法是POST,因此没有缓存。此外,在传输时还将使用SSL进行安全保护 在进行身份验证时,将创建两个JWT—访问令牌和刷新令牌。刷新令牌将具有更长的有效性。这两个令牌都将写入cookie中,以便在每个后续请求中发送它们 在每次RESTAPI调用中,将从HTTP头检索令牌。如果访问令牌未过期,请检

我正在开发一个具有自己的身份验证和授权机制的REST应用程序。我想使用JSON Web令牌进行身份验证。以下是有效且安全的实现吗

  • 将开发一个RESTAPI来接受用户名和密码并进行身份验证。要使用的HTTP方法是POST,因此没有缓存。此外,在传输时还将使用SSL进行安全保护
  • 在进行身份验证时,将创建两个JWT—访问令牌和刷新令牌。刷新令牌将具有更长的有效性。这两个令牌都将写入cookie中,以便在每个后续请求中发送它们
  • 在每次RESTAPI调用中,将从HTTP头检索令牌。如果访问令牌未过期,请检查用户的权限并相应地允许访问。如果访问令牌已过期,但刷新令牌有效,请重新创建新的访问令牌和具有新过期日期的刷新令牌(执行所有必要的检查以确保用户的身份验证权限未被撤销),并通过cookie发送回
  • 提供一个注销REST API,该API将重置cookie,因此在登录完成之前,后续API调用将被拒绝
  • 我对刷新令牌的理解如下:

    由于存在刷新令牌,我们可以缩短访问令牌的有效期,并经常(在访问令牌到期时)检查用户是否仍然有权登录

    如果我错了,请纠正我

    将开发一个RESTAPI来接受用户名和密码并执行以下操作 身份验证。要使用的HTTP方法是POST,因此 没有缓存。此外,在安装时还将使用SSL进行安全保护 过境

    这是大多数人做这件事的方式,所以你在这里很好

    在进行身份验证时,将创建两个JWT-访问令牌 和刷新令牌。刷新令牌将具有更长的有效性。两者 代币将写入Cookie中,以便在每个月发送 后续请求

    将令牌存储在cookie I中本身并不危险,但如果您以某种方式让服务器上的JWT模块从那里读取令牌,则容易受到CSRF攻击,任何网页都可能触发用户浏览器向服务器发送表单+站点cookie,除非您使用CSRF令牌。因此,通常它们存储在本地存储中,并且每次都“手动”添加到请求头中

    在每次RESTAPI调用中,将从HTTP中检索令牌 标题。如果访问令牌未过期,请检查 并相应地允许访问。如果访问令牌已过期 但刷新令牌有效,请重新创建新的访问令牌并刷新 具有新到期日期的代币(进行所有必要的检查以确保 用户的身份验证权限未被撤销)并通过发送回 饼干

    除了饼干的危险,它似乎是安全的

    提供一个注销REST API,该API将重置cookie,从而 在登录完成之前,将拒绝后续API调用

    您甚至不需要进行API调用,只需清除Cookie或localStorage对象,并确保您的客户端不会因缺少令牌而中断

    expressjwt模块的标准要求令牌位于其自己的“Authorization:Bearer[Token]”头中,我强烈建议不要使用cookie。localStorage API一直都可以使用,所以您应该很好

    编辑:

    首先,了解XSS和CSRF攻击之间的区别很重要,因为人们通常认为它们是同一件事

    XSS是指当用户在其他用户浏览器中的域上运行不安全的JS时,本地存储或会话中的JWT和Cookie中的JWT都不安全。使用cookie上的httpOnly标志,您无法直接访问它们,但浏览器仍会将它们与AJAX请求一起发送到您的服务器。如果发生这种情况,你通常是运气不好。为防止出现这种情况,请确保在将所有用户输入发送到浏览器时都将其转义

    如果您使用脚本标记或iFrame加载第三方JS,这可能会损害本地存储,除非您小心,但我在这方面做的工作还不够,无法帮助您

    只有当其他域试图通过让浏览器自动发送cookie来向您的服务器发送普通HTML表单时,CSRF才起作用。框架通过插入唯一的随机字符串作为隐藏字段并在提交时再次检查来防止这种情况。本地存储中的JWT是安全的,因为每个域都有自己单独的本地存储区域

    但最终所有这些都取决于您的服务是否使用单个域,在这种情况下,httpOnly Cookie将非常安全且更易于设置,但是,如果您想将服务扩展到多个域,如api.domain.com+app.domain.com,或者添加一个本机应用程序,您必须将其存储在localStorage或其他本机存储区域中

    希望这有帮助

    我对刷新令牌的理解如下:

    由于存在刷新令牌,我们可以保持较短的访问令牌有效期,并经常检查(访问令牌到期时)用户是否仍然有权登录

    如果我错了,请纠正我

    假设您正在谈论在OAuth中使用JWT作为承载令牌(我强烈建议遵循OAuth 2.0协议),这是正确的

    使用JWT中的附加身份验证时间(身份验证时间戳)声明,您甚至可以删除第二个令牌并将访问作为刷新令牌发送(如果令牌有效,则身份验证服务器可以发出新的访问令牌&身份验证时间在允许范围内)。。。但当然,遵循标准也很好;)

    无论如何,在使用JWTS作为刷新令牌之前,有一些额外的方面(往往会变得困难或甚至违背JWT的基本思想)。