使用Python对aws进行用户身份验证

使用Python对aws进行用户身份验证,python,django,amazon-web-services,boto,aws-api-gateway,Python,Django,Amazon Web Services,Boto,Aws Api Gateway,我正在使用Python(3.6)和Django(1.10)进行一个项目,在这个项目中,我使用的是aws API,但我是aws新手,不知道如何对用户进行身份验证 我的场景是: 我需要访问用户的aws资源,如项目列表,桶列表等,为此,我需要在向特定API发出请求时对用户进行身份验证 在python中如何实现这一点? 我是aws的新手。所以,请不要介意我的问题 更新: 以下是我尝试过的: 来自视图。py: def boto3_with_role(role_arn, session_prefix, ex

我正在使用Python(3.6)和Django(1.10)进行一个项目,在这个项目中,我使用的是aws API,但我是aws新手,不知道如何对用户进行身份验证

我的场景是: 我需要访问用户的aws资源,如项目列表桶列表等,为此,我需要在向特定API发出请求时对用户进行身份验证

在python中如何实现这一点? 我是aws的新手。所以,请不要介意我的问题

更新:

以下是我尝试过的: 来自视图。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:调用AssumeRole操作时发生错误(InvalidClientTokenId):请求中包含的安全令牌无效。

请帮帮我


提前谢谢

让用户登录其AWS帐户以允许应用程序访问其AWS资源的功能目前不存在。要考虑的一个可能的工作是为用户提供一个直接链接来创建一个IAM角色,其中一个特定的管理策略允许一个特定的AWS帐户。然后,您可以将其包含在注册流中,并在需要访问用户帐户中的资源时担任该角色

示例链接:


让用户登录其AWS帐户以允许应用程序访问其AWS资源的功能目前不存在。要考虑的一个可能的工作是为用户提供一个直接链接来创建一个IAM角色,其中一个特定的管理策略允许一个特定的AWS帐户。然后,您可以将其包含在注册流中,并在需要访问用户帐户中的资源时担任该角色

示例链接:


我不知道为什么有些人建议你不能这样做。这是完全正常且得到良好支持的-许多AWS帐户用户允许第三方代表用户在用户的AWS帐户中操作。例如,任何第三方监控服务或成本分析服务

[坏方法]第一种方法是简单地向用户请求IAM凭据(访问密钥和密钥)。您的应用程序可以使用这些访问用户的AWS帐户。这很简单,但不要这样做


[好方法]更好的方法是通过跨帐户访问。您有一个AWS帐户,您的用户有一个AWS帐户。您指示用户使用适当的IAM策略(应用程序所需的最低权限集)在其帐户中创建IAM角色,并指示用户如何允许您的帐户在用户的帐户中担任此角色-为此,您需要宣传所需的IAM策略和AWS帐号。然后,用户可以创建IAM策略,使用该策略创建角色,然后在您的帐户之间建立信任关系,以便您可以假定IAM角色并在其帐户中操作。有关更多信息,请参阅和。

我不确定为什么其他人建议您不能这样做。这是完全正常且得到良好支持的-许多AWS帐户用户允许第三方代表用户在用户的AWS帐户中操作。例如,任何第三方监控服务或成本分析服务

[坏方法]第一种方法是简单地向用户请求IAM凭据(访问密钥和密钥)。您的应用程序可以使用这些访问用户的AWS帐户。这很简单,但不要这样做


[好方法]更好的方法是通过跨帐户访问。您有一个AWS帐户,您的用户有一个AWS帐户。您指示用户使用适当的IAM策略(应用程序所需的最低权限集)在其帐户中创建IAM角色,并指示用户如何允许您的帐户在用户的帐户中担任此角色-为此,您需要宣传所需的IAM策略和AWS帐号。然后,用户可以创建IAM策略,使用该策略创建角色,然后在您的帐户之间建立信任关系,以便您可以假定IAM角色并在其帐户中操作。有关更多信息,请参阅和。

注意,从sts.AssumeRole调用获得的凭据在一段时间后确实会过期(默认情况下为15分钟,但在执行AssumeRole调用时,您可以将其设置得更长,默认情况下,直到当前会话的最大API会话持续时间为1小时),除非您刷新它们

如果您需要自动刷新凭据,我将在这里分享我在研究boto的代码并尝试解决boto对文件系统和配置文件的依赖性几个小时后编写的代码

在这里,我只是使用了内置的boto机制来缓存和定期刷新假定的凭据,而不涉及任何文件:

从日期时间导入日期时间
进口boto3
从botocore.credentials导入(
假设提供者,
助理蚀刻师,
延迟刷新凭据,
证书解析器
)
从dateutil.tz导入tzlocal
类别CustomAssumeRoleProvider(AssumeRoleProvider):
"""
覆盖默认的AssumeRoleProvider以不使用文件系统中的配置文件。
"""
定义初始化(自我,
来源(u session):bot3.session,,
扮演角色:str,
到期时间(窗口时间(秒):int):
超级()。\uuu初始化__(
load\u config=lambda:source\u session.\u session.full\u config,
client\u creator=source\u session.\u session.create\u client,
缓存={},
配置文件\u name='not-used'
)
self.expiry\u window\u seconds=过期\u window\u seconds
self.source\u session=source\u session
self.aspect\u role\u arn=aspect\u role\u arn
断言假定角色“假定需要假定角色”
def加载(自):
取数器=假定取数器(
client\u creator=self.source\u session.\u session.create\u client,
source\u credentials=self.source\u session.get\u credentials(),
role\u arn=self.Association\u role\u arn,