【发布时间】:2017-09-26 17:18:51
【问题描述】:
假设我有一个已从系统中软删除的用户。我也想撤销他们的令牌。实现这一目标的最佳方法是什么?是否像做类似的事情一样简单
Doorkeeper::AccessToken.where(resource_owner_id: deleted_user.id).each(&:revoke)
或者有更好的方法吗?
【问题讨论】:
假设我有一个已从系统中软删除的用户。我也想撤销他们的令牌。实现这一目标的最佳方法是什么?是否像做类似的事情一样简单
Doorkeeper::AccessToken.where(resource_owner_id: deleted_user.id).each(&:revoke)
或者有更好的方法吗?
【问题讨论】:
您可以这样做,其中application_id 是 Doorkeeper 应用程序 ID,resource_owner 是已删除的用户:
Doorkeeper::AccessToken.revoke_all_for(application_id, resource_owner)
由于您专门询问撤销用户的所有令牌(未提及应用程序),您的选择是:
对我有用的方法 2 示例:
class User
def revoke_all_access_tokens!
application_ids = Doorkeeper::Application.pluck(:id) + [nil]
Doorkeeper::AccessToken.revoke_all_for(application_ids, self)
end
end
请注意,如果您还想删除没有应用程序 ID 的令牌(取决于您使用 Doorkeeper 的方式),+ [nil] 是必需的。
code for this method 小巧易懂,如果您需要自定义它。
【讨论】:
@Justin Workman 的回答很棒。
在我检查了revoke_all_for方法的实现之后
def revoke_all_for(application_id, resource_owner, clock = Time)
by_resource_owner(resource_owner)
.where(
application_id: application_id,
revoked_at: nil,
)
.update_all(revoked_at: clock.now.utc)
end
我发现如果你想撤销一个资源所有者的所有令牌而不考虑应用程序,你可以调用:
Doorkeeper::AccessToken.by_resource_owner(resource_owner).where(revoked_at: nil).update_all(revoked_at: Time.now.utc)
我们可以保存一个 db 调用来计算所有 application_ids。
【讨论】: