Rails 6中如何使用Doorkeeper实现JWT格式的刷新令牌?
Rails 6 + Doorkeeper 实现JWT格式刷新令牌的落地方案
核心逻辑是通过Doorkeeper内置的生成器回调,替换默认刷新令牌的生成规则,手动输出符合要求的JWT格式令牌,无需修改doorkeeper-jwt的源码,兼容性和可维护性更高。
前置准备
确认已完成doorkeeper、doorkeeper-jwt的基础配置,JWT签名密钥、访问令牌过期策略、刷新令牌过期策略已按照生产要求配置完成,配置文件路径为config/initializers/doorkeeper.rb。
1. 重写刷新令牌生成逻辑
在Doorkeeper的配置块中新增refresh_token生成器,自定义JWT payload和签名规则,签名密钥和算法建议和访问令牌保持一致,降低维护成本:
Doorkeeper.configure do # 保留原有所有配置不变,新增以下内容 generator :refresh_token do |resource_owner, application| # 自定义JWT payload,可根据业务需求增减字段 payload = { iss: '你的后端服务标识', sub: resource_owner.id.to_s, exp: Time.current.to_i + Doorkeeper.configuration.refresh_token_expires_in, iat: Time.current.to_i, client_id: application&.uid, token_type: 'refresh_token' } # 签名密钥可根据实际配置调整,算法支持HS256/RS256等 JWT.encode( payload, Rails.application.credentials.doorkeeper_jwt_secret, 'HS256' ) end end
2. 兼容原有校验逻辑
生成的JWT格式刷新令牌会直接存储到oauth_refresh_tokens表的token字段中,Doorkeeper原生的刷新令牌校验、过期清理逻辑完全不需要修改,原有刷新接口的调用方式也保持不变,前端只需要按原有逻辑传递刷新令牌即可。
3. 生产环境安全建议
- 刷新令牌过期时间建议设置为1到7天,不要设置过长的有效期,降低令牌泄露风险
- 可在刷新令牌接口返回新的刷新令牌,实现滚动刷新机制,避免单个刷新令牌被长期使用
- 该改造和前端将令牌存储在内存的方案完全兼容,后端不需要针对前端存储逻辑做额外调整
内容的提问来源于stack exchange,提问作者sbstnssndn
相关产品推荐
相关产品推荐

