1- import AWSLambdaEvents
21import AWSLambdaRuntime
32import Foundation
43
4+ // MARK: - Custom Request/Response types for HTTP API v2 Authorizer
5+
6+ struct AuthorizerRequest : Codable {
7+ let version : String ?
8+ let type : String ?
9+ let routeArn : String ?
10+ let routeKey : String ?
11+ let rawPath : String ?
12+ let rawQueryString : String ?
13+ let headers : [ String : String ] ?
14+ let requestContext : RequestContext ?
15+
16+ struct RequestContext : Codable {
17+ let http : HTTPContext ?
18+
19+ struct HTTPContext : Codable {
20+ let method : String ?
21+ let path : String ?
22+ }
23+ }
24+ }
25+
26+ struct AuthorizerSimpleResponse : Codable {
27+ let isAuthorized : Bool
28+ }
29+
530// MARK: - Helper Functions
631
732/// Gets a header value from the request headers (case-insensitive)
@@ -19,64 +44,35 @@ func getHeaderValue(_ headers: [String: String]?, key: String) -> String? {
1944 return nil
2045}
2146
22- /// Generates an IAM policy response for API Gateway
23- func generatePolicy(
24- principalId: String ,
25- effect: APIGatewayLambdaAuthorizerPolicyResponse . PolicyDocument . Statement . Effect ,
26- resource: String
27- ) -> APIGatewayLambdaAuthorizerPolicyResponse {
28- return APIGatewayLambdaAuthorizerPolicyResponse (
29- principalId: principalId,
30- policyDocument: . init( statement: [
31- . init(
32- action: " execute-api:Invoke " ,
33- effect: effect,
34- resource: resource
35- )
36- ] ) ,
37- context: nil
38- )
39- }
40-
4147// MARK: - Lambda Runtime
4248
43- let authorizerHandler :
44- ( APIGatewayLambdaAuthorizerRequest , LambdaContext ) async throws ->
45- APIGatewayLambdaAuthorizerPolicyResponse = {
46- ( request: APIGatewayLambdaAuthorizerRequest , context: LambdaContext ) in
47-
48- let consumer = getHeaderValue ( request. headers, key: " x-consumer " )
49- let validConsumers = [ " lhowsam-dev " , " lhowsam-prod " , " lhowsam-local " ]
50-
51- let apiKey = getHeaderValue ( request. headers, key: " x-api-key " )
52- let validKey = ProcessInfo . processInfo. environment [ " API_KEY " ]
53-
54- let resource = request. routeArn ?? " * "
55-
56- if apiKey != validKey {
57- context. logger. info ( " Deny " )
58- return generatePolicy (
59- principalId: " user " ,
60- effect: . deny,
61- resource: resource
62- )
63- }
64-
65- if let consumer = consumer, !validConsumers. contains ( consumer) {
66- context. logger. info ( " Deny " )
67- return generatePolicy (
68- principalId: " user " ,
69- effect: . deny,
70- resource: resource
71- )
72- }
73-
74- return generatePolicy (
75- principalId: " user " ,
76- effect: . allow,
77- resource: resource
78- )
79- }
49+ let runtime = LambdaRuntime {
50+ ( event: AuthorizerRequest , context: LambdaContext ) -> AuthorizerSimpleResponse in
51+
52+ context. logger. info ( " Authorizer invoked " )
53+ context. logger. info ( " Headers: \( String ( describing: event. headers) ) " )
54+ context. logger. info ( " RouteArn: \( String ( describing: event. routeArn) ) " )
55+
56+ let consumer = getHeaderValue ( event. headers, key: " x-consumer " )
57+ let validConsumers = [ " lhowsam-dev " , " lhowsam-prod " , " lhowsam-local " ]
58+
59+ let apiKey = getHeaderValue ( event. headers, key: " x-api-key " )
60+ let validKey = ProcessInfo . processInfo. environment [ " API_KEY " ]
61+
62+ context. logger. info ( " API Key from header: ' \( apiKey ?? " nil " ) ' " )
63+
64+ if apiKey != validKey {
65+ context. logger. info ( " Deny - API key mismatch " )
66+ return AuthorizerSimpleResponse ( isAuthorized: false )
67+ }
68+
69+ if let consumer = consumer, !validConsumers. contains ( consumer) {
70+ context. logger. info ( " Deny - Invalid consumer: \( consumer) " )
71+ return AuthorizerSimpleResponse ( isAuthorized: false )
72+ }
73+
74+ context. logger. info ( " Allow - Authorization successful " )
75+ return AuthorizerSimpleResponse ( isAuthorized: true )
76+ }
8077
81- let runtime = LambdaRuntime ( body: authorizerHandler)
8278try await runtime. run ( )
0 commit comments