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

如何在Rails控制台从需Bearer Token/JWT的URL下载文件并传请求头?

在Rails控制台通过Bearer Token下载受保护文件的方法

你遇到的问题核心是没有在请求中携带JWT令牌的Authorization头,服务器因此拒绝了你的访问请求。下面提供两种可靠的解决方案,适用于Rails控制台环境:

方法一:使用URI.open(推荐,简洁)

Ruby 2.5+ 推荐使用URI.open替代旧的open方法,它支持直接传入请求头参数:

require 'uri'
require 'open-uri'

# 替换成你的实际JWT令牌
jwt_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

# 远程文件URL和本地保存路径
remote_url = 'http://example.com/image.png'
local_path = 'image.png'

URI.open(remote_url, 'Authorization' => "Bearer #{jwt_token}") do |remote_file|
  File.open(local_path, 'wb') do |local_file|
    local_file.write(remote_file.read)
  end
end

说明:

  • URI.open的第二个参数可以传入任意HTTP请求头的键值对,这里我们添加了Authorization: Bearer {token}头,符合JWT认证的要求。
  • 这种写法保持了原代码的简洁性,同时解决了权限验证问题。

方法二:使用Net::HTTP(更灵活,便于错误处理)

如果你需要更精细的控制(比如捕获HTTP错误、处理重定向等),可以用Ruby内置的Net::HTTP库:

require 'net/http'
require 'uri'

uri = URI('http://example.com/image.png')
jwt_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
  request = Net::HTTP::Get.new(uri)
  request['Authorization'] = "Bearer #{jwt_token}"

  response = http.request(request)

  if response.is_a?(Net::HTTPSuccess)
    File.open('image.png', 'wb') { |file| file.write(response.body) }
    puts "文件下载成功!"
  else
    puts "下载失败:状态码 #{response.code},响应内容:#{response.body}"
  end
end

说明:

  • 这个方法可以明确处理不同的HTTP响应状态(比如401未授权、404文件不存在等),方便调试问题。
  • use_ssl: uri.scheme == 'https'确保了HTTPS链接的安全性,替换URL时不用手动修改这个参数。

原代码失败的原因

你原来的代码没有传递任何认证头,服务器收到请求后无法验证你的身份,因此返回了权限拒绝的响应(通常是401状态码),导致open方法无法读取远程文件内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:30:03