@azure/msal-common 14.3.0 → 14.4.1-beta.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.
Files changed (246) hide show
  1. package/dist/account/AccountInfo.d.ts +31 -31
  2. package/dist/account/AuthToken.d.ts +17 -17
  3. package/dist/account/AuthToken.mjs +58 -58
  4. package/dist/account/CcsCredential.d.ts +9 -9
  5. package/dist/account/CcsCredential.mjs +8 -8
  6. package/dist/account/ClientCredentials.d.ts +14 -14
  7. package/dist/account/ClientInfo.d.ts +19 -19
  8. package/dist/account/ClientInfo.mjs +37 -37
  9. package/dist/account/TokenClaims.d.ts +65 -65
  10. package/dist/authority/Authority.d.ts +249 -249
  11. package/dist/authority/Authority.d.ts.map +1 -1
  12. package/dist/authority/Authority.mjs +788 -789
  13. package/dist/authority/Authority.mjs.map +1 -1
  14. package/dist/authority/AuthorityFactory.d.ts +31 -31
  15. package/dist/authority/AuthorityFactory.mjs +47 -47
  16. package/dist/authority/AuthorityMetadata.d.ts +503 -503
  17. package/dist/authority/AuthorityMetadata.mjs +603 -603
  18. package/dist/authority/AuthorityOptions.d.ts +27 -27
  19. package/dist/authority/AuthorityOptions.mjs +18 -18
  20. package/dist/authority/AuthorityType.d.ts +10 -10
  21. package/dist/authority/AuthorityType.mjs +13 -13
  22. package/dist/authority/AzureRegion.d.ts +1 -1
  23. package/dist/authority/AzureRegionConfiguration.d.ts +5 -5
  24. package/dist/authority/CloudDiscoveryMetadata.d.ts +5 -5
  25. package/dist/authority/CloudInstanceDiscoveryErrorResponse.d.ts +13 -13
  26. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs +8 -8
  27. package/dist/authority/CloudInstanceDiscoveryResponse.d.ts +9 -9
  28. package/dist/authority/CloudInstanceDiscoveryResponse.mjs +8 -8
  29. package/dist/authority/ImdsOptions.d.ts +5 -5
  30. package/dist/authority/OIDCOptions.d.ts +8 -8
  31. package/dist/authority/OpenIdConfigResponse.d.ts +11 -11
  32. package/dist/authority/OpenIdConfigResponse.mjs +10 -10
  33. package/dist/authority/ProtocolMode.d.ts +8 -8
  34. package/dist/authority/ProtocolMode.mjs +11 -11
  35. package/dist/authority/RegionDiscovery.d.ts +32 -32
  36. package/dist/authority/RegionDiscovery.mjs +106 -106
  37. package/dist/authority/RegionDiscoveryMetadata.d.ts +6 -6
  38. package/dist/broker/nativeBroker/INativeBrokerPlugin.d.ts +15 -15
  39. package/dist/cache/CacheManager.d.ts +485 -480
  40. package/dist/cache/CacheManager.d.ts.map +1 -1
  41. package/dist/cache/CacheManager.mjs +1102 -1089
  42. package/dist/cache/CacheManager.mjs.map +1 -1
  43. package/dist/cache/entities/AccessTokenEntity.d.ts +25 -25
  44. package/dist/cache/entities/AccountEntity.d.ts +101 -101
  45. package/dist/cache/entities/AccountEntity.mjs +218 -218
  46. package/dist/cache/entities/AppMetadataEntity.d.ts +39 -39
  47. package/dist/cache/entities/AppMetadataEntity.mjs +66 -66
  48. package/dist/cache/entities/AuthorityMetadataEntity.d.ts +48 -48
  49. package/dist/cache/entities/AuthorityMetadataEntity.mjs +78 -78
  50. package/dist/cache/entities/CacheRecord.d.ts +14 -14
  51. package/dist/cache/entities/CacheRecord.mjs +14 -14
  52. package/dist/cache/entities/CredentialEntity.d.ts +30 -30
  53. package/dist/cache/entities/IdTokenEntity.d.ts +8 -8
  54. package/dist/cache/entities/RefreshTokenEntity.d.ts +7 -5
  55. package/dist/cache/entities/RefreshTokenEntity.d.ts.map +1 -1
  56. package/dist/cache/entities/ServerTelemetryEntity.d.ts +5 -12
  57. package/dist/cache/entities/ServerTelemetryEntity.d.ts.map +1 -1
  58. package/dist/cache/entities/ThrottlingEntity.d.ts +13 -13
  59. package/dist/cache/entities/ThrottlingEntity.mjs +23 -23
  60. package/dist/cache/interface/ICacheManager.d.ts +166 -166
  61. package/dist/cache/interface/ICachePlugin.d.ts +5 -5
  62. package/dist/cache/interface/ISerializableTokenCache.d.ts +4 -4
  63. package/dist/cache/persistence/TokenCacheContext.d.ts +23 -23
  64. package/dist/cache/persistence/TokenCacheContext.mjs +25 -25
  65. package/dist/cache/utils/CacheHelpers.d.ts +64 -58
  66. package/dist/cache/utils/CacheHelpers.d.ts.map +1 -1
  67. package/dist/cache/utils/CacheHelpers.mjs +236 -217
  68. package/dist/cache/utils/CacheHelpers.mjs.map +1 -1
  69. package/dist/cache/utils/CacheTypes.d.ts +67 -67
  70. package/dist/client/AuthorizationCodeClient.d.ts +74 -73
  71. package/dist/client/AuthorizationCodeClient.d.ts.map +1 -1
  72. package/dist/client/AuthorizationCodeClient.mjs +402 -408
  73. package/dist/client/AuthorizationCodeClient.mjs.map +1 -1
  74. package/dist/client/BaseClient.d.ts +51 -51
  75. package/dist/client/BaseClient.mjs +100 -100
  76. package/dist/client/RefreshTokenClient.d.ts +35 -35
  77. package/dist/client/RefreshTokenClient.d.ts.map +1 -1
  78. package/dist/client/RefreshTokenClient.mjs +193 -187
  79. package/dist/client/RefreshTokenClient.mjs.map +1 -1
  80. package/dist/client/SilentFlowClient.d.ts +27 -27
  81. package/dist/client/SilentFlowClient.d.ts.map +1 -1
  82. package/dist/client/SilentFlowClient.mjs +118 -116
  83. package/dist/client/SilentFlowClient.mjs.map +1 -1
  84. package/dist/config/AppTokenProvider.d.ts +38 -38
  85. package/dist/config/ClientConfiguration.d.ts +150 -150
  86. package/dist/config/ClientConfiguration.mjs +97 -97
  87. package/dist/crypto/ICrypto.d.ts +58 -58
  88. package/dist/crypto/ICrypto.d.ts.map +1 -1
  89. package/dist/crypto/ICrypto.mjs +30 -30
  90. package/dist/crypto/ICrypto.mjs.map +1 -1
  91. package/dist/crypto/IGuidGenerator.d.ts +4 -4
  92. package/dist/crypto/JoseHeader.d.ts +22 -22
  93. package/dist/crypto/JoseHeader.d.ts.map +1 -1
  94. package/dist/crypto/JoseHeader.mjs +38 -38
  95. package/dist/crypto/JoseHeader.mjs.map +1 -1
  96. package/dist/crypto/PopTokenGenerator.d.ts +60 -60
  97. package/dist/crypto/PopTokenGenerator.d.ts.map +1 -1
  98. package/dist/crypto/PopTokenGenerator.mjs +82 -82
  99. package/dist/crypto/PopTokenGenerator.mjs.map +1 -1
  100. package/dist/crypto/SignedHttpRequest.d.ts +15 -11
  101. package/dist/crypto/SignedHttpRequest.d.ts.map +1 -1
  102. package/dist/error/AuthError.d.ts +44 -44
  103. package/dist/error/AuthError.mjs +46 -46
  104. package/dist/error/AuthErrorCodes.d.ts +5 -5
  105. package/dist/error/AuthErrorCodes.mjs +9 -9
  106. package/dist/error/ClientAuthError.d.ts +237 -237
  107. package/dist/error/ClientAuthError.mjs +249 -249
  108. package/dist/error/ClientAuthErrorCodes.d.ts +44 -44
  109. package/dist/error/ClientAuthErrorCodes.mjs +48 -48
  110. package/dist/error/ClientConfigurationError.d.ts +128 -128
  111. package/dist/error/ClientConfigurationError.mjs +135 -135
  112. package/dist/error/ClientConfigurationErrorCodes.d.ts +22 -22
  113. package/dist/error/ClientConfigurationErrorCodes.mjs +26 -26
  114. package/dist/error/InteractionRequiredAuthError.d.ts +57 -57
  115. package/dist/error/InteractionRequiredAuthError.d.ts.map +1 -1
  116. package/dist/error/InteractionRequiredAuthError.mjs +78 -77
  117. package/dist/error/InteractionRequiredAuthError.mjs.map +1 -1
  118. package/dist/error/InteractionRequiredAuthErrorCodes.d.ts +6 -5
  119. package/dist/error/InteractionRequiredAuthErrorCodes.d.ts.map +1 -1
  120. package/dist/error/InteractionRequiredAuthErrorCodes.mjs +13 -12
  121. package/dist/error/InteractionRequiredAuthErrorCodes.mjs.map +1 -1
  122. package/dist/error/JoseHeaderError.d.ts +15 -15
  123. package/dist/error/JoseHeaderError.mjs +22 -22
  124. package/dist/error/JoseHeaderErrorCodes.d.ts +2 -2
  125. package/dist/error/JoseHeaderErrorCodes.mjs +6 -6
  126. package/dist/error/ServerError.d.ts +7 -7
  127. package/dist/error/ServerError.mjs +14 -14
  128. package/dist/index.cjs +8300 -8350
  129. package/dist/index.cjs.map +1 -1
  130. package/dist/index.d.ts +98 -97
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.mjs +4 -3
  133. package/dist/index.mjs.map +1 -1
  134. package/dist/logger/Logger.d.ts +95 -95
  135. package/dist/logger/Logger.mjs +188 -188
  136. package/dist/network/INetworkModule.d.ts +29 -29
  137. package/dist/network/INetworkModule.mjs +12 -12
  138. package/dist/network/NetworkManager.d.ts +33 -33
  139. package/dist/network/NetworkManager.mjs +34 -34
  140. package/dist/network/RequestThumbprint.d.ts +18 -16
  141. package/dist/network/RequestThumbprint.d.ts.map +1 -1
  142. package/dist/network/ThrottlingUtils.d.ts +42 -42
  143. package/dist/network/ThrottlingUtils.mjs +95 -95
  144. package/dist/packageMetadata.d.ts +2 -2
  145. package/dist/packageMetadata.mjs +4 -4
  146. package/dist/request/AuthenticationHeaderParser.d.ts +19 -19
  147. package/dist/request/AuthenticationHeaderParser.mjs +55 -55
  148. package/dist/request/BaseAuthRequest.d.ts +43 -40
  149. package/dist/request/BaseAuthRequest.d.ts.map +1 -1
  150. package/dist/request/CommonAuthorizationCodeRequest.d.ts +27 -27
  151. package/dist/request/CommonAuthorizationUrlRequest.d.ts +50 -50
  152. package/dist/request/CommonClientCredentialRequest.d.ts +17 -17
  153. package/dist/request/CommonDeviceCodeRequest.d.ts +21 -21
  154. package/dist/request/CommonEndSessionRequest.d.ts +21 -21
  155. package/dist/request/CommonOnBehalfOfRequest.d.ts +13 -13
  156. package/dist/request/CommonRefreshTokenRequest.d.ts +23 -22
  157. package/dist/request/CommonRefreshTokenRequest.d.ts.map +1 -1
  158. package/dist/request/CommonSilentFlowRequest.d.ts +21 -20
  159. package/dist/request/CommonSilentFlowRequest.d.ts.map +1 -1
  160. package/dist/request/CommonUsernamePasswordRequest.d.ts +17 -17
  161. package/dist/request/NativeRequest.d.ts +19 -19
  162. package/dist/request/NativeSignOutRequest.d.ts +5 -5
  163. package/dist/request/RequestParameterBuilder.d.ts +217 -217
  164. package/dist/request/RequestParameterBuilder.mjs +381 -381
  165. package/dist/request/RequestValidator.d.ts +33 -33
  166. package/dist/request/RequestValidator.mjs +81 -81
  167. package/dist/request/ScopeSet.d.ts +88 -88
  168. package/dist/request/ScopeSet.mjs +197 -197
  169. package/dist/request/StoreInCache.d.ts +8 -8
  170. package/dist/response/AuthenticationResult.d.ts +41 -41
  171. package/dist/response/AuthorizationCodePayload.d.ts +13 -13
  172. package/dist/response/DeviceCodeResponse.d.ts +25 -25
  173. package/dist/response/ExternalTokenResponse.d.ts +15 -15
  174. package/dist/response/IMDSBadResponse.d.ts +4 -4
  175. package/dist/response/ResponseHandler.d.ts +67 -67
  176. package/dist/response/ResponseHandler.d.ts.map +1 -1
  177. package/dist/response/ResponseHandler.mjs +312 -312
  178. package/dist/response/ResponseHandler.mjs.map +1 -1
  179. package/dist/response/ServerAuthorizationCodeResponse.d.ts +25 -25
  180. package/dist/response/ServerAuthorizationTokenResponse.d.ts +46 -46
  181. package/dist/telemetry/performance/IPerformanceClient.d.ts +51 -51
  182. package/dist/telemetry/performance/IPerformanceMeasurement.d.ts +5 -5
  183. package/dist/telemetry/performance/PerformanceClient.d.ts +191 -191
  184. package/dist/telemetry/performance/PerformanceClient.mjs +409 -409
  185. package/dist/telemetry/performance/PerformanceEvent.d.ts +464 -457
  186. package/dist/telemetry/performance/PerformanceEvent.d.ts.map +1 -1
  187. package/dist/telemetry/performance/PerformanceEvent.mjs +253 -249
  188. package/dist/telemetry/performance/PerformanceEvent.mjs.map +1 -1
  189. package/dist/telemetry/performance/StubPerformanceClient.d.ts +24 -24
  190. package/dist/telemetry/performance/StubPerformanceClient.mjs +76 -76
  191. package/dist/telemetry/server/ServerTelemetryManager.d.ts +66 -66
  192. package/dist/telemetry/server/ServerTelemetryManager.d.ts.map +1 -1
  193. package/dist/telemetry/server/ServerTelemetryManager.mjs +201 -198
  194. package/dist/telemetry/server/ServerTelemetryManager.mjs.map +1 -1
  195. package/dist/telemetry/server/ServerTelemetryRequest.d.ts +8 -8
  196. package/dist/url/IUri.d.ts +12 -12
  197. package/dist/url/UrlString.d.ts +48 -83
  198. package/dist/url/UrlString.d.ts.map +1 -1
  199. package/dist/url/UrlString.mjs +163 -282
  200. package/dist/url/UrlString.mjs.map +1 -1
  201. package/dist/utils/Constants.d.ts +365 -366
  202. package/dist/utils/Constants.d.ts.map +1 -1
  203. package/dist/utils/Constants.mjs +376 -377
  204. package/dist/utils/Constants.mjs.map +1 -1
  205. package/dist/utils/FunctionWrappers.d.ts +27 -27
  206. package/dist/utils/FunctionWrappers.mjs +84 -84
  207. package/dist/utils/MsalTypes.d.ts +6 -6
  208. package/dist/utils/ProtocolUtils.d.ts +42 -42
  209. package/dist/utils/ProtocolUtils.mjs +69 -69
  210. package/dist/utils/StringUtils.d.ts +40 -40
  211. package/dist/utils/StringUtils.mjs +95 -95
  212. package/dist/utils/TimeUtils.d.ts +27 -27
  213. package/dist/utils/TimeUtils.mjs +45 -45
  214. package/dist/utils/UrlUtils.d.ts +11 -0
  215. package/dist/utils/UrlUtils.d.ts.map +1 -0
  216. package/dist/utils/UrlUtils.mjs +52 -0
  217. package/dist/utils/UrlUtils.mjs.map +1 -0
  218. package/package.json +92 -92
  219. package/src/authority/Authority.ts +2 -3
  220. package/src/cache/CacheManager.ts +63 -22
  221. package/src/cache/entities/RefreshTokenEntity.ts +3 -1
  222. package/src/cache/entities/ServerTelemetryEntity.ts +2 -30
  223. package/src/cache/utils/CacheHelpers.ts +27 -1
  224. package/src/client/AuthorizationCodeClient.ts +5 -14
  225. package/src/client/RefreshTokenClient.ts +20 -2
  226. package/src/client/SilentFlowClient.ts +8 -4
  227. package/src/crypto/ICrypto.ts +7 -2
  228. package/src/crypto/JoseHeader.ts +4 -4
  229. package/src/crypto/PopTokenGenerator.ts +2 -0
  230. package/src/crypto/SignedHttpRequest.ts +6 -0
  231. package/src/error/InteractionRequiredAuthError.ts +2 -0
  232. package/src/error/InteractionRequiredAuthErrorCodes.ts +1 -0
  233. package/src/index.ts +3 -1
  234. package/src/network/RequestThumbprint.ts +2 -0
  235. package/src/packageMetadata.ts +1 -1
  236. package/src/request/BaseAuthRequest.ts +3 -0
  237. package/src/request/CommonRefreshTokenRequest.ts +1 -0
  238. package/src/request/CommonSilentFlowRequest.ts +1 -0
  239. package/src/response/ResponseHandler.ts +8 -4
  240. package/src/telemetry/performance/PerformanceEvent.ts +12 -1
  241. package/src/telemetry/server/ServerTelemetryManager.ts +12 -6
  242. package/src/url/UrlString.ts +6 -153
  243. package/src/utils/Constants.ts +3 -3
  244. package/src/utils/UrlUtils.ts +60 -0
  245. package/dist/cache/entities/ServerTelemetryEntity.mjs +0 -34
  246. package/dist/cache/entities/ServerTelemetryEntity.mjs.map +0 -1
@@ -46,6 +46,7 @@ import { StoreInCache } from "../request/StoreInCache";
46
46
  import { getAliasesFromStaticSources } from "../authority/AuthorityMetadata";
47
47
  import { StaticAuthorityOptions } from "../authority/AuthorityOptions";
48
48
  import { TokenClaims } from "../account/TokenClaims";
49
+ import { IPerformanceClient } from "../telemetry/performance/IPerformanceClient";
49
50
 
50
51
  /**
51
52
  * Interface class which implement cache storage functions used by MSAL to perform validity checks, and store tokens.
@@ -876,29 +877,40 @@ export abstract class CacheManager implements ICacheManager {
876
877
 
877
878
  /**
878
879
  * Retrieve the cached credentials into a cacherecord
879
- * @param account
880
- * @param clientId
881
- * @param scopes
882
- * @param environment
883
- * @param authScheme
880
+ * @param account {AccountInfo}
881
+ * @param request {BaseAuthRequest}
882
+ * @param environment {string}
883
+ * @param performanceClient {?IPerformanceClient}
884
+ * @param correlationId {?string}
884
885
  */
885
886
  readCacheRecord(
886
887
  account: AccountInfo,
887
888
  request: BaseAuthRequest,
888
- environment: string
889
+ environment: string,
890
+ performanceClient?: IPerformanceClient,
891
+ correlationId?: string
889
892
  ): CacheRecord {
890
893
  const tokenKeys = this.getTokenKeys();
891
894
  const cachedAccount = this.readAccountFromCache(account);
892
- const cachedIdToken = this.getIdToken(account, tokenKeys);
895
+ const cachedIdToken = this.getIdToken(
896
+ account,
897
+ tokenKeys,
898
+ performanceClient,
899
+ correlationId
900
+ );
893
901
  const cachedAccessToken = this.getAccessToken(
894
902
  account,
895
903
  request,
896
- tokenKeys
904
+ tokenKeys,
905
+ performanceClient,
906
+ correlationId
897
907
  );
898
908
  const cachedRefreshToken = this.getRefreshToken(
899
909
  account,
900
910
  false,
901
- tokenKeys
911
+ tokenKeys,
912
+ performanceClient,
913
+ correlationId
902
914
  );
903
915
  const cachedAppMetadata = this.readAppMetadataFromCache(environment);
904
916
 
@@ -930,13 +942,16 @@ export abstract class CacheManager implements ICacheManager {
930
942
 
931
943
  /**
932
944
  * Retrieve IdTokenEntity from cache
933
- * @param clientId
934
- * @param account
935
- * @param inputRealm
945
+ * @param account {AccountInfo}
946
+ * @param tokenKeys {?TokenKeys}
947
+ * @param performanceClient {?IPerformanceClient}
948
+ * @param correlationId {?string}
936
949
  */
937
950
  getIdToken(
938
951
  account: AccountInfo,
939
- tokenKeys?: TokenKeys
952
+ tokenKeys?: TokenKeys,
953
+ performanceClient?: IPerformanceClient,
954
+ correlationId?: string
940
955
  ): IdTokenEntity | null {
941
956
  this.commonLogger.trace("CacheManager - getIdToken called");
942
957
  const idTokenFilter: CredentialFilter = {
@@ -963,6 +978,12 @@ export abstract class CacheManager implements ICacheManager {
963
978
  idTokens.forEach((idToken) => {
964
979
  this.removeIdToken(generateCredentialKey(idToken));
965
980
  });
981
+ if (performanceClient && correlationId) {
982
+ performanceClient.addFields(
983
+ { multiMatchedID: idTokens.length },
984
+ correlationId
985
+ );
986
+ }
966
987
  return null;
967
988
  }
968
989
 
@@ -1047,15 +1068,18 @@ export abstract class CacheManager implements ICacheManager {
1047
1068
 
1048
1069
  /**
1049
1070
  * Retrieve AccessTokenEntity from cache
1050
- * @param clientId
1051
- * @param account
1052
- * @param scopes
1053
- * @param authScheme
1071
+ * @param account {AccountInfo}
1072
+ * @param request {BaseAuthRequest}
1073
+ * @param tokenKeys {?TokenKeys}
1074
+ * @param performanceClient {?IPerformanceClient}
1075
+ * @param correlationId {?string}
1054
1076
  */
1055
1077
  getAccessToken(
1056
1078
  account: AccountInfo,
1057
1079
  request: BaseAuthRequest,
1058
- tokenKeys?: TokenKeys
1080
+ tokenKeys?: TokenKeys,
1081
+ performanceClient?: IPerformanceClient,
1082
+ correlationId?: string
1059
1083
  ): AccessTokenEntity | null {
1060
1084
  this.commonLogger.trace("CacheManager - getAccessToken called");
1061
1085
  const scopes = ScopeSet.createSearchScopes(request.scopes);
@@ -1119,6 +1143,12 @@ export abstract class CacheManager implements ICacheManager {
1119
1143
  accessTokens.forEach((accessToken) => {
1120
1144
  void this.removeAccessToken(generateCredentialKey(accessToken));
1121
1145
  });
1146
+ if (performanceClient && correlationId) {
1147
+ performanceClient.addFields(
1148
+ { multiMatchedAT: accessTokens.length },
1149
+ correlationId
1150
+ );
1151
+ }
1122
1152
  return null;
1123
1153
  }
1124
1154
 
@@ -1216,14 +1246,18 @@ export abstract class CacheManager implements ICacheManager {
1216
1246
 
1217
1247
  /**
1218
1248
  * Helper to retrieve the appropriate refresh token from cache
1219
- * @param clientId
1220
- * @param account
1221
- * @param familyRT
1249
+ * @param account {AccountInfo}
1250
+ * @param familyRT {boolean}
1251
+ * @param tokenKeys {?TokenKeys}
1252
+ * @param performanceClient {?IPerformanceClient}
1253
+ * @param correlationId {?string}
1222
1254
  */
1223
1255
  getRefreshToken(
1224
1256
  account: AccountInfo,
1225
1257
  familyRT: boolean,
1226
- tokenKeys?: TokenKeys
1258
+ tokenKeys?: TokenKeys,
1259
+ performanceClient?: IPerformanceClient,
1260
+ correlationId?: string
1227
1261
  ): RefreshTokenEntity | null {
1228
1262
  this.commonLogger.trace("CacheManager - getRefreshToken called");
1229
1263
  const id = familyRT ? THE_FAMILY_ID : undefined;
@@ -1266,6 +1300,13 @@ export abstract class CacheManager implements ICacheManager {
1266
1300
  }
1267
1301
  // address the else case after remove functions address environment aliases
1268
1302
 
1303
+ if (numRefreshTokens > 1 && performanceClient && correlationId) {
1304
+ performanceClient.addFields(
1305
+ { multiMatchedRT: numRefreshTokens },
1306
+ correlationId
1307
+ );
1308
+ }
1309
+
1269
1310
  this.commonLogger.info(
1270
1311
  "CacheManager:getRefreshToken - returning refresh token"
1271
1312
  );
@@ -8,4 +8,6 @@ import { CredentialEntity } from "./CredentialEntity";
8
8
  /**
9
9
  * Refresh Token Cache Type
10
10
  */
11
- export type RefreshTokenEntity = CredentialEntity;
11
+ export type RefreshTokenEntity = CredentialEntity & {
12
+ expiresOn?: string;
13
+ };
@@ -3,36 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { SERVER_TELEM_CONSTANTS } from "../../utils/Constants";
7
-
8
- export class ServerTelemetryEntity {
6
+ export type ServerTelemetryEntity = {
9
7
  failedRequests: Array<string | number>;
10
8
  errors: string[];
11
9
  cacheHits: number;
12
-
13
- constructor() {
14
- this.failedRequests = [];
15
- this.errors = [];
16
- this.cacheHits = 0;
17
- }
18
-
19
- /**
20
- * validates if a given cache entry is "Telemetry", parses <key,value>
21
- * @param key
22
- * @param entity
23
- */
24
- static isServerTelemetryEntity(key: string, entity?: object): boolean {
25
- const validateKey: boolean =
26
- key.indexOf(SERVER_TELEM_CONSTANTS.CACHE_KEY) === 0;
27
- let validateEntity: boolean = true;
28
-
29
- if (entity) {
30
- validateEntity =
31
- entity.hasOwnProperty("failedRequests") &&
32
- entity.hasOwnProperty("errors") &&
33
- entity.hasOwnProperty("cacheHits");
34
- }
35
-
36
- return validateKey && validateEntity;
37
- }
38
- }
10
+ };
@@ -12,6 +12,7 @@ import {
12
12
  import {
13
13
  AuthenticationScheme,
14
14
  CredentialType,
15
+ SERVER_TELEM_CONSTANTS,
15
16
  Separators,
16
17
  } from "../../utils/Constants";
17
18
  import { TimeUtils } from "../../utils/TimeUtils";
@@ -167,7 +168,8 @@ export function createRefreshTokenEntity(
167
168
  refreshToken: string,
168
169
  clientId: string,
169
170
  familyId?: string,
170
- userAssertionHash?: string
171
+ userAssertionHash?: string,
172
+ expiresOn?: string
171
173
  ): RefreshTokenEntity {
172
174
  const rtEntity: RefreshTokenEntity = {
173
175
  credentialType: CredentialType.REFRESH_TOKEN,
@@ -185,6 +187,10 @@ export function createRefreshTokenEntity(
185
187
  rtEntity.familyId = familyId;
186
188
  }
187
189
 
190
+ if (expiresOn) {
191
+ rtEntity.expiresOn = expiresOn;
192
+ }
193
+
188
194
  return rtEntity;
189
195
  }
190
196
 
@@ -304,3 +310,23 @@ function generateScheme(credentialEntity: CredentialEntity): string {
304
310
  ? credentialEntity.tokenType.toLowerCase()
305
311
  : "";
306
312
  }
313
+
314
+ /**
315
+ * validates if a given cache entry is "Telemetry", parses <key,value>
316
+ * @param key
317
+ * @param entity
318
+ */
319
+ export function isServerTelemetryEntity(key: string, entity?: object): boolean {
320
+ const validateKey: boolean =
321
+ key.indexOf(SERVER_TELEM_CONSTANTS.CACHE_KEY) === 0;
322
+ let validateEntity: boolean = true;
323
+
324
+ if (entity) {
325
+ validateEntity =
326
+ entity.hasOwnProperty("failedRequests") &&
327
+ entity.hasOwnProperty("errors") &&
328
+ entity.hasOwnProperty("cacheHits");
329
+ }
330
+
331
+ return validateKey && validateEntity;
332
+ }
@@ -161,7 +161,8 @@ export class AuthorizationCodeClient extends BaseClient {
161
161
  undefined,
162
162
  undefined,
163
163
  undefined,
164
- requestId
164
+ requestId,
165
+ (TimeUtils.nowSeconds() + 24 * 60 * 60).toString()
165
166
  );
166
167
  }
167
168
 
@@ -171,7 +172,7 @@ export class AuthorizationCodeClient extends BaseClient {
171
172
  * @param hashFragment
172
173
  */
173
174
  handleFragmentResponse(
174
- hashFragment: string,
175
+ serverParams: ServerAuthorizationCodeResponse,
175
176
  cachedState: string
176
177
  ): AuthorizationCodePayload {
177
178
  // Handle responses.
@@ -184,13 +185,6 @@ export class AuthorizationCodeClient extends BaseClient {
184
185
  null
185
186
  );
186
187
 
187
- const serverParams: ServerAuthorizationCodeResponse =
188
- UrlString.getDeserializedCodeResponse(
189
- this.config.authOptions.authority.options.OIDCOptions
190
- ?.serverResponseType,
191
- hashFragment
192
- );
193
-
194
188
  // Get code response
195
189
  responseHandler.validateServerAuthorizationCodeResponse(
196
190
  serverParams,
@@ -203,11 +197,8 @@ export class AuthorizationCodeClient extends BaseClient {
203
197
  ClientAuthErrorCodes.authorizationCodeMissingFromServerResponse
204
198
  );
205
199
  }
206
- return {
207
- ...serverParams,
208
- // Code param is optional in ServerAuthorizationCodeResponse but required in AuthorizationCodePaylod
209
- code: serverParams.code,
210
- };
200
+
201
+ return serverParams as AuthorizationCodePayload;
211
202
  }
212
203
 
213
204
  /**
@@ -102,7 +102,8 @@ export class RefreshTokenClient extends BaseClient {
102
102
  undefined,
103
103
  true,
104
104
  request.forceCache,
105
- requestId
105
+ requestId,
106
+ request.expiresOn
106
107
  );
107
108
  }
108
109
 
@@ -202,13 +203,29 @@ export class RefreshTokenClient extends BaseClient {
202
203
  this.logger,
203
204
  this.performanceClient,
204
205
  request.correlationId
205
- )(request.account, foci);
206
+ )(
207
+ request.account,
208
+ foci,
209
+ undefined,
210
+ this.performanceClient,
211
+ request.correlationId
212
+ );
206
213
 
207
214
  if (!refreshToken) {
208
215
  throw createInteractionRequiredAuthError(
209
216
  InteractionRequiredAuthErrorCodes.noTokensFound
210
217
  );
211
218
  }
219
+
220
+ if (
221
+ request.enableRTExpiryCheck &&
222
+ refreshToken.expiresOn &&
223
+ Number(refreshToken.expiresOn) < TimeUtils.nowSeconds() + 5 * 60
224
+ ) {
225
+ throw createInteractionRequiredAuthError(
226
+ InteractionRequiredAuthErrorCodes.refreshTokenExpired
227
+ );
228
+ }
212
229
  // attach cached RT size to the current measurement
213
230
 
214
231
  const refreshTokenRequest: CommonRefreshTokenRequest = {
@@ -220,6 +237,7 @@ export class RefreshTokenClient extends BaseClient {
220
237
  credential: request.account.homeAccountId,
221
238
  type: CcsCredentialType.HOME_ACCOUNT_ID,
222
239
  },
240
+ expiresOn: refreshToken.expiresOn,
223
241
  };
224
242
 
225
243
  return invokeAsync(
@@ -124,7 +124,9 @@ export class SilentFlowClient extends BaseClient {
124
124
  const cacheRecord = this.cacheManager.readCacheRecord(
125
125
  request.account,
126
126
  request,
127
- environment
127
+ environment,
128
+ this.performanceClient,
129
+ request.correlationId
128
130
  );
129
131
 
130
132
  if (!cacheRecord.accessToken) {
@@ -190,9 +192,11 @@ export class SilentFlowClient extends BaseClient {
190
192
  },
191
193
  correlationId
192
194
  );
193
- this.logger.info(
194
- `Token refresh is required due to cache outcome: ${cacheOutcome}`
195
- );
195
+ if (cacheOutcome !== CacheOutcome.NOT_APPLICABLE) {
196
+ this.logger.info(
197
+ `Token refresh is required due to cache outcome: ${cacheOutcome}`
198
+ );
199
+ }
196
200
  }
197
201
 
198
202
  /**
@@ -8,7 +8,7 @@ import {
8
8
  createClientAuthError,
9
9
  } from "../error/ClientAuthError";
10
10
  import { BaseAuthRequest } from "../request/BaseAuthRequest";
11
- import { SignedHttpRequest } from "./SignedHttpRequest";
11
+ import { ShrOptions, SignedHttpRequest } from "./SignedHttpRequest";
12
12
 
13
13
  /**
14
14
  * The PkceCodes type describes the structure
@@ -22,7 +22,11 @@ export type PkceCodes = {
22
22
 
23
23
  export type SignedHttpRequestParameters = Pick<
24
24
  BaseAuthRequest,
25
- "resourceRequestMethod" | "resourceRequestUri" | "shrClaims" | "shrNonce"
25
+ | "resourceRequestMethod"
26
+ | "resourceRequestUri"
27
+ | "shrClaims"
28
+ | "shrNonce"
29
+ | "shrOptions"
26
30
  > & {
27
31
  correlationId?: string;
28
32
  };
@@ -68,6 +72,7 @@ export interface ICrypto {
68
72
  signJwt(
69
73
  payload: SignedHttpRequest,
70
74
  kid: string,
75
+ shrOptions?: ShrOptions,
71
76
  correlationId?: string
72
77
  ): Promise<string>;
73
78
  /**
@@ -7,17 +7,17 @@ import {
7
7
  JoseHeaderErrorCodes,
8
8
  createJoseHeaderError,
9
9
  } from "../error/JoseHeaderError";
10
- import { JsonTypes } from "../utils/Constants";
10
+ import { JsonWebTokenTypes } from "../utils/Constants";
11
11
 
12
12
  export type JoseHeaderOptions = {
13
- typ?: JsonTypes;
13
+ typ?: JsonWebTokenTypes;
14
14
  alg?: string;
15
15
  kid?: string;
16
16
  };
17
17
 
18
18
  /** @internal */
19
19
  export class JoseHeader {
20
- public typ?: JsonTypes;
20
+ public typ?: JsonWebTokenTypes;
21
21
  public alg?: string;
22
22
  public kid?: string;
23
23
 
@@ -48,7 +48,7 @@ export class JoseHeader {
48
48
 
49
49
  const shrHeader = new JoseHeader({
50
50
  // Access Token PoP headers must have type pop, but the type header can be overriden for special cases
51
- typ: shrHeaderOptions.typ || JsonTypes.Pop,
51
+ typ: shrHeaderOptions.typ || JsonWebTokenTypes.Pop,
52
52
  kid: shrHeaderOptions.kid,
53
53
  alg: shrHeaderOptions.alg,
54
54
  });
@@ -133,6 +133,7 @@ export class PopTokenGenerator {
133
133
  resourceRequestUri,
134
134
  shrClaims,
135
135
  shrNonce,
136
+ shrOptions,
136
137
  } = request;
137
138
 
138
139
  const resourceUrlString = resourceRequestUri
@@ -154,6 +155,7 @@ export class PopTokenGenerator {
154
155
  ...claims,
155
156
  },
156
157
  keyId,
158
+ shrOptions,
157
159
  request.correlationId
158
160
  );
159
161
  }
@@ -3,6 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import { JoseHeaderOptions } from "./JoseHeader";
7
+
6
8
  export type SignedHttpRequest = {
7
9
  at?: string;
8
10
  cnf?: object;
@@ -14,3 +16,7 @@ export type SignedHttpRequest = {
14
16
  nonce?: string;
15
17
  client_claims?: string;
16
18
  };
19
+
20
+ export type ShrOptions = {
21
+ header: JoseHeaderOptions;
22
+ };
@@ -28,6 +28,8 @@ export const InteractionRequiredAuthSubErrorMessage = [
28
28
  const InteractionRequiredAuthErrorMessages = {
29
29
  [InteractionRequiredAuthErrorCodes.noTokensFound]:
30
30
  "No refresh token found in the cache. Please sign-in.",
31
+ [InteractionRequiredAuthErrorCodes.refreshTokenExpired]:
32
+ "Refresh token has expired.",
31
33
  [InteractionRequiredAuthErrorCodes.nativeAccountUnavailable]:
32
34
  "The requested account is not available in the native broker. It may have been deleted or logged out. Please sign-in again using an interactive API.",
33
35
  };
@@ -6,6 +6,7 @@
6
6
  // Codes defined by MSAL
7
7
  export const noTokensFound = "no_tokens_found";
8
8
  export const nativeAccountUnavailable = "native_account_unavailable";
9
+ export const refreshTokenExpired = "refresh_token_expired";
9
10
 
10
11
  // Codes potentially returned by server
11
12
  export const interactionRequired = "interaction_required";
package/src/index.ts CHANGED
@@ -105,7 +105,7 @@ export {
105
105
  DEFAULT_CRYPTO_IMPLEMENTATION,
106
106
  SignedHttpRequestParameters,
107
107
  } from "./crypto/ICrypto";
108
- export { SignedHttpRequest } from "./crypto/SignedHttpRequest";
108
+ export { SignedHttpRequest, ShrOptions } from "./crypto/SignedHttpRequest";
109
109
  export { IGuidGenerator } from "./crypto/IGuidGenerator";
110
110
  export { JoseHeader } from "./crypto/JoseHeader";
111
111
  // Request
@@ -193,6 +193,7 @@ export {
193
193
  GrantType,
194
194
  AADAuthorityConstants,
195
195
  HttpStatus,
196
+ JsonWebTokenTypes,
196
197
  } from "./utils/Constants";
197
198
  export { StringUtils } from "./utils/StringUtils";
198
199
  export { StringDict } from "./utils/MsalTypes";
@@ -202,6 +203,7 @@ export {
202
203
  LibraryStateObject,
203
204
  } from "./utils/ProtocolUtils";
204
205
  export { TimeUtils } from "./utils/TimeUtils";
206
+ export * as UrlUtils from "./utils/UrlUtils";
205
207
  export * from "./utils/FunctionWrappers";
206
208
  // Server Telemetry
207
209
  export { ServerTelemetryManager } from "./telemetry/server/ServerTelemetryManager";
@@ -3,6 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import { ShrOptions } from "../crypto/SignedHttpRequest";
6
7
  import { AuthenticationScheme } from "../utils/Constants";
7
8
 
8
9
  /**
@@ -19,4 +20,5 @@ export type RequestThumbprint = {
19
20
  resourceRequestUri?: string;
20
21
  shrClaims?: string;
21
22
  sshKid?: string;
23
+ shrOptions?: ShrOptions;
22
24
  };
@@ -1,3 +1,3 @@
1
1
  /* eslint-disable header/header */
2
2
  export const name = "@azure/msal-common";
3
- export const version = "14.3.0";
3
+ export const version = "14.4.0";
@@ -7,6 +7,7 @@ import { AuthenticationScheme } from "../utils/Constants";
7
7
  import { AzureCloudOptions } from "../config/ClientConfiguration";
8
8
  import { StringDict } from "../utils/MsalTypes";
9
9
  import { StoreInCache } from "./StoreInCache";
10
+ import { ShrOptions } from "../crypto/SignedHttpRequest";
10
11
 
11
12
  /**
12
13
  * BaseAuthRequest
@@ -17,6 +18,7 @@ import { StoreInCache } from "./StoreInCache";
17
18
  * - claims - A stringified claims request which will be added to all /authorize and /token calls
18
19
  * - shrClaims - A stringified claims object which will be added to a Signed HTTP Request
19
20
  * - shrNonce - A server-generated timestamp that has been encrypted and base64URL encoded, which will be added to a Signed HTTP Request.
21
+ * - shrOptions - An object containing options for the Signed HTTP Request
20
22
  * - resourceRequestMethod - HTTP Request type used to request data from the resource (i.e. "GET", "POST", etc.). Used for proof-of-possession flows.
21
23
  * - resourceRequestUri - URI that token will be used for. Used for proof-of-possession flows.
22
24
  * - sshJwk - A stringified JSON Web Key representing a public key that can be signed by an SSH certificate.
@@ -34,6 +36,7 @@ export type BaseAuthRequest = {
34
36
  claims?: string;
35
37
  shrClaims?: string;
36
38
  shrNonce?: string;
39
+ shrOptions?: ShrOptions;
37
40
  resourceRequestMethod?: string;
38
41
  resourceRequestUri?: string;
39
42
  sshJwk?: string;
@@ -21,6 +21,7 @@ import { StringDict } from "../utils/MsalTypes";
21
21
  */
22
22
  export type CommonRefreshTokenRequest = BaseAuthRequest & {
23
23
  refreshToken: string;
24
+ expiresOn?: string;
24
25
  ccsCredential?: CcsCredential;
25
26
  forceCache?: boolean;
26
27
  tokenBodyParameters?: StringDict;
@@ -23,4 +23,5 @@ export type CommonSilentFlowRequest = BaseAuthRequest & {
23
23
  account: AccountInfo;
24
24
  forceRefresh: boolean;
25
25
  tokenBodyParameters?: StringDict;
26
+ enableRTExpiryCheck?: boolean;
26
27
  };
@@ -245,7 +245,8 @@ export class ResponseHandler {
245
245
  userAssertionHash?: string,
246
246
  handlingRefreshTokenResponse?: boolean,
247
247
  forceCacheRefreshTokenResponse?: boolean,
248
- serverRequestId?: string
248
+ serverRequestId?: string,
249
+ rtExpiresOn?: string
249
250
  ): Promise<AuthenticationResult> {
250
251
  this.performanceClient?.addQueueMeasurement(
251
252
  PerformanceEvents.HandleServerTokenResponse,
@@ -311,7 +312,8 @@ export class ResponseHandler {
311
312
  request,
312
313
  idTokenClaims,
313
314
  userAssertionHash,
314
- authCodePayload
315
+ authCodePayload,
316
+ rtExpiresOn
315
317
  );
316
318
  let cacheContext;
317
319
  try {
@@ -397,7 +399,8 @@ export class ResponseHandler {
397
399
  request: BaseAuthRequest,
398
400
  idTokenClaims?: TokenClaims,
399
401
  userAssertionHash?: string,
400
- authCodePayload?: AuthorizationCodePayload
402
+ authCodePayload?: AuthorizationCodePayload,
403
+ rtExpiresOn?: string
401
404
  ): CacheRecord {
402
405
  const env = authority.getPreferredCache();
403
406
  if (!env) {
@@ -491,7 +494,8 @@ export class ResponseHandler {
491
494
  serverTokenResponse.refresh_token,
492
495
  this.clientId,
493
496
  serverTokenResponse.foci,
494
- userAssertionHash
497
+ userAssertionHash,
498
+ rtExpiresOn
495
499
  );
496
500
  }
497
501
 
@@ -208,7 +208,7 @@ export const PerformanceEvents = {
208
208
  * Functions from InteractionHandler (msal-browser)
209
209
  */
210
210
  HandleCodeResponseFromServer: "handleCodeResponseFromServer",
211
- HandleCodeResponseFromHash: "handleCodeResponseFromHash",
211
+ HandleCodeResponse: "handleCodeResponse",
212
212
  UpdateTokenEndpointAuthority: "updateTokenEndpointAuthority",
213
213
 
214
214
  /**
@@ -229,6 +229,7 @@ export const PerformanceEvents = {
229
229
  * handleServerTokenResponse API in ResponseHandler (msal-common)
230
230
  */
231
231
  HandleServerTokenResponse: "handleServerTokenResponse",
232
+ DeserializeResponse: "deserializeResponse",
232
233
 
233
234
  /**
234
235
  * Authority functions
@@ -558,6 +559,13 @@ export type PerformanceEvent = {
558
559
  * Nested App Auth Fields
559
560
  */
560
561
  nestedAppAuthRequest?: boolean;
562
+
563
+ /**
564
+ * Multiple matched access/id/refresh tokens in the cache
565
+ */
566
+ multiMatchedAT?: number;
567
+ multiMatchedID?: number;
568
+ multiMatchedRT?: number;
561
569
  };
562
570
 
563
571
  export const IntFields: ReadonlySet<string> = new Set([
@@ -570,4 +578,7 @@ export const IntFields: ReadonlySet<string> = new Set([
570
578
  "queuedTimeMs",
571
579
  "startTimeMs",
572
580
  "status",
581
+ "multiMatchedAT",
582
+ "multiMatchedID",
583
+ "multiMatchedRT",
573
584
  ]);