【问题标题】:How to manually revoke a Doorkeeper token?如何手动撤销 Doorkeeper 令牌?
【发布时间】:2017-09-26 17:18:51
【问题描述】:

假设我有一个已从系统中软删除的用户。我也想撤销他们的令牌。实现这一目标的最佳方法是什么?是否像做类似的事情一样简单

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

或者有更好的方法吗?

【问题讨论】:

    标签: ruby-on-rails doorkeeper


    【解决方案1】:

    您可以这样做,其中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 小巧易懂,如果您需要自定义它。

    【讨论】:

      【解决方案2】:

      @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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-06
        • 2015-11-02
        • 2019-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多