从 React Amplify APP 访问 AWS Secret
Posted
技术标签:
【中文标题】从 React Amplify APP 访问 AWS Secret【英文标题】:Access AWS Secrets from React Amplify APP 【发布时间】:2021-08-24 05:35:08 【问题描述】:这可能是一个愚蠢的问题,但是以这种方式从我的 React 前端应用程序(托管在 AWS Amplify 上)访问 AWS 机密是否安全?
这些秘密显然不打算公开,所以我不想使用放大环境变量选项。
如果这不是将 API 机密和密钥加载到前端应用程序的适当方式,那么什么是?
var AWS = require('aws-sdk'),
region = "us-east-2",
secretName = "MNTSWP",
secret,
decodedBinarySecret;
// Create a Secrets Manager client
var client = new AWS.SecretsManager(
region: region
);
client.getSecretValue(SecretId: secretName, function(err, data)
if (err)
if (err.code === 'DecryptionFailureException')
throw err;
else if (err.code === 'InternalServiceErrorException')
throw err;
else if (err.code === 'InvalidParameterException')
throw err;
else if (err.code === 'InvalidRequestException')
throw err;
else if (err.code === 'ResourceNotFoundException')
throw err;
else
if ('SecretString' in data)
secret = data.SecretString;
else
let buff = new Buffer(data.SecretBinary, 'base64');
decodedBinarySecret = buff.toString('ascii');
// Your code goes here.
);
【问题讨论】:
【参考方案1】:那您可能需要先将您的凭据信息保存到 Secret Manager 中,然后按如下方式获取:
var AWS = require('aws-sdk'),
region = "ap-southeast-1",
secretName = `my-secret`, rds_username, rds_password;
var awsSecretClient = new AWS.SecretsManager(
region: region
);
let result = await awsSecretClient.getSecretValue( SecretId: secretName ).promise();
rds_username = Buffer.from(JSON.parse(result.SecretString).rds_username, 'base64').toString();
rds_password = Buffer.from(JSON.parse(result.SecretString).rds_password, 'base64').toString();
【讨论】:
【参考方案2】:由于您的前端在 Web 浏览器中运行,因此中等技术用户可以轻松检查代码,因此您无法将凭证(例如您的 AWS 凭证)安全地保存在那里。如果您这样做,不仅会暴露您的秘密,还会暴露您的 AWS 凭证,攻击者可能会对这些凭证造成很大破坏(并且有工具可以扫描 AWS 密钥)。
老实说,在前端应用程序中并没有真正可靠的方法来保护凭据,因此您可以:
使用安全地保存凭证的后端 API 但是您只是在解决问题吗?现在您需要验证用户是否应该有权访问后端 API? 让用户提供凭据 这是最常见的方法 -- 用户提供用户名和密码,然后您使用它来控制访问 这可能仍需要后端 API 或可以解析凭证的东西(例如 AWS API Gateway + Authorizer) 制定复杂的规则来保护后端资源,即使在某些级别的密钥暴露时也是如此(例如,请参阅 Firebase 安全规则)。【讨论】:
【参考方案3】:为了使其正常工作,您必须在有权访问该密钥的客户端上拥有一些凭据。如果它们确实是秘密的,那么您应该不这样做。您通过应用程序请求的任何内容都不再是秘密。如果您尝试提供对后端资源的安全访问,您应该使用 Cognito 之类的工具并传递 JWT。
【讨论】:
以上是关于从 React Amplify APP 访问 AWS Secret的主要内容,如果未能解决你的问题,请参考以下文章
AWS Amplify Auth Login 从 React Native 上的 React Native Webview
AWS Amplify in React,如何从订阅的侦听器呈现新数据
在 React 中使用 AWS Amplify Appsync 上传图像
aws-amplify-react 和 @aws-amplify/ui-react 有啥区别?