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

时间:2015-04-19 11:29:59

标签: oauth-2.0

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

我的实现如下:

  1. 用户登录FooApp(OAuth2客户端应用程序 - 网站)
  2. FooApp将用户重定向到www.myserver.com/accounts/authorize
  3. 用户说“是的,FooApp可以访问我的东西”
  4. 我生成授权码将此代码存储在myserver.com 以及用户已授权的客户端ID,用户ID和范围。 (在我的实现中,授权代码是存储谁授权什么的数据库记录的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的授权。
  10. 好的,这里的规范在推荐的实现上有点模糊,我认为这归结为当用户撤销授权时会发生什么。

    选项1:

      

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

         

    在这种情况下,撤销授权意味着标记   我的数据库中的授权记录被撤销(或者只是删除它)   完全)。没有授权记录 - >刷新令牌将无效 - > FooApp无法再访问数据。

    选项2:

      

    我将刷新令牌与client_id一起存储在我的数据库中,   用户标识和该标记中授权的范围。当我收到请求   刷新令牌,我找到了refresh_token记录,检查它没有   被撤销等等。

         

    在这种情况下,“撤销授权”将通过标记>来实现。我的数据库中的刷新令牌已被撤销,或通过删除它。

         

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

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

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

0 个答案:

没有答案