本地用MinIO测试Rails ActiveStorage直传遇InvalidSSOToken认证错误
问题描述
在测试环境用MinIO替代S3存储时,执行测试命令bin/bundle exec rspec --fail-fast spec/models/hanzi_spec.rb触发Aws::Errors::InvalidSSOToken错误,错误详情如下:
An error occurred while loading ./spec/models/hanzi_spec.rb. Failure/Error: require_relative '../config/environment' Aws::Errors::InvalidSSOToken: Token is invalid and failed to refresh. # ./config/environment.rb:5:in `<top (required)>' # ./spec/rails_helper.rb:4:in `require_relative' # ./spec/rails_helper.rb:4:in `<top (required)>' # ./spec/models/hanzi_spec.rb:4:in `<top (required)>' No examples found. Finished in 0.00009 seconds (files took 5.67 seconds to load) 0 examples, 0 failures, 1 error occurred outside of examples
已确认MinIO服务正常(通过curl可成功上传文件),测试环境配置如下:
config/environments/test.rb中已设置config.active_storage.service = :testconfig/storage.yaml的test段配置:
test: # service: Disk # root: <%= Rails.root.join("tmp/storage") %> service: S3 access_key_id: minioadmin secret_access_key: minioadmin bucket: storage endpoint: http://localhost:9000 force_path_style: true
怀疑测试环境误加载了生产AWS凭证,但无法定位根源,需解决该SSO令牌错误。
解决步骤
1. 排查AWS SDK凭证加载优先级
AWS SDK会自动从多个优先级更高的位置加载凭证,会覆盖storage.yaml的配置:
- 系统环境变量(
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY等) - 本地AWS配置文件(
~/.aws/credentials、~/.aws/config) - SSO令牌缓存文件(
~/.aws/sso/cache/目录下的文件)
这是导致测试环境触发SSO令牌验证的核心原因。
2. 临时覆盖环境变量运行测试
执行测试前,直接在命令行覆盖AWS相关环境变量,强制使用MinIO凭证:
AWS_ACCESS_KEY_ID=minioadmin AWS_SECRET_ACCESS_KEY=minioadmin bin/bundle exec rspec --fail-fast spec/models/hanzi_spec.rb
3. 修改测试配置跳过默认凭证链
在config/environments/test.rb中添加配置,让Active Storage的S3客户端跳过SDK默认凭证加载逻辑:
config.active_storage.service_configurations[:test][:use_aws_sdk_default_config] = false
或者直接在config/storage.yaml的test配置中添加skip_default_credentials: true(适用于Rails 7+版本):
test: service: S3 access_key_id: minioadmin secret_access_key: minioadmin bucket: storage endpoint: http://localhost:9000 force_path_style: true skip_default_credentials: true
4. 清理本地AWS SSO缓存
如果系统中存在旧的SSO令牌缓存,直接删除缓存目录:
rm -rf ~/.aws/sso/cache/
5. 验证Active Storage服务配置
启动测试环境的Rails控制台,确认服务配置是否正确加载:
RAILS_ENV=test rails c > Rails.application.config.active_storage.service # 输出应为:test > ActiveStorage::Blob.service.config # 检查输出中的endpoint、access_key_id是否与MinIO配置一致
内容的提问来源于stack exchange,提问作者Matthias Benjamin Schönborn
相关产品推荐
相关产品推荐

