如何使用 aws 凭据安全地签署请求?

How to securely sign requests with aws credentials?

我不完全确定这是否是我应该问的问题,所以请随时提交修改。

我正在开发一个桌面应用程序,我计划分发并使用 amazon Polly 来阅读用户输入的文本。我无法理解如何在不暴露访问密钥的情况下安全地允许用户访问我们程序下的服务。

我在前面的例子中看到,我应该创建一个使用资源的请求,在服务器中拥有访问和秘密访问密钥,并由它签署请求。然后将其发送回桌面应用程序上的用户。

如果这是正确的,有人可以解释并给我一个如何在 python 中完成此操作的简单示例吗?谢谢你。 :)

以下是我目前想要在代码客户端下载的内容:

from boto3 import  client
import boto3
import StringIO
from contextlib import closing

polly = boto3.client(
    'polly',
    region_name='us-east-1',
    aws_access_key_id='I_want_to_protect_this',
    aws_secret_access_key='I_also_want_to_protect_this'
)

response = polly.synthesize_speech(
    Text="Good Morning. My Name is Rajesh. I am Testing Polly AWS Service For Voice Application.",
    OutputFormat="mp3",
    VoiceId="Raveena")

print(response)

if "AudioStream" in response:
    with closing(response["AudioStream"]) as stream:
        data = stream.read()
        fo = open("pollytest.mp3", "w+")
        fo.write( data )
        fo.close()

为人们提供访问 AWS 服务和存储在 AWS 上的资源的正确方法是采用 client/server 方法。

您的 客户端 是桌面应用程序,但它同样可以是移动应用程序或网络应用程序。客户端基本上是 不受信任的 ,不应为访问 AWS 提供任何凭据。

服务器 是一个应用程序运行 某处(通常在 Amazon EC2 或 AWS Lambda 上)接收来自客户端的请求,应用业务逻辑(例如验证用户的身份并确定允许他们执行哪些操作)并调用 AWS 服务。

那么调用AWS有两种方式:

  • 服务器 可以对 AWS 进行所有调用(使用仅对服务器可用的凭据)并将结果传回客户端。这将客户端与 AWS 隔离开来,并允许您在服务器中插入自定义业务逻辑。 (例如,当您使用 Netflix 时,您的电视不会直接调用 AWS。)或者...
  • 服务器可以通过查阅授权应用程序用户的数据库来验证客户端的身份(例如,用户登录到客户端应用程序,客户端应用程序将登录详细信息发送到服务器) ,生成临时AWS凭证,将它们传回客户端,然后客户端可以直接调用AWS。 (例如,许多移动应用程序这样做是为了与 Amazon S3 对话。)

临时 AWS 凭据 可以由服务器通过调用 AWS Security Token Service 并指定所寻求的权限和持续时间来生成。然后,STS 将 return 一组具有所需权限的限时凭证。客户端应用程序可以使用这些凭据来调用 AWS 服务(例如,根据您的代码示例,Amazon Polly)。

这样,客户端代码中不会存储任何凭据,并且服务器控制是否允许客户端访问 AWS、可以使用哪些 API 调用以及应授予访问多长时间。