首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何手动撤销Doorkeeper token?

如何手动撤销Doorkeeper token?
EN

Stack Overflow用户
提问于 2017-09-27 01:18:52
回答 2查看 1K关注 0票数 3

假设我有一个用户,我已经从我的系统中软删除了他。我也想撤销他们的令牌。实现这一目标的最好方法是什么?它是不是就像这样简单

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

还是有更好的方法?

EN

回答 2

Stack Overflow用户

发布于 2019-03-02 04:38:34

您可以这样做,其中application_id是Doorkeeper应用程序ID,resource_owner是已删除的用户:

代码语言:javascript
复制
Doorkeeper::AccessToken.revoke_all_for(application_id, resource_owner)

由于您特别要求撤销用户的所有令牌(未提及应用程序),因此您的选择如下:

对于要撤销的每个应用程序ID,

  1. 调用一次(如果应用程序ID很少,应该没问题),或者
  2. 调用一次,但传递多个而不是一个应用程序ID的数组(此方法适用于我),或者
  3. 修改该方法以删除应用程序ID

上的作用域

适用于我的方法2的示例:

代码语言:javascript
复制
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的令牌,则+ [nil]是必需的(这取决于您使用Doorkeeper的方式)。

如果您需要对其进行自定义,则code for this method很小且易于理解。

票数 0
EN

Stack Overflow用户

发布于 2021-07-08 12:05:46

@Justin Workman的答案很棒。

在检查了revoke_all_for方法的实现之后

代码语言:javascript
复制
      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

我发现,如果您想要撤销资源所有者的所有令牌,而不管应用程序是什么,只需调用:

代码语言:javascript
复制
Doorkeeper::AccessToken.by_resource_owner(resource_owner).where(revoked_at: nil).update_all(revoked_at: Time.now.utc)

我们可以保存一个db调用,它可以计算出所有的application_ids。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46432383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档