ag-common 0.0.90 → 0.0.94

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.
@@ -8,10 +8,14 @@ export declare type NextType<T> = ({ event, body, params, userProfile, lang, }:
8
8
  userProfile?: User;
9
9
  lang: TLang;
10
10
  }) => Promise<APIGatewayProxyResult>;
11
- export declare function validateOpenApi<T>({ event, next, authorized, schema, COGNITO_USER_POOL_ID, }: {
11
+ export declare function validateOpenApi<T>({ event, next, authorized, schema, COGNITO_USER_POOL_ID, jwksRegion, }: {
12
12
  COGNITO_USER_POOL_ID: string;
13
13
  schema: any;
14
14
  event: APIGatewayEvent;
15
15
  next: NextType<T>;
16
16
  authorized?: true | false | 'optional';
17
+ /**
18
+ * default ap-southeast-2
19
+ */
20
+ jwksRegion?: string;
17
21
  }): Promise<APIGatewayProxyResult>;
@@ -43,7 +43,7 @@ const getOperation = ({ path, method, resource, schema, }) => {
43
43
  const pathParams = (re === null || re === void 0 ? void 0 : re.groups) && JSON.parse(JSON.stringify(re === null || re === void 0 ? void 0 : re.groups));
44
44
  return { operation, pathParams };
45
45
  };
46
- function validateOpenApi({ event, next, authorized, schema, COGNITO_USER_POOL_ID, }) {
46
+ function validateOpenApi({ event, next, authorized, schema, COGNITO_USER_POOL_ID, jwksRegion = 'ap-southeast-2', }) {
47
47
  var _a, _b, _c, _d, _e;
48
48
  return __awaiter(this, void 0, void 0, function* () {
49
49
  if (!schema) {
@@ -107,6 +107,7 @@ function validateOpenApi({ event, next, authorized, schema, COGNITO_USER_POOL_ID
107
107
  ({ error, userProfile } = yield (0, validations_1.getAndValidateToken)({
108
108
  tokenRaw: authHeader,
109
109
  COGNITO_USER_POOL_ID,
110
+ jwksRegion,
110
111
  }));
111
112
  if (error) {
112
113
  return error;
@@ -1,7 +1,11 @@
1
1
  import { error } from '../../common/helpers/log';
2
2
  import { User } from '../../ui/helpers/jwt';
3
3
  import { APIGatewayProxyResult } from '../types';
4
- export declare const getAndValidateToken: ({ tokenRaw, COGNITO_USER_POOL_ID, }: {
4
+ export declare const getAndValidateToken: ({ tokenRaw, jwksRegion, COGNITO_USER_POOL_ID, }: {
5
+ /**
6
+ * default ap-southeast-2
7
+ */
8
+ jwksRegion?: string | undefined;
5
9
  tokenRaw?: string | undefined;
6
10
  COGNITO_USER_POOL_ID: string;
7
11
  }) => Promise<{
@@ -19,9 +19,7 @@ const jsonwebtoken_1 = require("jsonwebtoken");
19
19
  const log_1 = require("../../common/helpers/log");
20
20
  const api_1 = require("./api");
21
21
  let jwksClient;
22
- const jwtVerify = ({ COGNITO_USER_POOL_ID, token, }) => __awaiter(void 0, void 0, void 0, function* () {
23
- const jwksUri = `https://cognito-idp.ap-southeast-2.amazonaws.com/${COGNITO_USER_POOL_ID}/.well-known/jwks.json`;
24
- const issuer = `https://cognito-idp.ap-southeast-2.amazonaws.com/${COGNITO_USER_POOL_ID}`;
22
+ const jwtVerify = ({ token, jwksUri, issuer, }) => __awaiter(void 0, void 0, void 0, function* () {
25
23
  return new Promise((resolve, reject) => {
26
24
  (0, jsonwebtoken_1.verify)(token, (header, callback) => {
27
25
  if (!jwksClient) {
@@ -60,22 +58,39 @@ const jwtVerify = ({ COGNITO_USER_POOL_ID, token, }) => __awaiter(void 0, void 0
60
58
  });
61
59
  });
62
60
  });
63
- const getAndValidateToken = ({ tokenRaw, COGNITO_USER_POOL_ID, }) => __awaiter(void 0, void 0, void 0, function* () {
61
+ const getAndValidateToken = ({ tokenRaw, jwksRegion = 'ap-southeast-2', COGNITO_USER_POOL_ID, }) => __awaiter(void 0, void 0, void 0, function* () {
64
62
  var _a, _b;
63
+ const jwksUri = `https://cognito-idp.${jwksRegion}.amazonaws.com/${COGNITO_USER_POOL_ID}/.well-known/jwks.json`;
64
+ const issuer = `https://cognito-idp.${jwksRegion}.amazonaws.com/${COGNITO_USER_POOL_ID}`;
65
65
  let token = '';
66
66
  try {
67
67
  if (!tokenRaw) {
68
- (0, log_1.error)('no auth headers');
68
+ const m = 'auth error: no auth headers';
69
+ (0, log_1.error)(m);
69
70
  return {
70
- error: (0, api_1.returnCode)(403, 'auth failed'),
71
+ error: (0, api_1.returnCode)(403, m),
71
72
  };
72
73
  }
73
74
  token = tokenRaw.substring(tokenRaw.indexOf(' ') + 1);
75
+ if (!token) {
76
+ const m = 'auth error: no token';
77
+ (0, log_1.error)(m);
78
+ return {
79
+ error: (0, api_1.returnCode)(403, m),
80
+ };
81
+ }
74
82
  let subject;
75
83
  try {
76
- yield jwtVerify({ token, COGNITO_USER_POOL_ID });
84
+ yield jwtVerify({ token, jwksUri, issuer });
77
85
  const decoded = (0, jsonwebtoken_1.decode)(token);
78
86
  (0, log_1.debug)(`decoded=${JSON.stringify(decoded, null, 2)}`);
87
+ if (!decoded.email) {
88
+ const m = 'auth error, no email';
89
+ (0, log_1.error)(m);
90
+ return {
91
+ error: (0, api_1.returnCode)(403, m),
92
+ };
93
+ }
79
94
  subject = decoded === null || decoded === void 0 ? void 0 : decoded.sub;
80
95
  if (!subject) {
81
96
  const mess = 'user should have responded with subject (sub) field';
@@ -96,12 +111,6 @@ const getAndValidateToken = ({ tokenRaw, COGNITO_USER_POOL_ID, }) => __awaiter(v
96
111
  picture,
97
112
  updatedAt: parseInt(`${decoded.auth_time}000`, 10),
98
113
  };
99
- if (!userProfile || !token || !userProfile.userId) {
100
- (0, log_1.error)('auth fail');
101
- return {
102
- error: (0, api_1.returnCode)(403, 'auth fail'),
103
- };
104
- }
105
114
  return { token, userProfile };
106
115
  }
107
116
  catch (e) {
@@ -114,9 +123,10 @@ const getAndValidateToken = ({ tokenRaw, COGNITO_USER_POOL_ID, }) => __awaiter(v
114
123
  }
115
124
  }
116
125
  catch (e) {
117
- (0, log_1.error)('auth error', e);
126
+ const m = 'auth error:' + JSON.stringify(e, null, 2);
127
+ (0, log_1.error)(m);
118
128
  return {
119
- error: (0, api_1.returnCode)(403, 'auth fail'),
129
+ error: (0, api_1.returnCode)(403, m),
120
130
  };
121
131
  }
122
132
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ag-common",
3
- "version": "0.0.90",
3
+ "version": "0.0.94",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "author": "Andrei Gec <@andreigec> (https://gec.dev/)",