今天 clone 了@daqing老师的 rabel,准备学习,然后遇到了 Secret Tokens error,感谢@iBachue的帮助。然后我搜了一些 Secret Tokens 资料,发现这是安全问题(作为初学者,我不是非常明白),下面的资料希望对你有帮助:
每一个 Rails app 都会获取一个很长,而且是随机生成的 secret token,当使用 rails new 的时候,它会被生成并保存在 config/initializers/secret_token.rb。里面的内容类似这样: view sourceprint? 1 WebStore::Application.config.secret_token = '4f06a7a…72489780f'
因为 rails 自动创建 secret token,所以很多开发者会忽略掉它。但是这个 secret token 就像是你的应用的管理员钥匙。如果你拥有了 secret token,那样伪造会话和提升权限就会变得很容易。这是其中一个十分重要而且敏感的数据需要去保护的。加密是保护你的钥匙的最佳办法。
但是很不幸,rails 并不能很好的处理这些 secret token。secret_token.rb 文件会被加入到版本控制当中,复制到 GitHub,CI 服务器和每一个开发人员的电脑。
最佳实践:在不同的环境中使用不同 secret token。在应用中插入 ENV 变量就可以实现这个目的。另外一个替代方法是,在部署过程中把 secret token 作为符号链接。
修复:至少,rails 必须通过.gitignore 来忽略 config/initializers /secret_token.rb 文件。开发人员在部署的时候,用一个符号链接来替代生产环境的 token,或者把初始化器转变为使用 ENV 变量来初始化(例如 Heroku)
我将会进一步提出 rails 创建一个保存 serect token 的机制方案。我们有大量的库提供安装指引如何把 secret token 加入到初始化器中,但是这并不是一个好的实践。同时,至少还有俩个解决方案来处理这个问题:ENV 变量和初始化器的符号链接。
rails 提供一个简单的 API 给开发人员来管理 secret token,而且后台还是可插拔的(就像缓存和会话存储)。