我需要的是每当用户请求新的访问令牌时,旧的访问令牌将变得无效、无法使用并被删除。
在请求新的访问令牌时提供一个新的似乎是一种预期的行为。您是否无法在请求新令牌之前撤销现有令牌?
更新
如果您决定只保留一个令牌 -
类
OAuth2Validator 继承了 OAuthLib 的
RequestValidator
并覆盖了方法
save_bearer_token。在此方法中,在与
AccessToken model 实例创建及其 .save() 方法相关的代码之前,您可以查询(类似于
this)以查看是否已经为此用户保存了 AccessToken。如果找到现有令牌,则可以从数据库中删除该令牌。
我强烈建议将此更改做成可配置的,以防您将来改变主意(毕竟有多个令牌是出于像
this这样的原因)
一个更简单的解决方案是拥有自己的验证器类,可能继承
oauth2_provider.oauth2_validators.OAuth2Validator
并重写
save_bearer_token
。 将这个新类给予
settings.py
中的
OAUTH2_VALIDATOR_CLASS
。
另外,有没有办法使密码grunt类型不创建刷新令牌。在我的应用程序中,我没有任何用途。
Django OAuth Toolkit依赖于OAuthLib。
将refresh_token设为可选的关键在于OAuthLib的BearerToken类的create_token方法
(此行)和密码授权的类
(此处) 。正如您可以看到的那样,该类的__init__方法接受refresh_token参数,默认设置为True。该值在同一类的create_token_response方法中使用,位于该行
token = token_handler.create_token(request, self.refresh_token)
create_token_response
方法在 Django OAuth 工具包的 OAuthLibCore
类中,我相信它调用了 OAuthLib 中对应的 create_token_response
方法。观察此类的 __init__
方法中使用 self.server
和其初始化方式,该方法只传递了验证器作为参数,与 refresh_token
无关。
将其与 OAuthLib Implicit 授权类型 的 create_token_response
方法进行比较,后者明确执行了
token = token_handler.create_token(request, refresh_token=False)
不创建refresh_token
所以,除非我漏掉了什么,简而言之,我认为Django OAuth toolkit没有暴露可选的refresh_token
功能。