我正在概念验证应用程序中实现OAuth2授权代码流 - 所以纯ASP.NET MVC,不使用DotNetOpenAuth或任何其他auth框架 - 我正在摸索如何处理撤销。
我的实现如下:
好的,这里的规范在推荐的实现上有点模糊,我认为这归结为当用户撤销授权时会发生什么。
选项1:
刷新令牌是一个包含用户ID,客户端ID和范围的自包含加密字符串。它不存储在任何地方。当访问令牌到期时,客户端向我发送刷新令牌。我解密了 这个,并检查我是否仍然有一份有效的授权记录 用户/客户端/范围组合。如果我这样做,我会给他们一个新的访问权限 令牌。如果没有,我会返回
invalid_grant
错误。在这种情况下,撤销授权意味着标记 我的数据库中的授权记录被撤销(或者只是删除它) 完全)。没有授权记录 - >刷新令牌将无效 - > FooApp无法再访问数据。
选项2:
我将刷新令牌与client_id一起存储在我的数据库中, 用户标识和该标记中授权的范围。当我收到请求 刷新令牌,我找到了refresh_token记录,检查它没有 被撤销等等。
在这种情况下,“撤销授权”将通过标记>来实现。我的数据库中的刷新令牌已被撤销,或通过删除它。
此外 - 在这种情况下,我无法看到任何理由在交换令牌后将授权保留在文件中。如果用户希望知道哪些应用程序可以访问其MyServer数据,我只需查询数据库中所有未撤销的刷新令牌和相关范围。
据我所知,任一选项都将满足OAuth2规范的要求,同时允许用户查看和撤销其MyServer帐户上当前活动的所有授权。一个限制是选项1不允许将多个单独的OAuth2令牌集发布到同一用户的同一客户端应用程序 - 但我想不出任何你想要这样做的场景。
你会推荐什么?加密令牌和存储授权?使用后删除授权,并存储刷新令牌?或者它真的没关系?