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

使用Refresh Grant请求Access Token时遭遇504 Gateway Timeout错误

排查与解决思路

首先,504 Gateway Timeout 说明你的请求已经到达对方服务器,但服务器在规定时间内没能返回响应。结合你用Rails oauth2 gem的场景,咱们一步步来梳理排查方向:

1. 简化请求参数,避免冗余传递

看你的代码里,调用client.get_token时重复传了client_id和client_secret,但其实初始化OAuth2::Client时已经传入这两个参数,gem会自动把它们加到请求里(通常是通过Authorization头或表单参数)。重复传递可能引发参数冲突,建议先去掉这两个冗余参数试试:

client = OAuth2::Client.new(CLIENT_ID, CLIENT_SECRET, { :site => DOMAIN, :token_url => PATH_TOKEN })
token = client.get_token({
  :grant_type => 'refresh_token', 
  :refresh_token => token_by
})

2. 确认token_url配置的正确性

部分OAuth服务商要求token_url是完整URL(比如https://example.com/oauth/token)而非相对路径。如果你的PATH_TOKEN是相对路径,试试换成完整URL再测试。另外要确认这个端点确实是用于通过刷新令牌获取访问令牌的(有些服务商可能会区分授权码、刷新令牌的请求端点)。

3. 调整请求超时时间

oauth2 gem默认的超时时间可能偏短,如果对方服务器处理刷新令牌转访问令牌的逻辑比较耗时,就会触发超时。你可以在初始化client时手动设置超时:

client = OAuth2::Client.new(CLIENT_ID, CLIENT_SECRET, { 
  :site => DOMAIN, 
  :token_url => PATH_TOKEN,
  :connection_opts => { :timeout => 30, :open_timeout => 10 } # 单位为秒,可根据实际情况调整
})

4. 开启调试日志,深挖请求细节

开启gem的日志功能,能帮你看到实际发送的请求内容、请求头,哪怕是504错误,也能知道哪个环节出了问题。配置方式如下:

client = OAuth2::Client.new(CLIENT_ID, CLIENT_SECRET, { 
  :site => DOMAIN, 
  :token_url => PATH_TOKEN,
  :logger => Logger.new(STDOUT) # 日志打印到控制台,也可以指定写入文件
})

重点检查日志里的请求是否符合服务商的OAuth规范:比如参数拼写是否正确、Content-Type是否为application/x-www-form-urlencoded(gem默认会处理,但最好确认)。

5. 检查oauth2 gem版本兼容性

不同版本的oauth2 gem可能存在兼容性问题,比如旧版本对某些参数的处理有bug。你可以尝试升级到最新稳定版,或者回退到一个已知稳定的版本,再测试是否还会出现504错误。


内容的提问来源于stack exchange,提问作者Joshua Kirch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:48:51