2013-02-28 85 views
1

所以我正在尝试尽可能地实现我正在构建的这个API的OAuth 2。我处于需要生成access_token的位置,但我正在试图找出这样做的最佳方法。我读过一个人们正在加密revenant信息和access_token(如过期日期,客户端ID等)的地方,以防止在每个API调用中查找数据库。使用什么来生成OAuth 2访问令牌

我想到了这一点,并认为,如何生成access_token句柄撤销访问?我的意思是使用OAuth的好处之一是能够撤销应用程序对数据的访问权限,如果我只是在没有在数据库中查找的情况下使用加密数据,如果我撤消应用程序,它仍然有权访问到我的数据,直到至少access_token过期。

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

我思念的东西,有没有使用加密数据到的access_token,防止数据库查找每个API调用,并因为能够随时撤销访问的方法吗?

回答

1

你已经知道了两种方法(数据库中的令牌和独立令牌)的优点和缺点,这是你必须做出的选择。大多数供应商需要自给式令牌,我建议同样作为一个起点,例如JWS/JWE。然而,我认为你可以稍微调整一下它,并将两个世界中最好的一个与一个简单的技巧结合起来(我猜大多数提供者可能都这样做),而不是简单的自包含的令牌。考虑到令牌撤销特殊情况(至少比普通令牌操作少得多),您可以在数据库中仅保留已撤销令牌的列表。验证令牌,您可以在撤销令牌列表中搜索令牌:如果未找到,则可以将其签名或加密的内容用作正常使用。这样你仍然拥有一个数据库,但是记录数量更少,查找速度更快。例如。您只能使用您的键/值数据库,而不能同时使用键/值和关系数据库。如果您不希望API占用大量流量,那么您甚至可以通过将撤销令牌列表保存在内存中来保存整个数据库查找。无论如何,它们会在到期后周期性地将它们从清单中清除。

+0

有趣。我想我仍然需要在数据库中保留所有的令牌(仍然需要保留数据库中的所有有效令牌,以便能够撤销它们),但将它们放在单独的表中以加快查找速度会很好。 – ryanzec 2013-03-04 15:59:24

+0

由于授权代码和访问令牌过期非常快(即几分钟内),因此您可能不需要撤销它们。因此,您也可以选择仅保留数据库中的有效刷新标记列表,并在撤消时从列表中删除。您仍然可以使用独立代码和不需要列出的访问令牌节省大量数据库空间和搜索成本。 – 2013-03-04 16:20:37