You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Doorkeeper使用refresh_token授权类型时如何避免生成新refresh_token

Doorkeeper使用refresh_token授权时禁用生成新refresh_token的方案

Doorkeeper的use_refresh_token全局配置默认对refresh_token授权类型不生效,该授权流默认自带refresh token轮转逻辑,所以单独配置use_refresh_token(false)无法达到预期效果,可通过以下两种方案实现需求:

  • 方案一:使用use_refresh_token支持的lambda参数(适用于Doorkeeper 5.5及以上版本)
    在config/initializers/doorkeeper.rb初始化配置中调整use_refresh_token配置项,传入判断逻辑即可:
Doorkeeper.configure do
  # 其他原有配置保持不变
  use_refresh_token lambda do |context|
    # 授权类型为refresh_token时不生成新的refresh token
    context.grant_type != 'refresh_token'
  end
end

注意:如果需要更细粒度的控制,比如仅在请求scope小于原token scope时才不生成新refresh token,可以修改判断逻辑:

use_refresh_token lambda do |context|
  return true if context.grant_type != 'refresh_token'
  # 对比请求scope和原refresh token的scope,一致时才生成新refresh token
  context.scopes == context.refresh_token.scopes
end
  • 方案二:重写RefreshToken授权策略(兼容所有Doorkeeper版本)
    如果使用的Doorkeeper版本不支持use_refresh_token传lambda参数,可以通过补丁的方式重写refresh_token授权逻辑:
    新建config/initializers/doorkeeper_refresh_token_patch.rb文件,写入以下代码:
module Doorkeeper
  module Grant
    class RefreshToken < Base
      # 禁用refresh_token授权流生成新refresh token
      def issue_refresh_token?
        # 可根据需求自定义判断条件,比如仅当scope缩小时不生成
        # scopes == refresh_token.scopes
        false
      end
    end
  end
end

配置完成后重启服务即可生效,此时发送refresh_token类型的授权请求,响应中将仅返回access_token、expires_in等JWT相关字段,不会携带新的refresh_token,原有高权限的refresh_token也不会被作废,可以正常继续使用。

内容的提问来源于stack exchange,提问作者Paul Rodgers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:09:03