@aws-amplify/auth 4.5.8-unstable.7 → 4.5.9-auth-hotfix.5

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/lib-esm/Auth.js CHANGED
@@ -74,7 +74,7 @@ var __read = (this && this.__read) || function (o, n) {
74
74
  return ar;
75
75
  };
76
76
  import { isUsernamePasswordOpts, isCognitoHostedOpts, isFederatedSignInOptions, isFederatedSignInOptionsCustom, hasCustomState, } from './types';
77
- import { Amplify, ConsoleLogger as Logger, Credentials, Hub, StorageHelper, Parser, JS, UniversalStorage, urlSafeDecode, } from '@aws-amplify/core';
77
+ import { Amplify, ConsoleLogger as Logger, Credentials, Hub, StorageHelper, Parser, browserOrNode, UniversalStorage, urlSafeDecode, } from '@aws-amplify/core';
78
78
  import { CookieStorage, CognitoUserPool, AuthenticationDetails, CognitoUser, CognitoUserSession, CognitoUserAttribute, CognitoIdToken, CognitoRefreshToken, CognitoAccessToken, } from 'amazon-cognito-identity-js';
79
79
  import { parse } from 'url';
80
80
  import OAuth from './OAuth/OAuth';
@@ -108,6 +108,7 @@ var AuthClass = /** @class */ (function () {
108
108
  this.userPool = null;
109
109
  this.user = null;
110
110
  this.oAuthFlowInProgress = false;
111
+ this.inflightSessionPromise = null;
111
112
  this.Credentials = Credentials;
112
113
  this.wrapRefreshSessionCallback = function (callback) {
113
114
  var wrapped = function (error, data) {
@@ -1330,10 +1331,10 @@ var AuthClass = /** @class */ (function () {
1330
1331
  return new Promise(function (res, rej) {
1331
1332
  _this._storageSync
1332
1333
  .then(function () { return __awaiter(_this, void 0, void 0, function () {
1333
- var user, clientMetadata;
1334
+ var user, session, bypassCache, clientMetadata, _a, scope, err_1;
1334
1335
  var _this = this;
1335
- return __generator(this, function (_a) {
1336
- switch (_a.label) {
1336
+ return __generator(this, function (_b) {
1337
+ switch (_b.label) {
1337
1338
  case 0:
1338
1339
  if (!this.isOAuthInProgress()) return [3 /*break*/, 2];
1339
1340
  logger.debug('OAuth signIn in progress, waiting for resolution...');
@@ -1357,8 +1358,8 @@ var AuthClass = /** @class */ (function () {
1357
1358
  }
1358
1359
  })];
1359
1360
  case 1:
1360
- _a.sent();
1361
- _a.label = 2;
1361
+ _b.sent();
1362
+ _b.label = 2;
1362
1363
  case 2:
1363
1364
  user = this.userPool.getCurrentUser();
1364
1365
  if (!user) {
@@ -1366,96 +1367,77 @@ var AuthClass = /** @class */ (function () {
1366
1367
  rej('No current user');
1367
1368
  return [2 /*return*/];
1368
1369
  }
1370
+ _b.label = 3;
1371
+ case 3:
1372
+ _b.trys.push([3, 7, , 8]);
1373
+ return [4 /*yield*/, this._userSession({ user: user })];
1374
+ case 4:
1375
+ session = _b.sent();
1376
+ bypassCache = params ? params.bypassCache : false;
1377
+ if (!bypassCache) return [3 /*break*/, 6];
1378
+ return [4 /*yield*/, this.Credentials.clear()];
1379
+ case 5:
1380
+ _b.sent();
1381
+ _b.label = 6;
1382
+ case 6:
1369
1383
  clientMetadata = this._config.clientMetadata;
1370
- // refresh the session if the session expired.
1371
- user.getSession(function (err, session) { return __awaiter(_this, void 0, void 0, function () {
1372
- var cleanUpError_5, bypassCache, clientMetadata, _a, scope;
1373
- var _this = this;
1374
- return __generator(this, function (_b) {
1375
- switch (_b.label) {
1376
- case 0:
1377
- if (!err) return [3 /*break*/, 5];
1378
- logger.debug('Failed to get the user session', err);
1379
- if (!this.isSessionInvalid(err)) return [3 /*break*/, 4];
1380
- _b.label = 1;
1381
- case 1:
1382
- _b.trys.push([1, 3, , 4]);
1383
- return [4 /*yield*/, this.cleanUpInvalidSession(user)];
1384
- case 2:
1385
- _b.sent();
1386
- return [3 /*break*/, 4];
1387
- case 3:
1388
- cleanUpError_5 = _b.sent();
1389
- rej(new Error("Session is invalid due to: " + err.message + " and failed to clean up invalid session: " + cleanUpError_5.message));
1390
- return [2 /*return*/];
1391
- case 4:
1392
- rej(err);
1393
- return [2 /*return*/];
1394
- case 5:
1395
- bypassCache = params ? params.bypassCache : false;
1396
- if (!bypassCache) return [3 /*break*/, 7];
1397
- return [4 /*yield*/, this.Credentials.clear()];
1398
- case 6:
1399
- _b.sent();
1400
- _b.label = 7;
1401
- case 7:
1402
- clientMetadata = this._config.clientMetadata;
1403
- _a = session.getAccessToken().decodePayload().scope, scope = _a === void 0 ? '' : _a;
1404
- if (scope.split(' ').includes(USER_ADMIN_SCOPE)) {
1405
- user.getUserData(function (err, data) { return __awaiter(_this, void 0, void 0, function () {
1406
- var cleanUpError_6, preferredMFA, attributeList, i, attribute, userAttribute, attributes;
1407
- return __generator(this, function (_a) {
1408
- switch (_a.label) {
1409
- case 0:
1410
- if (!err) return [3 /*break*/, 7];
1411
- logger.debug('getting user data failed', err);
1412
- if (!this.isSessionInvalid(err)) return [3 /*break*/, 5];
1413
- _a.label = 1;
1414
- case 1:
1415
- _a.trys.push([1, 3, , 4]);
1416
- return [4 /*yield*/, this.cleanUpInvalidSession(user)];
1417
- case 2:
1418
- _a.sent();
1419
- return [3 /*break*/, 4];
1420
- case 3:
1421
- cleanUpError_6 = _a.sent();
1422
- rej(new Error("Session is invalid due to: " + err.message + " and failed to clean up invalid session: " + cleanUpError_6.message));
1423
- return [2 /*return*/];
1424
- case 4:
1425
- rej(err);
1426
- return [3 /*break*/, 6];
1427
- case 5:
1428
- res(user);
1429
- _a.label = 6;
1430
- case 6: return [2 /*return*/];
1431
- case 7:
1432
- preferredMFA = data.PreferredMfaSetting || 'NOMFA';
1433
- attributeList = [];
1434
- for (i = 0; i < data.UserAttributes.length; i++) {
1435
- attribute = {
1436
- Name: data.UserAttributes[i].Name,
1437
- Value: data.UserAttributes[i].Value,
1438
- };
1439
- userAttribute = new CognitoUserAttribute(attribute);
1440
- attributeList.push(userAttribute);
1441
- }
1442
- attributes = this.attributesToObject(attributeList);
1443
- Object.assign(user, { attributes: attributes, preferredMFA: preferredMFA });
1444
- return [2 /*return*/, res(user)];
1445
- }
1446
- });
1447
- }); }, { bypassCache: bypassCache, clientMetadata: clientMetadata });
1448
- }
1449
- else {
1450
- logger.debug("Unable to get the user data because the " + USER_ADMIN_SCOPE + " " +
1451
- "is not in the scopes of the access token");
1384
+ _a = session.getAccessToken().decodePayload().scope, scope = _a === void 0 ? '' : _a;
1385
+ if (scope.split(' ').includes(USER_ADMIN_SCOPE)) {
1386
+ user.getUserData(function (err, data) { return __awaiter(_this, void 0, void 0, function () {
1387
+ var cleanUpError_5, preferredMFA, attributeList, i, attribute, userAttribute, attributes;
1388
+ return __generator(this, function (_a) {
1389
+ switch (_a.label) {
1390
+ case 0:
1391
+ if (!err) return [3 /*break*/, 7];
1392
+ logger.debug('getting user data failed', err);
1393
+ if (!this.isSessionInvalid(err)) return [3 /*break*/, 5];
1394
+ _a.label = 1;
1395
+ case 1:
1396
+ _a.trys.push([1, 3, , 4]);
1397
+ return [4 /*yield*/, this.cleanUpInvalidSession(user)];
1398
+ case 2:
1399
+ _a.sent();
1400
+ return [3 /*break*/, 4];
1401
+ case 3:
1402
+ cleanUpError_5 = _a.sent();
1403
+ rej(new Error("Session is invalid due to: " + err.message + " and failed to clean up invalid session: " + cleanUpError_5.message));
1404
+ return [2 /*return*/];
1405
+ case 4:
1406
+ rej(err);
1407
+ return [3 /*break*/, 6];
1408
+ case 5:
1409
+ res(user);
1410
+ _a.label = 6;
1411
+ case 6: return [2 /*return*/];
1412
+ case 7:
1413
+ preferredMFA = data.PreferredMfaSetting || 'NOMFA';
1414
+ attributeList = [];
1415
+ for (i = 0; i < data.UserAttributes.length; i++) {
1416
+ attribute = {
1417
+ Name: data.UserAttributes[i].Name,
1418
+ Value: data.UserAttributes[i].Value,
1419
+ };
1420
+ userAttribute = new CognitoUserAttribute(attribute);
1421
+ attributeList.push(userAttribute);
1422
+ }
1423
+ attributes = this.attributesToObject(attributeList);
1424
+ Object.assign(user, { attributes: attributes, preferredMFA: preferredMFA });
1452
1425
  return [2 /*return*/, res(user)];
1453
- }
1454
- return [2 /*return*/];
1455
- }
1456
- });
1457
- }); }, { clientMetadata: clientMetadata });
1458
- return [2 /*return*/];
1426
+ }
1427
+ });
1428
+ }); }, { bypassCache: bypassCache, clientMetadata: clientMetadata });
1429
+ }
1430
+ else {
1431
+ logger.debug("Unable to get the user data because the " + USER_ADMIN_SCOPE + " " +
1432
+ "is not in the scopes of the access token");
1433
+ return [2 /*return*/, res(user)];
1434
+ }
1435
+ return [3 /*break*/, 8];
1436
+ case 7:
1437
+ err_1 = _b.sent();
1438
+ rej(err_1);
1439
+ return [3 /*break*/, 8];
1440
+ case 8: return [2 /*return*/];
1459
1441
  }
1460
1442
  });
1461
1443
  }); })
@@ -1565,50 +1547,74 @@ var AuthClass = /** @class */ (function () {
1565
1547
  });
1566
1548
  });
1567
1549
  };
1550
+ AuthClass.prototype._userSession = function (_a) {
1551
+ var user = _a.user, _b = _a.bypassCache, bypassCache = _b === void 0 ? false : _b;
1552
+ return __awaiter(this, void 0, void 0, function () {
1553
+ var clientMetadata;
1554
+ var _this = this;
1555
+ return __generator(this, function (_c) {
1556
+ switch (_c.label) {
1557
+ case 0:
1558
+ if (!user) {
1559
+ logger.debug('the user is null');
1560
+ return [2 /*return*/, this.rejectAuthError(AuthErrorTypes.NoUserSession)];
1561
+ }
1562
+ clientMetadata = this._config.clientMetadata;
1563
+ if (!this.inflightSessionPromise) return [3 /*break*/, 2];
1564
+ return [4 /*yield*/, this.inflightSessionPromise];
1565
+ case 1: return [2 /*return*/, _c.sent()];
1566
+ case 2:
1567
+ this.inflightSessionPromise = new Promise(function (resolve, rej) {
1568
+ user.getSession(function (err, session) { return __awaiter(_this, void 0, void 0, function () {
1569
+ var cleanUpError_6;
1570
+ return __generator(this, function (_a) {
1571
+ switch (_a.label) {
1572
+ case 0:
1573
+ if (!err) return [3 /*break*/, 5];
1574
+ logger.debug('Failed to get the session from user', user);
1575
+ if (!this.isSessionInvalid(err)) return [3 /*break*/, 4];
1576
+ _a.label = 1;
1577
+ case 1:
1578
+ _a.trys.push([1, 3, , 4]);
1579
+ return [4 /*yield*/, this.cleanUpInvalidSession(user)];
1580
+ case 2:
1581
+ _a.sent();
1582
+ return [3 /*break*/, 4];
1583
+ case 3:
1584
+ cleanUpError_6 = _a.sent();
1585
+ rej(new Error("Session is invalid due to: " + err.message + " and failed to clean up invalid session: " + cleanUpError_6.message));
1586
+ return [2 /*return*/];
1587
+ case 4:
1588
+ rej(err);
1589
+ return [2 /*return*/];
1590
+ case 5:
1591
+ logger.debug('Succeed to get the user session', session);
1592
+ resolve(session);
1593
+ return [2 /*return*/];
1594
+ }
1595
+ });
1596
+ }); }, { clientMetadata: clientMetadata, bypassCache: bypassCache });
1597
+ })
1598
+ .then(function (session) {
1599
+ _this.inflightSessionPromise = null;
1600
+ return session;
1601
+ })
1602
+ .catch(function (err) {
1603
+ _this.inflightSessionPromise = null;
1604
+ throw err;
1605
+ });
1606
+ return [2 /*return*/, this.inflightSessionPromise];
1607
+ }
1608
+ });
1609
+ });
1610
+ };
1568
1611
  /**
1569
1612
  * Get the corresponding user session
1570
1613
  * @param {Object} user - The CognitoUser object
1571
1614
  * @return - A promise resolves to the session
1572
1615
  */
1573
1616
  AuthClass.prototype.userSession = function (user) {
1574
- var _this = this;
1575
- if (!user) {
1576
- logger.debug('the user is null');
1577
- return this.rejectAuthError(AuthErrorTypes.NoUserSession);
1578
- }
1579
- var clientMetadata = this._config.clientMetadata; // TODO: verify behavior if this is override during signIn
1580
- return new Promise(function (res, rej) {
1581
- logger.debug('Getting the session from this user:', user);
1582
- user.getSession(function (err, session) { return __awaiter(_this, void 0, void 0, function () {
1583
- var cleanUpError_7;
1584
- return __generator(this, function (_a) {
1585
- switch (_a.label) {
1586
- case 0:
1587
- if (!err) return [3 /*break*/, 5];
1588
- logger.debug('Failed to get the session from user', user);
1589
- if (!this.isSessionInvalid(err)) return [3 /*break*/, 4];
1590
- _a.label = 1;
1591
- case 1:
1592
- _a.trys.push([1, 3, , 4]);
1593
- return [4 /*yield*/, this.cleanUpInvalidSession(user)];
1594
- case 2:
1595
- _a.sent();
1596
- return [3 /*break*/, 4];
1597
- case 3:
1598
- cleanUpError_7 = _a.sent();
1599
- rej(new Error("Session is invalid due to: " + err.message + " and failed to clean up invalid session: " + cleanUpError_7.message));
1600
- return [2 /*return*/];
1601
- case 4:
1602
- rej(err);
1603
- return [2 /*return*/];
1604
- case 5:
1605
- logger.debug('Succeed to get the user session', session);
1606
- res(session);
1607
- return [2 /*return*/];
1608
- }
1609
- });
1610
- }); }, { clientMetadata: clientMetadata });
1611
- });
1617
+ return this._userSession({ user: user, bypassCache: false });
1612
1618
  };
1613
1619
  /**
1614
1620
  * Get authenticated credentials of current user.
@@ -1752,7 +1758,7 @@ var AuthClass = /** @class */ (function () {
1752
1758
  // we must validate the user as an authenticated user by using getSession
1753
1759
  var clientMetadata = _this._config.clientMetadata; // TODO: verify behavior if this is override during signIn
1754
1760
  user.getSession(function (err, result) { return __awaiter(_this, void 0, void 0, function () {
1755
- var cleanUpError_8;
1761
+ var cleanUpError_7;
1756
1762
  var _this = this;
1757
1763
  return __generator(this, function (_a) {
1758
1764
  switch (_a.label) {
@@ -1768,8 +1774,8 @@ var AuthClass = /** @class */ (function () {
1768
1774
  _a.sent();
1769
1775
  return [3 /*break*/, 4];
1770
1776
  case 3:
1771
- cleanUpError_8 = _a.sent();
1772
- rej(new Error("Session is invalid due to: " + err.message + " and failed to clean up invalid session: " + cleanUpError_8.message));
1777
+ cleanUpError_7 = _a.sent();
1778
+ rej(new Error("Session is invalid due to: " + err.message + " and failed to clean up invalid session: " + cleanUpError_7.message));
1773
1779
  return [2 /*return*/];
1774
1780
  case 4: return [2 /*return*/, rej(err)];
1775
1781
  case 5:
@@ -1810,7 +1816,7 @@ var AuthClass = /** @class */ (function () {
1810
1816
  });
1811
1817
  };
1812
1818
  AuthClass.prototype.oAuthSignOutRedirect = function (resolve, reject) {
1813
- var isBrowser = JS.browserOrNode().isBrowser;
1819
+ var isBrowser = browserOrNode().isBrowser;
1814
1820
  if (isBrowser) {
1815
1821
  this.oAuthSignOutRedirectOrReject(reject);
1816
1822
  }
@@ -1993,7 +1999,7 @@ var AuthClass = /** @class */ (function () {
1993
1999
  */
1994
2000
  AuthClass.prototype.currentUserInfo = function () {
1995
2001
  return __awaiter(this, void 0, void 0, function () {
1996
- var source, user, attributes, userAttrs, credentials, e_12, info, err_1, user;
2002
+ var source, user, attributes, userAttrs, credentials, e_12, info, err_2, user;
1997
2003
  return __generator(this, function (_a) {
1998
2004
  switch (_a.label) {
1999
2005
  case 0:
@@ -2034,8 +2040,8 @@ var AuthClass = /** @class */ (function () {
2034
2040
  };
2035
2041
  return [2 /*return*/, info];
2036
2042
  case 8:
2037
- err_1 = _a.sent();
2038
- logger.error('currentUserInfo error', err_1);
2043
+ err_2 = _a.sent();
2044
+ logger.error('currentUserInfo error', err_2);
2039
2045
  return [2 /*return*/, {}];
2040
2046
  case 9:
2041
2047
  if (source === 'federated') {
@@ -2116,7 +2122,7 @@ var AuthClass = /** @class */ (function () {
2116
2122
  */
2117
2123
  AuthClass.prototype._handleAuthResponse = function (URL) {
2118
2124
  return __awaiter(this, void 0, void 0, function () {
2119
- var currentUrl, hasCodeOrError, hasTokenOrError, _a, accessToken, idToken, refreshToken, state, session, credentials, isCustomStateIncluded, currentUser, customState, err_2;
2125
+ var currentUrl, hasCodeOrError, hasTokenOrError, _a, accessToken, idToken, refreshToken, state, session, credentials, isCustomStateIncluded, currentUser, customState, err_3;
2120
2126
  return __generator(this, function (_b) {
2121
2127
  switch (_b.label) {
2122
2128
  case 0:
@@ -2132,7 +2138,7 @@ var AuthClass = /** @class */ (function () {
2132
2138
  throw new Error("OAuth responses require a User Pool defined in config");
2133
2139
  }
2134
2140
  dispatchAuthEvent('parsingCallbackUrl', { url: URL }, "The callback url is being parsed");
2135
- currentUrl = URL || (JS.browserOrNode().isBrowser ? window.location.href : '');
2141
+ currentUrl = URL || (browserOrNode().isBrowser ? window.location.href : '');
2136
2142
  hasCodeOrError = !!(parse(currentUrl).query || '')
2137
2143
  .split('&')
2138
2144
  .map(function (entry) { return entry.split('='); })
@@ -2189,16 +2195,16 @@ var AuthClass = /** @class */ (function () {
2189
2195
  //#endregion
2190
2196
  return [2 /*return*/, credentials];
2191
2197
  case 6:
2192
- err_2 = _b.sent();
2193
- logger.debug('Error in cognito hosted auth response', err_2);
2198
+ err_3 = _b.sent();
2199
+ logger.debug('Error in cognito hosted auth response', err_3);
2194
2200
  // Just like a successful handling of `?code`, replace the window history to "dispose" of the `code`.
2195
2201
  // Otherwise, reloading the page will throw errors as the `code` has already been spent.
2196
2202
  if (window && typeof window.history !== 'undefined') {
2197
2203
  window.history.replaceState({}, null, this._config.oauth.redirectSignIn);
2198
2204
  }
2199
- dispatchAuthEvent('signIn_failure', err_2, "The OAuth response flow failed");
2200
- dispatchAuthEvent('cognitoHostedUI_failure', err_2, "A failure occurred when returning to the Cognito Hosted UI");
2201
- dispatchAuthEvent('customState_failure', err_2, "A failure occurred when returning state");
2205
+ dispatchAuthEvent('signIn_failure', err_3, "The OAuth response flow failed");
2206
+ dispatchAuthEvent('cognitoHostedUI_failure', err_3, "A failure occurred when returning to the Cognito Hosted UI");
2207
+ dispatchAuthEvent('customState_failure', err_3, "A failure occurred when returning state");
2202
2208
  return [3 /*break*/, 7];
2203
2209
  case 7: return [3 /*break*/, 9];
2204
2210
  case 8: