如何手动撤销门卫令牌?

时间:2017-09-26 17:18:52

标签: ruby-on-rails doorkeeper

假设我有一个用户从我的系统中删除了软件。我也想撤销他们的令牌。完成此任务的最佳方法是什么?是否像做

这样简单

Doorkeeper::AccessToken.where(resource_owner_id: deleted_user.id).each(&:revoke)

还是有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作,其中application_id是Doorkeeper应用程序ID,resource_owner是已删除的用户:

Doorkeeper::AccessToken.revoke_all_for(application_id, resource_owner)

由于您专门询问了有关撤消某个用户的所有令牌(未提及应用程序)的问题,因此您可以选择以下选项:

  1. 对每个要撤消的应用程序ID调用一次(如果您的应用程序ID很少,应该没问题),或者
  2. 调用一次,但传递多个应用程序ID的数组而不是一个(此方法对我有用),或者
  3. 修改删除应用程序ID范围的方法

对我有用的方法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。