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

如何在Webpacker React应用中读取Rails加密凭证并在构建时注入?

可以实现!但需要手动做一些配置

Rails 5.2+的加密credentials默认不会自动暴露给Webpacker,但我们可以通过两种常用方法让Webpacker在构建时读取并注入解密后的密钥:

方法一:直接在Webpack配置中调用Rails获取解密值

Webpacker的环境配置文件可以通过Node.js的子进程调用Rails命令,实时解密并获取需要的credentials值,然后注入到JS包的环境变量里。

在config/webpack/environment.js中添加以下代码:

const { environment } = require('@rails/webpacker')
const { DefinePlugin } = require('webpack')
const { execSync } = require('child_process')

// 封装一个获取Rails加密凭据的函数
const fetchRailsCredential = (keyName) => {
  try {
    // 调用rails runner执行Ruby代码,输出解密后的凭据值
    return execSync(`rails runner "puts Rails.application.credentials[:${keyName}]"`).toString().trim()
  } catch (err) {
    console.error(`获取凭据 ${keyName} 失败:`, err)
    return null
  }
}

// 将需要的凭据注入到Webpack的全局环境变量
environment.plugins.prepend('Define', new DefinePlugin({
  'process.env.PAYMENT_API_KEY': JSON.stringify(fetchRailsCredential('payment_api_key')),
  'process.env.APP_ANALYTICS_ID': JSON.stringify(fetchRailsCredential('app_analytics_id'))
}))

module.exports = environment

这样在JS代码里就能直接用process.env.PAYMENT_API_KEY访问到解密后的密钥了。

方法二:提前将凭据导出到.env文件

如果你觉得每次构建都调用Rails有点慢,可以写一个Rake任务,把需要的凭据导出到Webpacker能识别的.env文件里,让Webpacker自动加载。

  1. 先创建一个Rake任务文件lib/tasks/webpack_credentials.rake:
namespace :webpacker do
  desc "导出Rails加密凭据到.env文件供Webpacker使用"
  task export_credentials: :environment do
    # 根据当前环境生成对应的.env文件
    env_file_path = Rails.root.join(".env.#{Rails.env}")
    
    File.open(env_file_path, 'w') do |file|
      # 写入需要的凭据键值对
      file.puts "PAYMENT_API_KEY=#{Rails.application.credentials[:payment_api_key]}"
      file.puts "APP_ANALYTICS_ID=#{Rails.application.credentials[:app_analytics_id]}"
    end

    puts "✅ 已将凭据导出到 #{env_file_path}"
  end
end
  1. 修改package.json里的构建脚本,让Webpack构建前先执行这个Rake任务:
"scripts": {
  "build": "rails webpacker:export_credentials && webpack",
  "start": "rails webpacker:export_credentials && webpack-dev-server"
}
  1. 别忘了把生成的.env文件添加到.gitignore里,避免敏感信息提交到版本库:
# .gitignore
.env.development
.env.production
.env.test

注意事项

  • 只导出JS代码真正需要的密钥,不要把所有凭据都暴露出去,降低安全风险。
  • 生产环境中要确保Rails能访问到RAILS_MASTER_KEY(可以通过环境变量设置),否则无法解密credentials。
  • 方法一每次构建都会调用Rails,开发环境下影响不大,生产环境如果追求构建速度可以选方法二。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:32:52