我应该如何存储和撤销OAuth2授权和/或刷新令牌?

Dyl*_*tie 6 oauth-2.0

我正在一个概念验证应用程序中实现OAuth2授权代码流 - 所以纯ASP.NET MVC,不使用DotNetOpenAuth或任何其他auth框架 - 我正在摸索如何处理撤销.

我的实现是这样的:

  1. 用户登录FooApp(OAuth2客户端应用程序 - 网站)
  2. FooApp将用户重定向到www.myserver.com/accounts/authorize
  3. 用户说"是的,FooApp可以访问我的东西"
  4. 我生成授权代码,并将此代码与用户已授权的客户端ID,用户ID和范围一起存储在myserver.com中.(在我的实现中,授权代码是存储谁授权什么的数据库记录的GUID密钥.)
  5. 用户被重定向回FooApp
  6. FooApp向MyServer发出HTTP请求,包括授权代码
  7. MyServer查找该授权代码,验证它是否有效且未过期.它标记了使用的授权代码 - 因为OAuth2授权代码必须是单用且短暂的 - 然后使用刷新令牌访问令牌响应FooApp
  8. FooApp使用access_token来访问用户的数据.当access_token在10分钟后过期时,FooApp使用refresh_token来获取另一个.
  9. 几周后,用户决定他们厌倦了FooApp访问他们的数据,因此他们登录MyServer并撤销FooApp的授权.

好的,这里的规范在推荐的实现上有点模糊,我认为这归结为当用户撤销授权时会发生什么.

选项1:

刷新令牌是一个包含用户ID,客户端ID和范围的自包含加密字符串.它不存储在任何地方.当访问令牌到期时,客户端向我发送刷新令牌.我解密了这个,并检查我是否仍然在该文件中为该用户/客户端/范围组合提供了有效的授权记录.如果我这样做,我会向他们发送一个新的访问令牌.如果没有,我会返回invalid_grant错误.

在这种情况下,撤消授权意味着将我的数据库中的授权记录标记为已撤销(或仅将其完全删除).没有授权记录 - >刷新令牌将无效 - > FooApp无法再访问数据.

选项2:

我将刷新令牌与client_id,用户ID和该令牌中授权的作用域一起存储在我的数据库中.当我收到刷新令牌的请求时,我找到了refresh_token记录,检查它是否已被撤销等.

在这种情况下,"撤销授权"将通过将我的数据库中的刷新令牌标记为已撤销或通过删除来实现.

另外 - 在这种情况下,一旦交换了令牌,我就看不出有任何理由将授权保留在文件中.如果用户希望知道哪些应用程序可以访问其MyServer数据,那么我只需查询数据库中所有未撤销的刷新令牌和相关范围.

据我所知,任一选项都将满足OAuth2规范的要求,同时允许用户查看和撤销其MyServer帐户上当前活动的所有授权.一个限制是选项1不允许将多个单独的OAuth2令牌集发布到同一用户的同一客户端应用程序 - 但我想不出您想要执行此操作的任何场景.

你会推荐什么?加密令牌和存储授权?使用后删除授权,并存储刷新令牌?还是真的没关系?