1
1
from __future__ import annotations
2
2
3
+ import json
4
+ import os
3
5
from enum import Enum
4
6
from typing import Optional
5
7
6
8
import botocore .session
7
9
from botocore import crt
8
- from botocore .auth import SigV4Auth
9
10
from botocore .awsrequest import AWSRequest
10
- from botocore .credentials import Credentials , ReadOnlyCredentials
11
11
12
12
13
- class AWSServicePrefix (Enum ):
13
+ class ServicePrefix (Enum ):
14
14
"""
15
15
AWS Service Prefixes - Enumerations of the supported service proxy types
16
-
17
16
URLs:
18
17
https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html
19
18
"""
@@ -24,155 +23,119 @@ class AWSServicePrefix(Enum):
24
23
APPSYNC = "appsync"
25
24
26
25
27
- class AWSSigV4Auth :
26
+ class SigV4Auth :
28
27
"""
29
28
Authenticating Requests (AWS Signature Version 4)
30
29
Requests that were signed with SigV4 will have SignatureVersion set to AWS4-HMAC-SHA256
31
30
32
31
Args:
33
32
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
36
36
params (dict, optional): Request parameters
37
37
headers (dict, optional): Request headers
38
38
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
43
39
44
40
Returns:
45
41
SigV4Auth: SigV4Auth instance
46
42
47
43
Examples
48
44
--------
49
45
**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")
52
48
"""
53
49
54
- def __init__ (
55
- self ,
50
+ @ staticmethod
51
+ def prepare_request (
56
52
url : str ,
57
- region : str ,
58
- body : Optional [str ] = None ,
53
+ service : ServicePrefix ,
54
+ region : Optional [str ],
55
+ body : Optional [dict ] = None ,
59
56
params : Optional [dict ] = None ,
60
57
headers : Optional [dict ] = None ,
61
58
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 ,
66
59
):
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 )
82
65
else :
83
- credentials = botocore .session .Session ().get_credentials ()
84
- self .credentials = credentials .get_frozen_credentials ()
66
+ body = json .dumps ({})
85
67
86
- if self .headers is None :
87
- self .headers = {"Content-Type" : "application/json" }
68
+ credentials = botocore .session .Session ().get_credentials ()
88
69
89
- sigv4 = SigV4Auth (credentials = self . credentials , service_name = self . service , region_name = self . region )
70
+ signer = crt . auth . CrtSigV4Auth (credentials , service . value , region )
90
71
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" }
92
74
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" :
94
78
# payload signing is not supported for vpc-lattice-svcs
95
79
request .context ["payload_signing_enabled" ] = False
96
80
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 ()
102
83
103
84
104
- class AWSSigV4aAuth :
85
+ class SigV4aAuth :
105
86
"""
106
87
Authenticating Requests (AWS Signature Version 4a)
107
88
Requests that were signed with SigV4A will have a SignatureVersion set to AWS4-ECDSA-P256-SHA256
108
89
109
90
Args:
110
91
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
113
95
params (dict, optional): Request parameters
114
96
headers (dict, optional): Request headers
115
97
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
120
98
121
99
Returns:
122
100
SigV4aAuth: SigV4aAuth instance
123
101
124
102
Examples
125
103
--------
126
104
**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")
129
107
"""
130
108
131
- def __init__ (
132
- self ,
109
+ @ staticmethod
110
+ def prepare_request (
133
111
url : str ,
134
- region : str ,
135
- body : Optional [str ] = None ,
112
+ service : ServicePrefix ,
113
+ region : Optional [str ],
114
+ body : Optional [dict ] = None ,
136
115
params : Optional [dict ] = None ,
137
116
headers : Optional [dict ] = None ,
138
117
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 ,
143
118
):
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 )
159
124
else :
160
- credentials = botocore .session .Session ().get_credentials ()
161
- self .credentials = credentials .get_frozen_credentials ()
125
+ body = json .dumps ({})
162
126
163
- if self .headers is None :
164
- self .headers = {"Content-Type" : "application/json" }
127
+ credentials = botocore .session .Session ().get_credentials ()
165
128
166
- signer = crt .auth .CrtSigV4AsymAuth (self . credentials , self . service , self . region )
129
+ signer = crt .auth .CrtSigV4AsymAuth (credentials , service . value , region )
167
130
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" }
169
133
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" :
171
137
# payload signing is not supported for vpc-lattice-svcs
172
138
request .context ["payload_signing_enabled" ] = False
173
139
174
140
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