据我了解,在 OAuth 中有一个刷新令牌和一个访问令牌。访问令牌不能被撤销,而是短暂的,并且在下次刷新访问时,如果被撤销,将没有访问令牌。我有一个简单的应用程序,我自己发行令牌并在一个应用程序(移动和网络,但相同的 API)中消费自己,所以我不需要任何复杂的 OAuth 或 OpenIdConnect 用于 3d 派对。为简单起见,我想只使用一个令牌来使用此方案,但出于性能原因,我也想刷新它(而不是检查每次调用的撤销):
- 客户端向特殊端点提供用户名和密码,并接收已签名但未加密的 JWT(据我了解,这已经足够了,用户可以读取但不能伪造)。我在 .NET 中使用 JwtSecurityTokenHandler 自己发出令牌,而无需 Oauth 或 OpenIdConenct 服务器来执行此操作。该令牌使用 RSA SHA 256 和我自己创建的证书进行签名。令牌是短暂的,例如 1 小时。
- 所有 api 调用都通过 Bearer 身份验证进行了修改,我读取了服务器上的令牌并验证了签名和过期时间(没有别的,比如 Audience 等)。服务器将信任此令牌并且不会检查撤销。
- 如果服务器检测到令牌已过期,它将返回大约 40x 以让客户端知道刷新令牌。(客户端可以自行对到期日期进行预验证,因为令牌未加密以保存一些服务器调用)。
- 如果令牌过期,客户端将调用刷新并将相同的令牌传递给它。不同之处在于这一次验证了撤销状态(我有一个简单的撤销用户策略的所有令牌,而不是每个令牌)。我将检查未随刷新而更改的初始问题的附加时间戳,并验证它是否大于设置的用户时间戳,例如当用户更改密码时。结果是另一个相同类型的令牌,具有相同的初始时间戳和 1 小时以上的到期时间。如果撤销,则用户将不得不重新登录。
出于性能考虑,我确实需要刷新,但我想知道我是否遗漏了一些东西,并且确实存在安全问题,或者这个简化流程仅使用一个令牌可能存在其他问题?