假设我有一个用户从我的系统中删除了软件。我也想撤销他们的令牌。完成此任务的最佳方法是什么?是否像做
这样简单 Doorkeeper::AccessToken.where(resource_owner_id: deleted_user.id).each(&:revoke)
还是有更好的方法吗?
答案 0 :(得分:0)
您可以执行以下操作,其中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很小,易于理解,如果您需要对其进行自定义。
答案 1 :(得分:0)
@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_id。