我读过不同的意见,所以我想要专家的意见。我的问题很基本: 如果我创建一个 React 应用程序(仅客户端),从我计划读取 s3 对象的地方,以下是安全的方法还是我的凭据会以某种方式暴露?我的 env 变量只会存储在 Netlify 中。
我问这个问题是因为我有类似的设置,并且我的 AWS 受到了损害(但我不确定这种方法是否就是原因)。
aws-exports.js
import { config } from 'aws-sdk'
const AWSConfig = {
accessKeyId: process.env.REACT_APP_AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.REACT_APP_AWS_SECRET_ACCESS_KEY,
region: process.env.REACT_APP_AWS_REGION,
}
config.update(AWSConfig)
s3.js
import { S3 } from 'aws-sdk'
class S3Singleton {
static instance = undefined
static async getInstance() {
if (S3Singleton.instance) {
return S3Singleton.instance
}
S3Singleton.instance = await S3Singleton.createInstance()
return S3Singleton.instance
}
static createInstance = async () => {
return new S3({
apiVersion: process.env.REACT_APP_AWS_API_VERSION,
region: process.env.REACT_APP_AWS_REGION,
params: { Bucket: process.env.REACT_APP_AWS_BUCKET },
})
}
}
export default S3Singleton
s3对象读取
import S3Singleton from './s3'
export const getXFile = async () => {
try {
const s3 = await S3Singleton.getInstance()
return await new Promise((resolve, reject) => {
s3.getObject(
{
Bucket: process.env.REACT_APP_BUCKET,
Key: "xfile.json",
},
(err, data) => {
if (err) reject(err)
if (data) resolve(JSON.parse(data.Body.toString()))
},
)
})
} catch (e) {
console.log(e)
}
}
如果您有一个使用任何类型的凭据连接到 API 的客户端应用程序,则这些凭据是客户端应用程序的一部分,应被视为“泄露”。有多种方法可以通过不同程度的努力从客户那里提取这些凭据。
我将“泄露”放在引号中,因为这取决于您使用这些凭据获得的权限。如果可以将您的凭据限制为仅允许用户执行的用例,那么用户是否可以提取它们并不重要。如果他可以将他的权限升级到比他应该能够做的更多,那么它就不安全,你需要添加另一层。
它不取决于您如何处理这些凭据,因为客户端仍然必须能够读取和使用这些凭据,因此该客户端的任何用户都能够执行相同的操作。 (只是付出或多或少的努力;-))