Skip to content

Commit e01e65c

Browse files
committed
refinements
1 parent a2c713a commit e01e65c

File tree

2 files changed

+56
-93
lines changed

2 files changed

+56
-93
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""Advanced feature flags utility"""
22

3-
from .aws_auth import AuthProvider, AWSServicePrefix, AWSSigV4Auth, JWTAuth
3+
from .aws_auth import ServicePrefix, SigV4aAuth, SigV4Auth
44

5-
__all__ = ["AuthProvider", "AWSServicePrefix", "AWSSigV4Auth", "JWTAuth"]
5+
__all__ = ["ServicePrefix", "SigV4Auth", "SigV4aAuth"]
Lines changed: 54 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
from __future__ import annotations
22

3+
import json
4+
import os
35
from enum import Enum
46
from typing import Optional
57

68
import botocore.session
79
from botocore import crt
8-
from botocore.auth import SigV4Auth
910
from botocore.awsrequest import AWSRequest
10-
from botocore.credentials import Credentials, ReadOnlyCredentials
1111

1212

13-
class AWSServicePrefix(Enum):
13+
class ServicePrefix(Enum):
1414
"""
1515
AWS Service Prefixes - Enumerations of the supported service proxy types
16-
1716
URLs:
1817
https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html
1918
"""
@@ -24,155 +23,119 @@ class AWSServicePrefix(Enum):
2423
APPSYNC = "appsync"
2524

2625

27-
class AWSSigV4Auth:
26+
class SigV4Auth:
2827
"""
2928
Authenticating Requests (AWS Signature Version 4)
3029
Requests that were signed with SigV4 will have SignatureVersion set to AWS4-HMAC-SHA256
3130
3231
Args:
3332
url (str): URL
34-
region (str): AWS region
35-
body (str, optional): Request body
33+
service (ServicePrefix): AWS service Prefix
34+
region (str, Optional): AWS region
35+
body (dict, optional): Request body
3636
params (dict, optional): Request parameters
3737
headers (dict, optional): Request headers
3838
method (str, optional): Request method
39-
service (str, optional): AWS service
40-
access_key (str, optional): AWS access key
41-
secret_key (str, optional): AWS secret key
42-
token (str, optional): AWS session token
4339
4440
Returns:
4541
SigV4Auth: SigV4Auth instance
4642
4743
Examples
4844
--------
4945
**Using default credentials**
50-
>>> from aws_lambda_powertools.utilities.iam import AWSSigV4Auth
51-
>>> auth = AWSSigV4Auth(region="us-east-2", service=AWSServicePrefix.LATTICE, url="https://test-fake-service.vpc-lattice-svcs.us-east-2.on.aws")
46+
>>> from aws_lambda_powertools.utilities.auth import SigV4Auth
47+
>>> prepped = SigV4Auth.prepare_request(region="us-east-2", service=ServicePrefix.LATTICE, url="https://test-fake-service.vpc-lattice-svcs.us-east-2.on.aws")
5248
"""
5349

54-
def __init__(
55-
self,
50+
@staticmethod
51+
def prepare_request(
5652
url: str,
57-
region: str,
58-
body: Optional[str] = None,
53+
service: ServicePrefix,
54+
region: Optional[str],
55+
body: Optional[dict] = None,
5956
params: Optional[dict] = None,
6057
headers: Optional[dict] = None,
6158
method: Optional[str] = "GET",
62-
service: Enum = AWSServicePrefix.LATTICE,
63-
access_key: Optional[str] = None,
64-
secret_key: Optional[str] = None,
65-
token: Optional[str] = None,
6659
):
67-
self.service = service.value
68-
self.region = region
69-
self.method = method
70-
self.url = url
71-
self.data = body
72-
self.params = params
73-
self.headers = headers
74-
75-
self.credentials: Credentials | ReadOnlyCredentials
76-
77-
if access_key and secret_key and token:
78-
self.access_key = access_key
79-
self.secret_key = secret_key
80-
self.token = token
81-
self.credentials = Credentials(access_key=self.access_key, secret_key=self.secret_key, token=self.token)
60+
if region is None:
61+
region = os.environ.get("AWS_REGION")
62+
63+
if body is not None:
64+
body = json.dumps(body)
8265
else:
83-
credentials = botocore.session.Session().get_credentials()
84-
self.credentials = credentials.get_frozen_credentials()
66+
body = json.dumps({})
8567

86-
if self.headers is None:
87-
self.headers = {"Content-Type": "application/json"}
68+
credentials = botocore.session.Session().get_credentials()
8869

89-
sigv4 = SigV4Auth(credentials=self.credentials, service_name=self.service, region_name=self.region)
70+
signer = crt.auth.CrtSigV4Auth(credentials, service.value, region)
9071

91-
request = AWSRequest(method=self.method, url=self.url, data=self.data, params=self.params, headers=self.headers)
72+
if headers is None:
73+
headers = {"Content-Type": "application/json"}
9274

93-
if self.service == AWSServicePrefix.LATTICE.value:
75+
request = AWSRequest(method=method, url=url, data=body, params=params, headers=headers)
76+
77+
if service.value == "vpc-lattice-svcs":
9478
# payload signing is not supported for vpc-lattice-svcs
9579
request.context["payload_signing_enabled"] = False
9680

97-
sigv4.add_auth(request)
98-
self.signed_request = request.prepare()
99-
100-
def __call__(self):
101-
return self.signed_request
81+
signer.add_auth(request)
82+
return request.prepare()
10283

10384

104-
class AWSSigV4aAuth:
85+
class SigV4aAuth:
10586
"""
10687
Authenticating Requests (AWS Signature Version 4a)
10788
Requests that were signed with SigV4A will have a SignatureVersion set to AWS4-ECDSA-P256-SHA256
10889
10990
Args:
11091
url (str): URL
111-
region (str): AWS region
112-
body (str, optional): Request body
92+
service (ServicePrefix): AWS service Prefix
93+
region (str, Optional): AWS region
94+
body (dict, optional): Request body
11395
params (dict, optional): Request parameters
11496
headers (dict, optional): Request headers
11597
method (str, optional): Request method
116-
service (str, optional): AWS service
117-
access_key (str, optional): AWS access key
118-
secret_key (str, optional): AWS secret key
119-
token (str, optional): AWS session token
12098
12199
Returns:
122100
SigV4aAuth: SigV4aAuth instance
123101
124102
Examples
125103
--------
126104
**Using default credentials**
127-
>>> from aws_lambda_powertools.utilities.iam import AWSSigV4aAuth
128-
>>> auth = AWSSigV4aAuth(region="us-east-2", service=AWSServicePrefix.LATTICE, url="https://test-fake-service.vpc-lattice-svcs.us-east-2.on.aws")
105+
>>> from aws_lambda_powertools.utilities.iam import SigV4aAuth
106+
>>> prepped = SigV4aAuth.prepare_request(region="us-east-2", service=ServicePrefix.LATTICE, url="https://test-fake-service.vpc-lattice-svcs.us-east-2.on.aws")
129107
"""
130108

131-
def __init__(
132-
self,
109+
@staticmethod
110+
def prepare_request(
133111
url: str,
134-
region: str,
135-
body: Optional[str] = None,
112+
service: ServicePrefix,
113+
region: Optional[str],
114+
body: Optional[dict] = None,
136115
params: Optional[dict] = None,
137116
headers: Optional[dict] = None,
138117
method: Optional[str] = "GET",
139-
service: Enum = AWSServicePrefix.LATTICE,
140-
access_key: Optional[str] = None,
141-
secret_key: Optional[str] = None,
142-
token: Optional[str] = None,
143118
):
144-
self.service = service.value
145-
self.region = region
146-
self.method = method
147-
self.url = url
148-
self.data = body
149-
self.params = params
150-
self.headers = headers
151-
152-
self.credentials: Credentials | ReadOnlyCredentials
153-
154-
if access_key and secret_key and token:
155-
self.access_key = access_key
156-
self.secret_key = secret_key
157-
self.token = token
158-
self.credentials = Credentials(access_key=self.access_key, secret_key=self.secret_key, token=self.token)
119+
if region is None:
120+
region = os.environ.get("AWS_REGION")
121+
122+
if body is not None:
123+
body = json.dumps(body)
159124
else:
160-
credentials = botocore.session.Session().get_credentials()
161-
self.credentials = credentials.get_frozen_credentials()
125+
body = json.dumps({})
162126

163-
if self.headers is None:
164-
self.headers = {"Content-Type": "application/json"}
127+
credentials = botocore.session.Session().get_credentials()
165128

166-
signer = crt.auth.CrtSigV4AsymAuth(self.credentials, self.service, self.region)
129+
signer = crt.auth.CrtSigV4AsymAuth(credentials, service.value, region)
167130

168-
request = AWSRequest(method=self.method, url=self.url, data=self.data, params=self.params, headers=self.headers)
131+
if headers is None:
132+
headers = {"Content-Type": "application/json"}
169133

170-
if self.service == AWSServicePrefix.LATTICE.value:
134+
request = AWSRequest(method=method, url=url, data=body, params=params, headers=headers)
135+
136+
if service.value == "vpc-lattice-svcs":
171137
# payload signing is not supported for vpc-lattice-svcs
172138
request.context["payload_signing_enabled"] = False
173139

174140
signer.add_auth(request)
175-
self.signed_request = request.prepare()
176-
177-
def __call__(self):
178-
return self.signed_request
141+
return request.prepare()

0 commit comments

Comments
 (0)