core sts endpoints completed
This commit is contained in:
parent
124bc04598
commit
212d9c7abe
11 changed files with 201 additions and 3 deletions
2
moto/sts/__init__.py
Normal file
2
moto/sts/__init__.py
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
from .models import sts_backend
|
||||
mock_sts = sts_backend.decorator
|
||||
39
moto/sts/models.py
Normal file
39
moto/sts/models.py
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
import datetime
|
||||
from moto.core import BaseBackend
|
||||
from moto.core.utils import iso_8601_datetime
|
||||
|
||||
|
||||
class Token(object):
|
||||
def __init__(self, duration):
|
||||
now = datetime.datetime.now()
|
||||
self.expiration = now + datetime.timedelta(seconds=duration)
|
||||
|
||||
@property
|
||||
def expiration_ISO8601(self):
|
||||
return iso_8601_datetime(self.expiration)
|
||||
|
||||
|
||||
class AssumedRole(object):
|
||||
def __init__(self, role_session_name, role_arn, policy, duration, external_id):
|
||||
self.session_name = role_session_name
|
||||
self.arn = role_arn
|
||||
self.policy = policy
|
||||
now = datetime.datetime.now()
|
||||
self.expiration = now + datetime.timedelta(seconds=duration)
|
||||
self.external_id = external_id
|
||||
|
||||
@property
|
||||
def expiration_ISO8601(self):
|
||||
return iso_8601_datetime(self.expiration)
|
||||
|
||||
|
||||
class STSBackend(BaseBackend):
|
||||
def get_session_token(self, duration):
|
||||
token = Token(duration=duration)
|
||||
return token
|
||||
|
||||
def assume_role(self, **kwargs):
|
||||
role = AssumedRole(**kwargs)
|
||||
return role
|
||||
|
||||
sts_backend = STSBackend()
|
||||
67
moto/sts/responses.py
Normal file
67
moto/sts/responses.py
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
from jinja2 import Template
|
||||
|
||||
from moto.core.responses import BaseResponse
|
||||
from .models import sts_backend
|
||||
|
||||
|
||||
class TokenResponse(BaseResponse):
|
||||
|
||||
def get_session_token(self):
|
||||
duration = int(self.querystring.get('DurationSeconds', [43200])[0])
|
||||
token = sts_backend.get_session_token(duration=duration)
|
||||
template = Template(GET_SESSION_TOKEN_RESPONSE)
|
||||
return template.render(token=token)
|
||||
|
||||
def assume_role(self):
|
||||
role_session_name = self.querystring.get('RoleSessionName')[0]
|
||||
role_arn = self.querystring.get('RoleArn')[0]
|
||||
|
||||
policy = self.querystring.get('Policy', [None])[0]
|
||||
duration = int(self.querystring.get('DurationSeconds', [3600])[0])
|
||||
external_id = self.querystring.get('ExternalId', [None])[0]
|
||||
|
||||
role = sts_backend.assume_role(
|
||||
role_session_name=role_session_name,
|
||||
role_arn=role_arn,
|
||||
policy=policy,
|
||||
duration=duration,
|
||||
external_id=external_id,
|
||||
)
|
||||
template = Template(ASSUME_ROLE_RESPONSE)
|
||||
return template.render(role=role)
|
||||
|
||||
|
||||
GET_SESSION_TOKEN_RESPONSE = """<GetSessionTokenResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
|
||||
<GetSessionTokenResult>
|
||||
<Credentials>
|
||||
<SessionToken>AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE</SessionToken>
|
||||
<SecretAccessKey>wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY</SecretAccessKey>
|
||||
<Expiration>{{ token.expiration_ISO8601 }}</Expiration>
|
||||
<AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId>
|
||||
</Credentials>
|
||||
</GetSessionTokenResult>
|
||||
<ResponseMetadata>
|
||||
<RequestId>58c5dbae-abef-11e0-8cfe-09039844ac7d</RequestId>
|
||||
</ResponseMetadata>
|
||||
</GetSessionTokenResponse>"""
|
||||
|
||||
|
||||
ASSUME_ROLE_RESPONSE = """<AssumeRoleResponse xmlns="https://sts.amazonaws.com/doc/
|
||||
2011-06-15/">
|
||||
<AssumeRoleResult>
|
||||
<Credentials>
|
||||
<SessionToken>BQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE</SessionToken>
|
||||
<SecretAccessKey>aJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY</SecretAccessKey>
|
||||
<Expiration>{{ role.expiration_ISO8601 }}</Expiration>
|
||||
<AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId>
|
||||
</Credentials>
|
||||
<AssumedRoleUser>
|
||||
<Arn>{{ role.arn }}</Arn>
|
||||
<AssumedRoleId>ARO123EXAMPLE123:{{ role.session_name }}</AssumedRoleId>
|
||||
</AssumedRoleUser>
|
||||
<PackedPolicySize>6</PackedPolicySize>
|
||||
</AssumeRoleResult>
|
||||
<ResponseMetadata>
|
||||
<RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
|
||||
</ResponseMetadata>
|
||||
</AssumeRoleResponse>"""
|
||||
9
moto/sts/urls.py
Normal file
9
moto/sts/urls.py
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
from .responses import TokenResponse
|
||||
|
||||
url_bases = [
|
||||
"https?://sts.amazonaws.com"
|
||||
]
|
||||
|
||||
url_paths = {
|
||||
'{0}/$': TokenResponse().dispatch,
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue