存储外部访问/刷新令牌

时间:2020-09-25 15:15:32

标签: laravel encryption oauth access-token refresh-token

我创建了一个Laravel应用程序,该应用程序要求我的用户使用oAuth(授权代码)访问外部应用程序。很好,我可以将外部应用程序连接到用户的帐户。但是,外部API为我提供了访问和刷新令牌。访问令牌显然会过期,刷新令牌不会过期。

用户授予我访问权限后,我需要将这些令牌存储在某个地方。特别是刷新令牌。访问令牌过期后,我需要刷新访问令牌。我的“问题”是,我不确定在哪里存储这些令牌。我想到了一些选择:

  • 将加密令牌存储在与用户链接的数据库中
  • 将它们存储在缓存中
  • 将它们存储在Redis数据库中
  • ...

有很多选择,但我正在寻找最安全的选择。将加密令牌存储在数据库中不是我最喜欢的选择,而是最持久的选择。可以有意或无意清除缓存。清除缓存后,我需要用户再次授予我对其帐户的访问权限。

存储这些凭据的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

安全性

存储这些凭据的最佳方法是什么? 有很多选择,但我正在寻找最安全的选择。

无论将其存储在何处,都必须以加密格式进行。这样,即使泄漏,也无法重复使用,除非加密密钥也泄漏。

刷新令牌持久性

将加密令牌存储在数据库中不是我最喜欢的选择,而是最持久的选择。

您可以使用会话,JWT令牌或直接在数据库中进行操作。让我们看看选项...

Laravel会话

如果您在Laravel应用程序中使用用户会话,则可以将其加密存储在每个用户的会话中。

Laravel Sessions

由于HTTP驱动的应用程序是无状态的,因此会话提供了一种在多个请求中存储有关用户信息的方法。 Laravel附带了各种会话后端,这些后端可通过表达性的统一API进行访问。开箱即用地支持流行的后端,例如Memcached,Redis和数据库。

Laravel还支持将会话存储在加密的cookie中。

JWT令牌

如果您使用的是JWT令牌,那么您可能使用的是JWS令牌,然后将其加密存储在JWS声明中,甚至更好,请使用JWE令牌。

JWT令牌中的声明是JWT令牌的有效载荷中的键/值对。 JWT令牌由header.payload.signature组成。有效负载示例:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

JWS

JSON Web签名(缩写为JWS)是IETF提出的用于对任意数据进行签名的标准(RFC 7515)。[1]这用作包括JSON Web令牌在内的各种基于Web的技术的基础。

JWE

JSON Web加密(JWE)是一种IETF标准,为基于JSON和Base64的加密数据交换提供了标准化语法。[1]它由RFC7516定义。与JSON Web签名(JWS)一起,它是JWT(JSON Web令牌)的两种可能格式之一。 JWE是JavaScript对象签名和加密(JOSE)协议套件的一部分。

您可以在https://jwt.io/introduction上了解有关JWT的更多信息。

数据库

更方便地使用数据库,也就是应用程序中已经可用的数据库。不要仅仅为了存储刷新令牌而引入Redis,但是如果您已经在使用Redis,那么它可以作为替代方案,但是我只是将其加密存储在已经存储了用户信息的数据库中。毕竟,刷新令牌并不是您在每个请求中都要执行的操作,因此在这里性能可能不是那么关键。

答案 1 :(得分:0)

内存和加密数据库是最好的选择。内存不足,因为如果发生任何形式的内存刷新,您将丢失它。这样就剩下加密的数据库