@geekmidas/auth 0.0.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +343 -214
- package/dist/{cacheTokenStorage-Ca05vf3T.mjs → cacheTokenStorage-16NE8Cd9.mjs} +3 -3
- package/dist/cacheTokenStorage-16NE8Cd9.mjs.map +1 -0
- package/dist/{cacheTokenStorage-BzBRJfd-.d.mts → cacheTokenStorage-B7sOoysu.d.cts} +8 -6
- package/dist/cacheTokenStorage-B7sOoysu.d.cts.map +1 -0
- package/dist/{cacheTokenStorage-CvptztkW.cjs → cacheTokenStorage-CEpMniTi.cjs} +3 -3
- package/dist/cacheTokenStorage-CEpMniTi.cjs.map +1 -0
- package/dist/{cacheTokenStorage-yNUpDD8W.d.cts → cacheTokenStorage-_tq4Kmhc.d.mts} +8 -6
- package/dist/cacheTokenStorage-_tq4Kmhc.d.mts.map +1 -0
- package/dist/cacheTokenStorage.cjs +1 -1
- package/dist/cacheTokenStorage.d.cts +1 -1
- package/dist/cacheTokenStorage.d.mts +1 -1
- package/dist/cacheTokenStorage.mjs +1 -1
- package/dist/{client-DaiUm0UZ.cjs → client-BPl_mMvb.cjs} +14 -8
- package/dist/client-BPl_mMvb.cjs.map +1 -0
- package/dist/{client-DjNZS6vZ.mjs → client-eidYNJSH.mjs} +14 -8
- package/dist/client-eidYNJSH.mjs.map +1 -0
- package/dist/client.cjs +2 -2
- package/dist/client.d.cts +1 -1
- package/dist/client.d.mts +1 -1
- package/dist/client.mjs +2 -2
- package/dist/hono/jwt.cjs +1 -1
- package/dist/hono/jwt.cjs.map +1 -1
- package/dist/hono/jwt.d.cts +2 -1
- package/dist/hono/jwt.d.cts.map +1 -0
- package/dist/hono/jwt.d.mts +2 -1
- package/dist/hono/jwt.d.mts.map +1 -0
- package/dist/hono/jwt.mjs +1 -1
- package/dist/hono/jwt.mjs.map +1 -1
- package/dist/hono/oidc.cjs +1 -1
- package/dist/hono/oidc.cjs.map +1 -1
- package/dist/hono/oidc.d.cts +3 -2
- package/dist/hono/oidc.d.cts.map +1 -0
- package/dist/hono/oidc.d.mts +3 -2
- package/dist/hono/oidc.d.mts.map +1 -0
- package/dist/hono/oidc.mjs +1 -1
- package/dist/hono/oidc.mjs.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +3 -3
- package/dist/{jwt-DF9kFbmh.d.cts → jwt-3eIuY2dg.d.cts} +2 -1
- package/dist/jwt-3eIuY2dg.d.cts.map +1 -0
- package/dist/jwt-Bo_eACEi.cjs.map +1 -1
- package/dist/{jwt-DH8CJ2xC.d.mts → jwt-BqLlRkw-.d.mts} +2 -1
- package/dist/jwt-BqLlRkw-.d.mts.map +1 -0
- package/dist/jwt-D88cPJyT.mjs.map +1 -1
- package/dist/jwt.d.cts +1 -1
- package/dist/jwt.d.mts +1 -1
- package/dist/lambda/jwt.cjs +2 -2
- package/dist/lambda/jwt.cjs.map +1 -1
- package/dist/lambda/jwt.d.cts +2 -1
- package/dist/lambda/jwt.d.cts.map +1 -0
- package/dist/lambda/jwt.d.mts +2 -1
- package/dist/lambda/jwt.d.mts.map +1 -0
- package/dist/lambda/jwt.mjs +2 -2
- package/dist/lambda/jwt.mjs.map +1 -1
- package/dist/lambda/oidc.cjs +2 -2
- package/dist/lambda/oidc.cjs.map +1 -1
- package/dist/lambda/oidc.d.cts +3 -2
- package/dist/lambda/oidc.d.cts.map +1 -0
- package/dist/lambda/oidc.d.mts +3 -2
- package/dist/lambda/oidc.d.mts.map +1 -0
- package/dist/lambda/oidc.mjs +2 -2
- package/dist/lambda/oidc.mjs.map +1 -1
- package/dist/oidc-C0KyYaAK.cjs.map +1 -1
- package/dist/{oidc-CKOGLxjV.d.mts → oidc-ChA17wLB.d.cts} +3 -2
- package/dist/oidc-ChA17wLB.d.cts.map +1 -0
- package/dist/{oidc-DDLIB5gb.d.cts → oidc-DTRgBBl6.d.mts} +3 -2
- package/dist/oidc-DTRgBBl6.d.mts.map +1 -0
- package/dist/oidc-KA30gMlx.mjs.map +1 -1
- package/dist/oidc.d.cts +2 -2
- package/dist/oidc.d.mts +2 -2
- package/dist/server.cjs +2 -2
- package/dist/server.d.cts +2 -2
- package/dist/server.d.mts +2 -2
- package/dist/server.mjs +2 -2
- package/dist/{tokenManager--Q93eNYr.d.mts → tokenManager-CL3yE06D.d.cts} +2 -1
- package/dist/tokenManager-CL3yE06D.d.cts.map +1 -0
- package/dist/{tokenManager-BVXxfHRa.mjs → tokenManager-Ci2Tgxp8.mjs} +5 -3
- package/dist/tokenManager-Ci2Tgxp8.mjs.map +1 -0
- package/dist/{tokenManager-EPmwgai2.cjs → tokenManager-CvEMgxOp.cjs} +5 -3
- package/dist/tokenManager-CvEMgxOp.cjs.map +1 -0
- package/dist/{tokenManager-H6-lWEah.d.cts → tokenManager-RrwjL0y-.d.mts} +2 -1
- package/dist/tokenManager-RrwjL0y-.d.mts.map +1 -0
- package/dist/tokenManager.cjs +1 -1
- package/dist/tokenManager.d.cts +1 -1
- package/dist/tokenManager.d.mts +1 -1
- package/dist/tokenManager.mjs +1 -1
- package/package.json +10 -5
- package/src/__tests__/cacheTokenStorage.spec.ts +148 -148
- package/src/__tests__/client.spec.ts +339 -339
- package/src/__tests__/hono-jwt.spec.ts +219 -219
- package/src/__tests__/hono-oidc.spec.ts +560 -560
- package/src/__tests__/jwt.spec.ts +150 -127
- package/src/__tests__/lambda-jwt.spec.ts +205 -205
- package/src/__tests__/lambda-oidc.spec.ts +580 -579
- package/src/__tests__/oidc.spec.ts +365 -365
- package/src/__tests__/tokenManager.spec.ts +254 -254
- package/src/cacheTokenStorage.ts +32 -32
- package/src/client.ts +199 -190
- package/src/hono/jwt.ts +111 -111
- package/src/hono/oidc.ts +131 -131
- package/src/index.ts +2 -2
- package/src/jwt.ts +57 -57
- package/src/lambda/jwt.ts +170 -170
- package/src/lambda/oidc.ts +165 -165
- package/src/oidc.ts +121 -121
- package/src/server.ts +6 -7
- package/src/tokenManager.ts +89 -87
- package/tsconfig.json +10 -0
- package/dist/cacheTokenStorage-Ca05vf3T.mjs.map +0 -1
- package/dist/cacheTokenStorage-CvptztkW.cjs.map +0 -1
- package/dist/client-DaiUm0UZ.cjs.map +0 -1
- package/dist/client-DjNZS6vZ.mjs.map +0 -1
- package/dist/tokenManager-BVXxfHRa.mjs.map +0 -1
- package/dist/tokenManager-EPmwgai2.cjs.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
APIGatewayRequestAuthorizerEvent,
|
|
3
|
+
APIGatewayTokenAuthorizerEvent,
|
|
4
|
+
Context as LambdaContext,
|
|
5
5
|
} from 'aws-lambda';
|
|
6
6
|
import * as jose from 'jose';
|
|
7
7
|
import { describe, expect, it } from 'vitest';
|
|
@@ -9,270 +9,270 @@ import { JwtAuthorizer } from '../lambda/jwt';
|
|
|
9
9
|
|
|
10
10
|
const TEST_SECRET = 'super-secret-key-for-testing-only-32chars';
|
|
11
11
|
const TEST_METHOD_ARN =
|
|
12
|
-
|
|
12
|
+
'arn:aws:execute-api:us-east-1:123456789:api-id/stage/GET/resource';
|
|
13
13
|
|
|
14
14
|
async function createTestToken(
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
claims: Record<string, unknown> = {},
|
|
16
|
+
secret = TEST_SECRET,
|
|
17
17
|
) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
const secretKey = new TextEncoder().encode(secret);
|
|
19
|
+
return await new jose.SignJWT({ sub: 'user-123', ...claims })
|
|
20
|
+
.setProtectedHeader({ alg: 'HS256' })
|
|
21
|
+
.setIssuedAt()
|
|
22
|
+
.setExpirationTime('1h')
|
|
23
|
+
.sign(secretKey);
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
function createTokenEvent(
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
token: string,
|
|
28
|
+
methodArn = TEST_METHOD_ARN,
|
|
29
29
|
): APIGatewayTokenAuthorizerEvent {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
return {
|
|
31
|
+
type: 'TOKEN',
|
|
32
|
+
authorizationToken: `Bearer ${token}`,
|
|
33
|
+
methodArn,
|
|
34
|
+
};
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
function createRequestEvent(
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
headers: Record<string, string> = {},
|
|
39
|
+
methodArn = TEST_METHOD_ARN,
|
|
40
40
|
): APIGatewayRequestAuthorizerEvent {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
41
|
+
return {
|
|
42
|
+
type: 'REQUEST',
|
|
43
|
+
methodArn,
|
|
44
|
+
headers,
|
|
45
|
+
multiValueHeaders: {},
|
|
46
|
+
pathParameters: null,
|
|
47
|
+
queryStringParameters: null,
|
|
48
|
+
multiValueQueryStringParameters: null,
|
|
49
|
+
stageVariables: null,
|
|
50
|
+
requestContext: {} as any,
|
|
51
|
+
resource: '',
|
|
52
|
+
path: '',
|
|
53
|
+
httpMethod: 'GET',
|
|
54
|
+
};
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
const mockLambdaContext = {} as LambdaContext;
|
|
58
58
|
|
|
59
59
|
describe('JwtAuthorizer', () => {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
describe('tokenHandler()', () => {
|
|
61
|
+
it('should allow valid token', async () => {
|
|
62
|
+
const authorizer = new JwtAuthorizer({
|
|
63
|
+
config: { secret: TEST_SECRET },
|
|
64
|
+
});
|
|
65
|
+
const handler = authorizer.tokenHandler();
|
|
66
66
|
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
const token = await createTestToken();
|
|
68
|
+
const event = createTokenEvent(token);
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
const result = await handler(event, mockLambdaContext);
|
|
71
71
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
72
|
+
expect(result.policyDocument.Statement[0].Effect).toBe('Allow');
|
|
73
|
+
expect(result.principalId).toBe('user-123');
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('should deny invalid token', async () => {
|
|
77
|
+
const authorizer = new JwtAuthorizer({
|
|
78
|
+
config: { secret: TEST_SECRET },
|
|
79
|
+
});
|
|
80
|
+
const handler = authorizer.tokenHandler();
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
const event = createTokenEvent('invalid-token');
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
const result = await handler(event, mockLambdaContext);
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
expect(result.policyDocument.Statement[0].Effect).toBe('Deny');
|
|
87
|
+
expect(result.principalId).toBe('unauthorized');
|
|
88
|
+
});
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
90
|
+
it('should use wildcard resource by default', async () => {
|
|
91
|
+
const authorizer = new JwtAuthorizer({
|
|
92
|
+
config: { secret: TEST_SECRET },
|
|
93
|
+
});
|
|
94
|
+
const handler = authorizer.tokenHandler();
|
|
95
|
+
|
|
96
|
+
const token = await createTestToken();
|
|
97
|
+
const event = createTokenEvent(token);
|
|
98
|
+
|
|
99
|
+
const result = await handler(event, mockLambdaContext);
|
|
100
|
+
|
|
101
|
+
expect(result.policyDocument.Statement[0].Resource).toBe(
|
|
102
|
+
'arn:aws:execute-api:us-east-1:123456789:api-id/stage/*',
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
105
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
106
|
+
it('should use exact resource when wildcardResource is false', async () => {
|
|
107
|
+
const authorizer = new JwtAuthorizer({
|
|
108
|
+
config: { secret: TEST_SECRET },
|
|
109
|
+
wildcardResource: false,
|
|
110
|
+
});
|
|
111
|
+
const handler = authorizer.tokenHandler();
|
|
112
|
+
|
|
113
|
+
const token = await createTestToken();
|
|
114
|
+
const event = createTokenEvent(token);
|
|
115
|
+
|
|
116
|
+
const result = await handler(event, mockLambdaContext);
|
|
117
117
|
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
expect(result.policyDocument.Statement[0].Resource).toBe(TEST_METHOD_ARN);
|
|
119
|
+
});
|
|
120
120
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
121
|
+
it('should use custom getPrincipalId', async () => {
|
|
122
|
+
const authorizer = new JwtAuthorizer({
|
|
123
|
+
config: { secret: TEST_SECRET },
|
|
124
|
+
getPrincipalId: (claims) => `custom-${claims.sub}`,
|
|
125
|
+
});
|
|
126
|
+
const handler = authorizer.tokenHandler();
|
|
127
|
+
|
|
128
|
+
const token = await createTestToken();
|
|
129
|
+
const event = createTokenEvent(token);
|
|
130
130
|
|
|
131
|
-
|
|
131
|
+
const result = await handler(event, mockLambdaContext);
|
|
132
132
|
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
expect(result.principalId).toBe('custom-user-123');
|
|
134
|
+
});
|
|
135
135
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
136
|
+
it('should include context from getContext', async () => {
|
|
137
|
+
const authorizer = new JwtAuthorizer({
|
|
138
|
+
config: { secret: TEST_SECRET },
|
|
139
|
+
getContext: (claims) => ({
|
|
140
|
+
userId: claims.sub!,
|
|
141
|
+
role: 'admin',
|
|
142
|
+
}),
|
|
143
|
+
});
|
|
144
|
+
const handler = authorizer.tokenHandler();
|
|
145
145
|
|
|
146
|
-
|
|
147
|
-
|
|
146
|
+
const token = await createTestToken();
|
|
147
|
+
const event = createTokenEvent(token);
|
|
148
148
|
|
|
149
|
-
|
|
149
|
+
const result = await handler(event, mockLambdaContext);
|
|
150
150
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
151
|
+
expect(result.context).toEqual({
|
|
152
|
+
userId: 'user-123',
|
|
153
|
+
role: 'admin',
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
156
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
157
|
+
it('should deny when custom authorize returns false', async () => {
|
|
158
|
+
const authorizer = new JwtAuthorizer({
|
|
159
|
+
config: { secret: TEST_SECRET },
|
|
160
|
+
authorize: (claims) => claims.sub === 'admin',
|
|
161
|
+
});
|
|
162
|
+
const handler = authorizer.tokenHandler();
|
|
163
163
|
|
|
164
|
-
|
|
165
|
-
|
|
164
|
+
const token = await createTestToken();
|
|
165
|
+
const event = createTokenEvent(token);
|
|
166
166
|
|
|
167
|
-
|
|
167
|
+
const result = await handler(event, mockLambdaContext);
|
|
168
168
|
|
|
169
|
-
|
|
170
|
-
|
|
169
|
+
expect(result.policyDocument.Statement[0].Effect).toBe('Deny');
|
|
170
|
+
});
|
|
171
171
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
172
|
+
it('should allow when custom authorize returns true', async () => {
|
|
173
|
+
const authorizer = new JwtAuthorizer({
|
|
174
|
+
config: { secret: TEST_SECRET },
|
|
175
|
+
authorize: (claims) => claims.sub === 'user-123',
|
|
176
|
+
});
|
|
177
|
+
const handler = authorizer.tokenHandler();
|
|
178
178
|
|
|
179
|
-
|
|
180
|
-
|
|
179
|
+
const token = await createTestToken();
|
|
180
|
+
const event = createTokenEvent(token);
|
|
181
181
|
|
|
182
|
-
|
|
182
|
+
const result = await handler(event, mockLambdaContext);
|
|
183
183
|
|
|
184
|
-
|
|
185
|
-
|
|
184
|
+
expect(result.policyDocument.Statement[0].Effect).toBe('Allow');
|
|
185
|
+
});
|
|
186
186
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
187
|
+
it('should handle token without Bearer prefix', async () => {
|
|
188
|
+
const authorizer = new JwtAuthorizer({
|
|
189
|
+
config: { secret: TEST_SECRET },
|
|
190
|
+
});
|
|
191
|
+
const handler = authorizer.tokenHandler();
|
|
192
192
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
193
|
+
const token = await createTestToken();
|
|
194
|
+
const event: APIGatewayTokenAuthorizerEvent = {
|
|
195
|
+
type: 'TOKEN',
|
|
196
|
+
authorizationToken: token, // No Bearer prefix
|
|
197
|
+
methodArn: TEST_METHOD_ARN,
|
|
198
|
+
};
|
|
199
199
|
|
|
200
|
-
|
|
200
|
+
const result = await handler(event, mockLambdaContext);
|
|
201
201
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
202
|
+
expect(result.policyDocument.Statement[0].Effect).toBe('Allow');
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
205
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
206
|
+
describe('requestHandler()', () => {
|
|
207
|
+
it('should allow valid token from Authorization header', async () => {
|
|
208
|
+
const authorizer = new JwtAuthorizer({
|
|
209
|
+
config: { secret: TEST_SECRET },
|
|
210
|
+
});
|
|
211
|
+
const handler = authorizer.requestHandler();
|
|
212
212
|
|
|
213
|
-
|
|
214
|
-
|
|
213
|
+
const token = await createTestToken();
|
|
214
|
+
const event = createRequestEvent({ Authorization: `Bearer ${token}` });
|
|
215
215
|
|
|
216
|
-
|
|
216
|
+
const result = await handler(event, mockLambdaContext);
|
|
217
217
|
|
|
218
|
-
|
|
219
|
-
|
|
218
|
+
expect(result.policyDocument.Statement[0].Effect).toBe('Allow');
|
|
219
|
+
});
|
|
220
220
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
221
|
+
it('should deny when no token provided', async () => {
|
|
222
|
+
const authorizer = new JwtAuthorizer({
|
|
223
|
+
config: { secret: TEST_SECRET },
|
|
224
|
+
});
|
|
225
|
+
const handler = authorizer.requestHandler();
|
|
226
226
|
|
|
227
|
-
|
|
227
|
+
const event = createRequestEvent({});
|
|
228
228
|
|
|
229
|
-
|
|
229
|
+
const result = await handler(event, mockLambdaContext);
|
|
230
230
|
|
|
231
|
-
|
|
232
|
-
|
|
231
|
+
expect(result.policyDocument.Statement[0].Effect).toBe('Deny');
|
|
232
|
+
});
|
|
233
233
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
234
|
+
it('should extract token from custom header', async () => {
|
|
235
|
+
const authorizer = new JwtAuthorizer({
|
|
236
|
+
config: { secret: TEST_SECRET },
|
|
237
|
+
extraction: { headerName: 'x-api-token', tokenPrefix: '' },
|
|
238
|
+
});
|
|
239
|
+
const handler = authorizer.requestHandler();
|
|
240
240
|
|
|
241
|
-
|
|
242
|
-
|
|
241
|
+
const token = await createTestToken();
|
|
242
|
+
const event = createRequestEvent({ 'x-api-token': token });
|
|
243
243
|
|
|
244
|
-
|
|
244
|
+
const result = await handler(event, mockLambdaContext);
|
|
245
245
|
|
|
246
|
-
|
|
247
|
-
|
|
246
|
+
expect(result.policyDocument.Statement[0].Effect).toBe('Allow');
|
|
247
|
+
});
|
|
248
248
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
249
|
+
it('should extract token from cookie', async () => {
|
|
250
|
+
const authorizer = new JwtAuthorizer({
|
|
251
|
+
config: { secret: TEST_SECRET },
|
|
252
|
+
extraction: { cookieName: 'session' },
|
|
253
|
+
});
|
|
254
|
+
const handler = authorizer.requestHandler();
|
|
255
255
|
|
|
256
|
-
|
|
257
|
-
|
|
256
|
+
const token = await createTestToken();
|
|
257
|
+
const event = createRequestEvent({ cookie: `session=${token}` });
|
|
258
258
|
|
|
259
|
-
|
|
259
|
+
const result = await handler(event, mockLambdaContext);
|
|
260
260
|
|
|
261
|
-
|
|
262
|
-
|
|
261
|
+
expect(result.policyDocument.Statement[0].Effect).toBe('Allow');
|
|
262
|
+
});
|
|
263
263
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
264
|
+
it('should handle case-insensitive headers', async () => {
|
|
265
|
+
const authorizer = new JwtAuthorizer({
|
|
266
|
+
config: { secret: TEST_SECRET },
|
|
267
|
+
});
|
|
268
|
+
const handler = authorizer.requestHandler();
|
|
269
269
|
|
|
270
|
-
|
|
271
|
-
|
|
270
|
+
const token = await createTestToken();
|
|
271
|
+
const event = createRequestEvent({ authorization: `Bearer ${token}` });
|
|
272
272
|
|
|
273
|
-
|
|
273
|
+
const result = await handler(event, mockLambdaContext);
|
|
274
274
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
275
|
+
expect(result.policyDocument.Statement[0].Effect).toBe('Allow');
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
278
|
});
|