用于生成OAuth 2访问令牌的内容

时间:2013-02-28 12:06:20

标签: api security oauth-2.0

所以我正在努力实现尽可能密切地实现我正在构建的API的OAuth 2。我正处于需要生成access_token的位置,但我正在尝试找出执行此操作的最佳方法。我已经在人们正在加密revenant信息和access_token(如过期日期,客户端ID等等)的地方阅读,以防止在每个API调用上查找数据库。

我想到了这一点并想到,生成access_token句柄的方式如何撤销访问?我的意思是使用OAuth的一个优点是能够撤消对应用程序数据的访问,如果我只使用加密数据而不在数据库中查找,如果我撤销应用程序,它仍然可以访问到我的数据,直到至少access_token到期。

我认为防止在关系数据库中查找的更好方法是将access_token存储在键/值数据库(如redis)中,因为这会更快一些。这样,如果有人撤销对应用程序的访问权限,它可以删除关系数据库中的记录和键/值数据。

我错过了什么,有没有办法将加密数据用于access_token,防止数据库查找每个API调用,并且因为能够随时撤销访问权限?

1 个答案:

答案 0 :(得分:1)

您已经了解了两种方法(数据库中的令牌与自包含令牌)的优缺点,这是您必须做出的选择。大多数提供商都使用自包含令牌,我建议将其作为起点,例如JWS / JWE。

然而,我认为你可以稍微调整它,并将两个世界中最好的一个用简单的技巧结合起来(我想大多数提供商也可以这样做),而不是简单的自包含令牌。考虑令牌撤销特殊情况(至少比正常令牌操作少得多),您可以仅保留数据库中已撤销令牌的列表。验证令牌,您可以在撤销令牌列表中搜索它:如果未找到,则可以正常使用其签名或加密内容。这样,您仍然拥有一个数据库,但记录显着减少,查找速度更快。例如。您只能使用键/值数据库,而不是同时拥有键/值和关系数据库。如果您不希望API流量过大,您甚至可以通过将已撤销的令牌列表保留在内存中来保存整个数据库查找,例如无论如何,它们会在它们到期后定期将它们从列表中清除。