【发布时间】:2019-02-01 14:04:18
【问题描述】:
我正在使用 Python(3.6) 和 Django(1.10) 开展一个项目,其中我使用的是 aws api,但我是 aws 新手,不知道如何验证用户身份。
我的情况是: 我需要访问用户的 aws 资源,例如 projects list、buckets list 等,为此,我需要在发出请求时验证用户特定的 API。
如何在 python 中做到这一点? 我是 aws 的新手。所以,请不要介意我的问题。
更新:
这是我尝试过的: 来自views.py:
def boto3_with_role(role_arn, session_prefix, external_id, **kwargs):
"""
Create a partially applied session to assume a role with an external id.
A unique session_name will be generated by {session_prefix}_{time}
`session` can be passed, otherwise the default sesion will be used
see: http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-api.html
"""
sts = boto3.client('sts')
res = sts.assume_role(
RoleArn=role_arn,
RoleSessionName='{}_{}'.format(session_prefix, int(time.time())),
ExternalId=external_id,
)
creds = res['Credentials']
return partial(boto3.session.Session,
aws_access_key_id=creds['AccessKeyId'],
aws_secret_access_key=creds['SecretAccessKey'],
aws_session_token=creds['SessionToken']
)
class AwsAuthentication(LoginRequiredMixin, CreateView):
def post(self, request, *args, **kwargs):
AwsSession = boto3_with_role('ARN_LINK_FROM_CUSTOMER', 'MyPrefix',
'EXTERNAL_ID_FROM_CUSTOMER')
my_session = AwsSession()
client = my_session.resource('s3')
for bucket in client.buckets.all():
print(bucket.name)
return HttpResponse('Your Bucket is: {}'.format(bucket.name))
现在,它返回:botocore.exceptions.ClientError: An error occurred (InvalidClientTokenId) when调用 AssumeRole 操作:请求中包含的安全令牌无效。
请帮帮我!
提前致谢!
【问题讨论】:
-
您可以使用 boto3 或 awscli 来访问这些 aws 资源。但我不明白您所说的用户是您的应用程序用户还是试图访问另一个用户的资源的第三方用户是这样吗?
-
用户将自己从我的应用程序验证到 aws,然后我的应用程序将能够访问他的资源!
-
是的,您可以,但您必须拥有该用户的 aws 凭据。
-
使用 boto3 python 库,“官方”aws 库。您可以在 settings.py 中存储一些环境变量,然后您应该对您发出的任何请求进行身份验证。
-
我要构建的流程如下:我的应用中有一个按钮,上面写着 Authorize with aws 当用户单击此按钮时,他应该被重定向到另一个他需要登录到他的 aws 帐户的浏览器选项卡。
标签: python django amazon-web-services boto aws-api-gateway