我可以创建和存储auth令牌列表而不是使用JWT和类似吗?

时间:2017-07-26 05:18:25

标签: database rest authentication jwt

我正在使用NodeJS堆栈进行开发创建我的第一个SPA,我来到了设计身份验证并保护应用程序某些部分的地步。
我读了很多关于auth技术的内容,包括JWT,OAuth等,但我仍然没有找到类似«真实世界的例子»。 让我们假设我的任务只是从公共场所保护应用程序的某些部分。我的应用程序不适用于第三方服务,因此我认为不需要使用Google或Facebook身份验证。我想使用登录/密码并使用我自己的数据库服务器存储所有这些数据 我不明白认证无状态的意义。我得出一个简单的结论,我可以用这种方式设计身份验证:

  • 我将用户登录名和密码存储在我的数据库中。
  • 用户身份验证意味着用户输入其凭据,服务器检查并创建令牌。然后服务器将此令牌保存到数据库中如果用户不是浏览器环境,则用户使用浏览器本地存储或其他地方保存令牌。
  • 在每个请求客户端发送此令牌时,服务器会检查此令牌是否存在并做出相应的响应。
  • 用户可以从不同的设备登录,我们只为他创建多个令牌。
  • 我们可以通过从数据库中删除用户令牌来结束特定会话或所有会话。
  • 我们可以按照我们想要的方式管理令牌,例如服务器可以检查到期时间和无效(删除)令牌。

可以吗?如果我们需要使令牌无效,JWT需要额外的实现,我看到了不同的示例,所有这些示例都基于存储无效的令牌,但如果我们只能存储有效代币?通过实施此存储,我们已经失去了无国籍状态 我看到我可以使用cookie而不是上面描述的实现,但我不喜欢在RESTful应用程序中使用cookie,因为它实际上取决于类似浏览器的客户端环境。
在服务器上存储令牌有什么缺点?

2 个答案:

答案 0 :(得分:0)

我已经实现了一个需要用户身份验证的项目,并且令牌存储在数据库中。

您可以找到示例here

答案 1 :(得分:0)

您正在使用会话cookie描述传统的身份验证方法。服务器为由sessionid标识的每个连接用户存储会话。 sessionid由客户端存储在cookie中,并在每个后续请求中发送以识别用户。

您可以在浏览器或移动设备中完美地使用此方法(使用设备存储而不是cookie)

缺点是需要许多服务器资源来保持会话打开,并且需要在每次身份验证时查询数据库以检索用户数据。这就是JWT解决的问题。用户信息本身就是令牌,并且是可靠的,因为它是用服务器的密钥签名的。

JWT有其自身的缺点,例如,如果您需要一个撤销列表,它就没有用,因为它们需要服务器存储。