@azure/msal-common 14.4.1-beta.1 → 14.5.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 (288) hide show
  1. package/dist/account/AccountInfo.d.ts +58 -31
  2. package/dist/account/AccountInfo.d.ts.map +1 -1
  3. package/dist/account/AccountInfo.mjs +64 -0
  4. package/dist/account/AccountInfo.mjs.map +1 -0
  5. package/dist/account/AuthToken.d.ts +17 -17
  6. package/dist/account/AuthToken.mjs +58 -58
  7. package/dist/account/AuthToken.mjs.map +1 -1
  8. package/dist/account/CcsCredential.d.ts +9 -9
  9. package/dist/account/CcsCredential.mjs +8 -8
  10. package/dist/account/CcsCredential.mjs.map +1 -1
  11. package/dist/account/ClientCredentials.d.ts +14 -14
  12. package/dist/account/ClientInfo.d.ts +18 -19
  13. package/dist/account/ClientInfo.d.ts.map +1 -1
  14. package/dist/account/ClientInfo.mjs +37 -37
  15. package/dist/account/ClientInfo.mjs.map +1 -1
  16. package/dist/account/TokenClaims.d.ts +83 -65
  17. package/dist/account/TokenClaims.d.ts.map +1 -1
  18. package/dist/account/TokenClaims.mjs +25 -0
  19. package/dist/account/TokenClaims.mjs.map +1 -0
  20. package/dist/authority/Authority.d.ts +253 -249
  21. package/dist/authority/Authority.d.ts.map +1 -1
  22. package/dist/authority/Authority.mjs +812 -789
  23. package/dist/authority/Authority.mjs.map +1 -1
  24. package/dist/authority/AuthorityFactory.d.ts +31 -31
  25. package/dist/authority/AuthorityFactory.mjs +47 -47
  26. package/dist/authority/AuthorityFactory.mjs.map +1 -1
  27. package/dist/authority/AuthorityMetadata.d.ts +503 -503
  28. package/dist/authority/AuthorityMetadata.mjs +603 -603
  29. package/dist/authority/AuthorityMetadata.mjs.map +1 -1
  30. package/dist/authority/AuthorityOptions.d.ts +27 -27
  31. package/dist/authority/AuthorityOptions.mjs +18 -18
  32. package/dist/authority/AuthorityOptions.mjs.map +1 -1
  33. package/dist/authority/AuthorityType.d.ts +10 -10
  34. package/dist/authority/AuthorityType.mjs +13 -13
  35. package/dist/authority/AuthorityType.mjs.map +1 -1
  36. package/dist/authority/AzureRegion.d.ts +1 -1
  37. package/dist/authority/AzureRegionConfiguration.d.ts +5 -5
  38. package/dist/authority/CloudDiscoveryMetadata.d.ts +5 -5
  39. package/dist/authority/CloudInstanceDiscoveryErrorResponse.d.ts +13 -13
  40. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs +8 -8
  41. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs.map +1 -1
  42. package/dist/authority/CloudInstanceDiscoveryResponse.d.ts +9 -9
  43. package/dist/authority/CloudInstanceDiscoveryResponse.mjs +8 -8
  44. package/dist/authority/CloudInstanceDiscoveryResponse.mjs.map +1 -1
  45. package/dist/authority/ImdsOptions.d.ts +5 -5
  46. package/dist/authority/OIDCOptions.d.ts +8 -8
  47. package/dist/authority/OpenIdConfigResponse.d.ts +11 -11
  48. package/dist/authority/OpenIdConfigResponse.mjs +10 -10
  49. package/dist/authority/OpenIdConfigResponse.mjs.map +1 -1
  50. package/dist/authority/ProtocolMode.d.ts +8 -8
  51. package/dist/authority/ProtocolMode.mjs +11 -11
  52. package/dist/authority/ProtocolMode.mjs.map +1 -1
  53. package/dist/authority/RegionDiscovery.d.ts +32 -32
  54. package/dist/authority/RegionDiscovery.mjs +106 -106
  55. package/dist/authority/RegionDiscovery.mjs.map +1 -1
  56. package/dist/authority/RegionDiscoveryMetadata.d.ts +6 -6
  57. package/dist/broker/nativeBroker/INativeBrokerPlugin.d.ts +15 -15
  58. package/dist/cache/CacheManager.d.ts +517 -485
  59. package/dist/cache/CacheManager.d.ts.map +1 -1
  60. package/dist/cache/CacheManager.mjs +1264 -1102
  61. package/dist/cache/CacheManager.mjs.map +1 -1
  62. package/dist/cache/entities/AccessTokenEntity.d.ts +25 -25
  63. package/dist/cache/entities/AccountEntity.d.ts +106 -101
  64. package/dist/cache/entities/AccountEntity.d.ts.map +1 -1
  65. package/dist/cache/entities/AccountEntity.mjs +247 -219
  66. package/dist/cache/entities/AccountEntity.mjs.map +1 -1
  67. package/dist/cache/entities/AppMetadataEntity.d.ts +39 -39
  68. package/dist/cache/entities/AppMetadataEntity.mjs +66 -66
  69. package/dist/cache/entities/AppMetadataEntity.mjs.map +1 -1
  70. package/dist/cache/entities/AuthorityMetadataEntity.d.ts +48 -48
  71. package/dist/cache/entities/AuthorityMetadataEntity.mjs +78 -78
  72. package/dist/cache/entities/AuthorityMetadataEntity.mjs.map +1 -1
  73. package/dist/cache/entities/CacheRecord.d.ts +14 -14
  74. package/dist/cache/entities/CacheRecord.mjs +14 -14
  75. package/dist/cache/entities/CacheRecord.mjs.map +1 -1
  76. package/dist/cache/entities/CredentialEntity.d.ts +30 -30
  77. package/dist/cache/entities/IdTokenEntity.d.ts +8 -8
  78. package/dist/cache/entities/RefreshTokenEntity.d.ts +5 -7
  79. package/dist/cache/entities/RefreshTokenEntity.d.ts.map +1 -1
  80. package/dist/cache/entities/ServerTelemetryEntity.d.ts +5 -5
  81. package/dist/cache/entities/ThrottlingEntity.d.ts +13 -13
  82. package/dist/cache/entities/ThrottlingEntity.mjs +23 -23
  83. package/dist/cache/entities/ThrottlingEntity.mjs.map +1 -1
  84. package/dist/cache/interface/ICacheManager.d.ts +166 -166
  85. package/dist/cache/interface/ICachePlugin.d.ts +5 -5
  86. package/dist/cache/interface/ISerializableTokenCache.d.ts +4 -4
  87. package/dist/cache/persistence/TokenCacheContext.d.ts +23 -23
  88. package/dist/cache/persistence/TokenCacheContext.mjs +25 -25
  89. package/dist/cache/persistence/TokenCacheContext.mjs.map +1 -1
  90. package/dist/cache/utils/CacheHelpers.d.ts +64 -64
  91. package/dist/cache/utils/CacheHelpers.d.ts.map +1 -1
  92. package/dist/cache/utils/CacheHelpers.mjs +231 -234
  93. package/dist/cache/utils/CacheHelpers.mjs.map +1 -1
  94. package/dist/cache/utils/CacheTypes.d.ts +69 -67
  95. package/dist/cache/utils/CacheTypes.d.ts.map +1 -1
  96. package/dist/client/AuthorizationCodeClient.d.ts +74 -74
  97. package/dist/client/AuthorizationCodeClient.d.ts.map +1 -1
  98. package/dist/client/AuthorizationCodeClient.mjs +404 -403
  99. package/dist/client/AuthorizationCodeClient.mjs.map +1 -1
  100. package/dist/client/BaseClient.d.ts +51 -51
  101. package/dist/client/BaseClient.mjs +100 -100
  102. package/dist/client/BaseClient.mjs.map +1 -1
  103. package/dist/client/RefreshTokenClient.d.ts +35 -35
  104. package/dist/client/RefreshTokenClient.d.ts.map +1 -1
  105. package/dist/client/RefreshTokenClient.mjs +189 -194
  106. package/dist/client/RefreshTokenClient.mjs.map +1 -1
  107. package/dist/client/SilentFlowClient.d.ts +27 -27
  108. package/dist/client/SilentFlowClient.mjs +118 -118
  109. package/dist/client/SilentFlowClient.mjs.map +1 -1
  110. package/dist/config/AppTokenProvider.d.ts +38 -38
  111. package/dist/config/ClientConfiguration.d.ts +150 -150
  112. package/dist/config/ClientConfiguration.mjs +97 -97
  113. package/dist/config/ClientConfiguration.mjs.map +1 -1
  114. package/dist/constants/AADServerParamKeys.d.ts +52 -0
  115. package/dist/constants/AADServerParamKeys.d.ts.map +1 -0
  116. package/dist/constants/AADServerParamKeys.mjs +60 -0
  117. package/dist/constants/AADServerParamKeys.mjs.map +1 -0
  118. package/dist/crypto/ICrypto.d.ts +58 -58
  119. package/dist/crypto/ICrypto.mjs +30 -30
  120. package/dist/crypto/ICrypto.mjs.map +1 -1
  121. package/dist/crypto/IGuidGenerator.d.ts +4 -4
  122. package/dist/crypto/JoseHeader.d.ts +22 -22
  123. package/dist/crypto/JoseHeader.mjs +37 -37
  124. package/dist/crypto/JoseHeader.mjs.map +1 -1
  125. package/dist/crypto/PopTokenGenerator.d.ts +60 -60
  126. package/dist/crypto/PopTokenGenerator.mjs +82 -82
  127. package/dist/crypto/PopTokenGenerator.mjs.map +1 -1
  128. package/dist/crypto/SignedHttpRequest.d.ts +15 -15
  129. package/dist/error/AuthError.d.ts +44 -44
  130. package/dist/error/AuthError.mjs +46 -46
  131. package/dist/error/AuthError.mjs.map +1 -1
  132. package/dist/error/AuthErrorCodes.d.ts +5 -5
  133. package/dist/error/AuthErrorCodes.mjs +9 -9
  134. package/dist/error/AuthErrorCodes.mjs.map +1 -1
  135. package/dist/error/ClientAuthError.d.ts +237 -237
  136. package/dist/error/ClientAuthError.mjs +249 -249
  137. package/dist/error/ClientAuthError.mjs.map +1 -1
  138. package/dist/error/ClientAuthErrorCodes.d.ts +44 -44
  139. package/dist/error/ClientAuthErrorCodes.mjs +48 -48
  140. package/dist/error/ClientAuthErrorCodes.mjs.map +1 -1
  141. package/dist/error/ClientConfigurationError.d.ts +128 -128
  142. package/dist/error/ClientConfigurationError.mjs +135 -135
  143. package/dist/error/ClientConfigurationError.mjs.map +1 -1
  144. package/dist/error/ClientConfigurationErrorCodes.d.ts +22 -22
  145. package/dist/error/ClientConfigurationErrorCodes.mjs +26 -26
  146. package/dist/error/ClientConfigurationErrorCodes.mjs.map +1 -1
  147. package/dist/error/InteractionRequiredAuthError.d.ts +57 -57
  148. package/dist/error/InteractionRequiredAuthError.d.ts.map +1 -1
  149. package/dist/error/InteractionRequiredAuthError.mjs +77 -78
  150. package/dist/error/InteractionRequiredAuthError.mjs.map +1 -1
  151. package/dist/error/InteractionRequiredAuthErrorCodes.d.ts +5 -6
  152. package/dist/error/InteractionRequiredAuthErrorCodes.d.ts.map +1 -1
  153. package/dist/error/InteractionRequiredAuthErrorCodes.mjs +12 -13
  154. package/dist/error/InteractionRequiredAuthErrorCodes.mjs.map +1 -1
  155. package/dist/error/JoseHeaderError.d.ts +15 -15
  156. package/dist/error/JoseHeaderError.mjs +22 -22
  157. package/dist/error/JoseHeaderError.mjs.map +1 -1
  158. package/dist/error/JoseHeaderErrorCodes.d.ts +2 -2
  159. package/dist/error/JoseHeaderErrorCodes.mjs +6 -6
  160. package/dist/error/JoseHeaderErrorCodes.mjs.map +1 -1
  161. package/dist/error/ServerError.d.ts +7 -7
  162. package/dist/error/ServerError.mjs +14 -14
  163. package/dist/error/ServerError.mjs.map +1 -1
  164. package/dist/index.cjs +8645 -8295
  165. package/dist/index.cjs.map +1 -1
  166. package/dist/index.d.ts +99 -98
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.mjs +7 -3
  169. package/dist/index.mjs.map +1 -1
  170. package/dist/logger/Logger.d.ts +95 -95
  171. package/dist/logger/Logger.mjs +188 -188
  172. package/dist/logger/Logger.mjs.map +1 -1
  173. package/dist/network/INetworkModule.d.ts +29 -29
  174. package/dist/network/INetworkModule.mjs +12 -12
  175. package/dist/network/INetworkModule.mjs.map +1 -1
  176. package/dist/network/NetworkManager.d.ts +33 -33
  177. package/dist/network/NetworkManager.mjs +34 -34
  178. package/dist/network/NetworkManager.mjs.map +1 -1
  179. package/dist/network/RequestThumbprint.d.ts +18 -18
  180. package/dist/network/ThrottlingUtils.d.ts +42 -42
  181. package/dist/network/ThrottlingUtils.mjs +95 -95
  182. package/dist/network/ThrottlingUtils.mjs.map +1 -1
  183. package/dist/packageMetadata.d.ts +2 -2
  184. package/dist/packageMetadata.d.ts.map +1 -1
  185. package/dist/packageMetadata.mjs +4 -4
  186. package/dist/packageMetadata.mjs.map +1 -1
  187. package/dist/request/AuthenticationHeaderParser.d.ts +19 -19
  188. package/dist/request/AuthenticationHeaderParser.mjs +55 -55
  189. package/dist/request/AuthenticationHeaderParser.mjs.map +1 -1
  190. package/dist/request/BaseAuthRequest.d.ts +43 -43
  191. package/dist/request/CommonAuthorizationCodeRequest.d.ts +27 -27
  192. package/dist/request/CommonAuthorizationUrlRequest.d.ts +50 -50
  193. package/dist/request/CommonClientCredentialRequest.d.ts +17 -17
  194. package/dist/request/CommonDeviceCodeRequest.d.ts +21 -21
  195. package/dist/request/CommonEndSessionRequest.d.ts +21 -21
  196. package/dist/request/CommonOnBehalfOfRequest.d.ts +13 -13
  197. package/dist/request/CommonRefreshTokenRequest.d.ts +22 -23
  198. package/dist/request/CommonRefreshTokenRequest.d.ts.map +1 -1
  199. package/dist/request/CommonSilentFlowRequest.d.ts +20 -21
  200. package/dist/request/CommonSilentFlowRequest.d.ts.map +1 -1
  201. package/dist/request/CommonUsernamePasswordRequest.d.ts +17 -17
  202. package/dist/request/NativeRequest.d.ts +19 -19
  203. package/dist/request/NativeSignOutRequest.d.ts +5 -5
  204. package/dist/request/RequestParameterBuilder.d.ts +217 -217
  205. package/dist/request/RequestParameterBuilder.d.ts.map +1 -1
  206. package/dist/request/RequestParameterBuilder.mjs +383 -382
  207. package/dist/request/RequestParameterBuilder.mjs.map +1 -1
  208. package/dist/request/RequestValidator.d.ts +33 -33
  209. package/dist/request/RequestValidator.mjs +81 -81
  210. package/dist/request/RequestValidator.mjs.map +1 -1
  211. package/dist/request/ScopeSet.d.ts +88 -88
  212. package/dist/request/ScopeSet.mjs +197 -197
  213. package/dist/request/ScopeSet.mjs.map +1 -1
  214. package/dist/request/StoreInCache.d.ts +8 -8
  215. package/dist/response/AuthenticationResult.d.ts +41 -41
  216. package/dist/response/AuthorizationCodePayload.d.ts +13 -13
  217. package/dist/response/DeviceCodeResponse.d.ts +25 -25
  218. package/dist/response/ExternalTokenResponse.d.ts +15 -15
  219. package/dist/response/IMDSBadResponse.d.ts +4 -4
  220. package/dist/response/ResponseHandler.d.ts +69 -67
  221. package/dist/response/ResponseHandler.d.ts.map +1 -1
  222. package/dist/response/ResponseHandler.mjs +339 -313
  223. package/dist/response/ResponseHandler.mjs.map +1 -1
  224. package/dist/response/ServerAuthorizationCodeResponse.d.ts +25 -25
  225. package/dist/response/ServerAuthorizationTokenResponse.d.ts +46 -46
  226. package/dist/telemetry/performance/IPerformanceClient.d.ts +51 -51
  227. package/dist/telemetry/performance/IPerformanceMeasurement.d.ts +5 -5
  228. package/dist/telemetry/performance/PerformanceClient.d.ts +191 -191
  229. package/dist/telemetry/performance/PerformanceClient.mjs +409 -409
  230. package/dist/telemetry/performance/PerformanceClient.mjs.map +1 -1
  231. package/dist/telemetry/performance/PerformanceEvent.d.ts +464 -464
  232. package/dist/telemetry/performance/PerformanceEvent.mjs +253 -253
  233. package/dist/telemetry/performance/PerformanceEvent.mjs.map +1 -1
  234. package/dist/telemetry/performance/StubPerformanceClient.d.ts +24 -24
  235. package/dist/telemetry/performance/StubPerformanceClient.mjs +76 -76
  236. package/dist/telemetry/performance/StubPerformanceClient.mjs.map +1 -1
  237. package/dist/telemetry/server/ServerTelemetryManager.d.ts +66 -66
  238. package/dist/telemetry/server/ServerTelemetryManager.mjs +201 -201
  239. package/dist/telemetry/server/ServerTelemetryManager.mjs.map +1 -1
  240. package/dist/telemetry/server/ServerTelemetryRequest.d.ts +8 -8
  241. package/dist/url/IUri.d.ts +12 -12
  242. package/dist/url/UrlString.d.ts +48 -48
  243. package/dist/url/UrlString.mjs +161 -161
  244. package/dist/url/UrlString.mjs.map +1 -1
  245. package/dist/utils/Constants.d.ts +296 -365
  246. package/dist/utils/Constants.d.ts.map +1 -1
  247. package/dist/utils/Constants.mjs +309 -376
  248. package/dist/utils/Constants.mjs.map +1 -1
  249. package/dist/utils/FunctionWrappers.d.ts +27 -27
  250. package/dist/utils/FunctionWrappers.mjs +84 -84
  251. package/dist/utils/FunctionWrappers.mjs.map +1 -1
  252. package/dist/utils/MsalTypes.d.ts +6 -6
  253. package/dist/utils/ProtocolUtils.d.ts +42 -42
  254. package/dist/utils/ProtocolUtils.mjs +69 -69
  255. package/dist/utils/ProtocolUtils.mjs.map +1 -1
  256. package/dist/utils/StringUtils.d.ts +40 -40
  257. package/dist/utils/StringUtils.mjs +95 -95
  258. package/dist/utils/StringUtils.mjs.map +1 -1
  259. package/dist/utils/TimeUtils.d.ts +27 -27
  260. package/dist/utils/TimeUtils.mjs +45 -45
  261. package/dist/utils/TimeUtils.mjs.map +1 -1
  262. package/dist/utils/UrlUtils.d.ts +10 -10
  263. package/dist/utils/UrlUtils.mjs +44 -44
  264. package/dist/utils/UrlUtils.mjs.map +1 -1
  265. package/package.json +93 -92
  266. package/src/account/AccountInfo.ts +96 -0
  267. package/src/account/ClientInfo.ts +2 -3
  268. package/src/account/TokenClaims.ts +28 -0
  269. package/src/authority/Authority.ts +29 -2
  270. package/src/cache/CacheManager.ts +416 -114
  271. package/src/cache/entities/AccountEntity.ts +84 -33
  272. package/src/cache/entities/RefreshTokenEntity.ts +1 -3
  273. package/src/cache/utils/CacheHelpers.ts +1 -6
  274. package/src/cache/utils/CacheTypes.ts +11 -0
  275. package/src/client/AuthorizationCodeClient.ts +4 -5
  276. package/src/client/RefreshTokenClient.ts +3 -15
  277. package/src/client/SilentFlowClient.ts +1 -1
  278. package/src/constants/AADServerParamKeys.ts +56 -0
  279. package/src/crypto/PopTokenGenerator.ts +1 -1
  280. package/src/error/InteractionRequiredAuthError.ts +0 -2
  281. package/src/error/InteractionRequiredAuthErrorCodes.ts +0 -1
  282. package/src/index.ts +17 -5
  283. package/src/packageMetadata.ts +1 -1
  284. package/src/request/CommonRefreshTokenRequest.ts +0 -1
  285. package/src/request/CommonSilentFlowRequest.ts +0 -1
  286. package/src/request/RequestParameterBuilder.ts +7 -5
  287. package/src/response/ResponseHandler.ts +95 -27
  288. package/src/utils/Constants.ts +0 -72
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-common v14.4.1-beta.1 2023-11-14 */
1
+ /*! @azure/msal-common v14.5.0 2023-12-01 */
2
2
  'use strict';
3
3
  import { createClientAuthError } from '../error/ClientAuthError.mjs';
4
4
  import { ServerError } from '../error/ServerError.mjs';
@@ -13,321 +13,347 @@ import { AppMetadataEntity } from '../cache/entities/AppMetadataEntity.mjs';
13
13
  import { TokenCacheContext } from '../cache/persistence/TokenCacheContext.mjs';
14
14
  import { PerformanceEvents } from '../telemetry/performance/PerformanceEvent.mjs';
15
15
  import { extractTokenClaims, checkMaxAge } from '../account/AuthToken.mjs';
16
+ import { getTenantIdFromIdTokenClaims } from '../account/TokenClaims.mjs';
17
+ import { updateAccountTenantProfileData, buildTenantProfileFromIdTokenClaims } from '../account/AccountInfo.mjs';
16
18
  import { createAccessTokenEntity, createRefreshTokenEntity, createIdTokenEntity } from '../cache/utils/CacheHelpers.mjs';
17
19
  import { stateNotFound, invalidState, stateMismatch, nonceMismatch, authTimeNotFound, invalidCacheEnvironment, keyIdMissing } from '../error/ClientAuthErrorCodes.mjs';
18
20
 
19
- /*
20
- * Copyright (c) Microsoft Corporation. All rights reserved.
21
- * Licensed under the MIT License.
22
- */
23
- /**
24
- * Class that handles response parsing.
25
- * @internal
26
- */
27
- class ResponseHandler {
28
- constructor(clientId, cacheStorage, cryptoObj, logger, serializableCache, persistencePlugin, performanceClient) {
29
- this.clientId = clientId;
30
- this.cacheStorage = cacheStorage;
31
- this.cryptoObj = cryptoObj;
32
- this.logger = logger;
33
- this.serializableCache = serializableCache;
34
- this.persistencePlugin = persistencePlugin;
35
- this.performanceClient = performanceClient;
36
- }
37
- /**
38
- * Function which validates server authorization code response.
39
- * @param serverResponseHash
40
- * @param requestState
41
- * @param cryptoObj
42
- */
43
- validateServerAuthorizationCodeResponse(serverResponse, requestState) {
44
- if (!serverResponse.state || !requestState) {
45
- throw serverResponse.state
46
- ? createClientAuthError(stateNotFound, "Cached State")
47
- : createClientAuthError(stateNotFound, "Server State");
48
- }
49
- let decodedServerResponseState;
50
- let decodedRequestState;
51
- try {
52
- decodedServerResponseState = decodeURIComponent(serverResponse.state);
53
- }
54
- catch (e) {
55
- throw createClientAuthError(invalidState, serverResponse.state);
56
- }
57
- try {
58
- decodedRequestState = decodeURIComponent(requestState);
59
- }
60
- catch (e) {
61
- throw createClientAuthError(invalidState, serverResponse.state);
62
- }
63
- if (decodedServerResponseState !== decodedRequestState) {
64
- throw createClientAuthError(stateMismatch);
65
- }
66
- // Check for error
67
- if (serverResponse.error ||
68
- serverResponse.error_description ||
69
- serverResponse.suberror) {
70
- if (isInteractionRequiredError(serverResponse.error, serverResponse.error_description, serverResponse.suberror)) {
71
- throw new InteractionRequiredAuthError(serverResponse.error || "", serverResponse.error_description, serverResponse.suberror, serverResponse.timestamp || "", serverResponse.trace_id || "", serverResponse.correlation_id || "", serverResponse.claims || "");
72
- }
73
- throw new ServerError(serverResponse.error || "", serverResponse.error_description, serverResponse.suberror);
74
- }
75
- }
76
- /**
77
- * Function which validates server authorization token response.
78
- * @param serverResponse
79
- * @param refreshAccessToken
80
- */
81
- validateTokenResponse(serverResponse, refreshAccessToken) {
82
- // Check for error
83
- if (serverResponse.error ||
84
- serverResponse.error_description ||
85
- serverResponse.suberror) {
86
- const errString = `${serverResponse.error_codes} - [${serverResponse.timestamp}]: ${serverResponse.error_description} - Correlation ID: ${serverResponse.correlation_id} - Trace ID: ${serverResponse.trace_id}`;
87
- const serverError = new ServerError(serverResponse.error, errString, serverResponse.suberror);
88
- // check if 500 error
89
- if (refreshAccessToken &&
90
- serverResponse.status &&
91
- serverResponse.status >= HttpStatus.SERVER_ERROR_RANGE_START &&
92
- serverResponse.status <= HttpStatus.SERVER_ERROR_RANGE_END) {
93
- this.logger.warning(`executeTokenRequest:validateTokenResponse - AAD is currently unavailable and the access token is unable to be refreshed.\n${serverError}`);
94
- // don't throw an exception, but alert the user via a log that the token was unable to be refreshed
95
- return;
96
- // check if 400 error
97
- }
98
- else if (refreshAccessToken &&
99
- serverResponse.status &&
100
- serverResponse.status >= HttpStatus.CLIENT_ERROR_RANGE_START &&
101
- serverResponse.status <= HttpStatus.CLIENT_ERROR_RANGE_END) {
102
- this.logger.warning(`executeTokenRequest:validateTokenResponse - AAD is currently available but is unable to refresh the access token.\n${serverError}`);
103
- // don't throw an exception, but alert the user via a log that the token was unable to be refreshed
104
- return;
105
- }
106
- if (isInteractionRequiredError(serverResponse.error, serverResponse.error_description, serverResponse.suberror)) {
107
- throw new InteractionRequiredAuthError(serverResponse.error, serverResponse.error_description, serverResponse.suberror, serverResponse.timestamp || Constants.EMPTY_STRING, serverResponse.trace_id || Constants.EMPTY_STRING, serverResponse.correlation_id || Constants.EMPTY_STRING, serverResponse.claims || Constants.EMPTY_STRING);
108
- }
109
- throw serverError;
110
- }
111
- }
112
- /**
113
- * Returns a constructed token response based on given string. Also manages the cache updates and cleanups.
114
- * @param serverTokenResponse
115
- * @param authority
116
- */
117
- async handleServerTokenResponse(serverTokenResponse, authority, reqTimestamp, request, authCodePayload, userAssertionHash, handlingRefreshTokenResponse, forceCacheRefreshTokenResponse, serverRequestId, rtExpiresOn) {
118
- this.performanceClient?.addQueueMeasurement(PerformanceEvents.HandleServerTokenResponse, serverTokenResponse.correlation_id);
119
- // create an idToken object (not entity)
120
- let idTokenClaims;
121
- if (serverTokenResponse.id_token) {
122
- idTokenClaims = extractTokenClaims(serverTokenResponse.id_token || Constants.EMPTY_STRING, this.cryptoObj.base64Decode);
123
- // token nonce check (TODO: Add a warning if no nonce is given?)
124
- if (authCodePayload && authCodePayload.nonce) {
125
- if (idTokenClaims.nonce !== authCodePayload.nonce) {
126
- throw createClientAuthError(nonceMismatch);
127
- }
128
- }
129
- // token max_age check
130
- if (request.maxAge || request.maxAge === 0) {
131
- const authTime = idTokenClaims.auth_time;
132
- if (!authTime) {
133
- throw createClientAuthError(authTimeNotFound);
134
- }
135
- checkMaxAge(authTime, request.maxAge);
136
- }
137
- }
138
- // generate homeAccountId
139
- this.homeAccountIdentifier = AccountEntity.generateHomeAccountId(serverTokenResponse.client_info || Constants.EMPTY_STRING, authority.authorityType, this.logger, this.cryptoObj, idTokenClaims);
140
- // save the response tokens
141
- let requestStateObj;
142
- if (!!authCodePayload && !!authCodePayload.state) {
143
- requestStateObj = ProtocolUtils.parseRequestState(this.cryptoObj, authCodePayload.state);
144
- }
145
- // Add keyId from request to serverTokenResponse if defined
146
- serverTokenResponse.key_id =
147
- serverTokenResponse.key_id || request.sshKid || undefined;
148
- const cacheRecord = this.generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenClaims, userAssertionHash, authCodePayload, rtExpiresOn);
149
- let cacheContext;
150
- try {
151
- if (this.persistencePlugin && this.serializableCache) {
152
- this.logger.verbose("Persistence enabled, calling beforeCacheAccess");
153
- cacheContext = new TokenCacheContext(this.serializableCache, true);
154
- await this.persistencePlugin.beforeCacheAccess(cacheContext);
155
- }
156
- /*
157
- * When saving a refreshed tokens to the cache, it is expected that the account that was used is present in the cache.
158
- * If not present, we should return null, as it's the case that another application called removeAccount in between
159
- * the calls to getAllAccounts and acquireTokenSilent. We should not overwrite that removal, unless explicitly flagged by
160
- * the developer, as in the case of refresh token flow used in ADAL Node to MSAL Node migration.
161
- */
162
- if (handlingRefreshTokenResponse &&
163
- !forceCacheRefreshTokenResponse &&
164
- cacheRecord.account) {
165
- const key = cacheRecord.account.generateAccountKey();
166
- const account = this.cacheStorage.getAccount(key);
167
- if (!account) {
168
- this.logger.warning("Account used to refresh tokens not in persistence, refreshed tokens will not be stored in the cache");
169
- return ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenClaims, requestStateObj, undefined, serverRequestId);
170
- }
171
- }
172
- await this.cacheStorage.saveCacheRecord(cacheRecord, request.storeInCache);
173
- }
174
- finally {
175
- if (this.persistencePlugin &&
176
- this.serializableCache &&
177
- cacheContext) {
178
- this.logger.verbose("Persistence enabled, calling afterCacheAccess");
179
- await this.persistencePlugin.afterCacheAccess(cacheContext);
180
- }
181
- }
182
- return ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenClaims, requestStateObj, serverTokenResponse, serverRequestId);
183
- }
184
- /**
185
- * Generates CacheRecord
186
- * @param serverTokenResponse
187
- * @param idTokenObj
188
- * @param authority
189
- */
190
- generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenClaims, userAssertionHash, authCodePayload, rtExpiresOn) {
191
- const env = authority.getPreferredCache();
192
- if (!env) {
193
- throw createClientAuthError(invalidCacheEnvironment);
194
- }
195
- // IdToken: non AAD scenarios can have empty realm
196
- let cachedIdToken;
197
- let cachedAccount;
198
- if (serverTokenResponse.id_token && !!idTokenClaims) {
199
- cachedIdToken = createIdTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.id_token, this.clientId, idTokenClaims.tid || "");
200
- cachedAccount = AccountEntity.createAccount({
201
- homeAccountId: this.homeAccountIdentifier,
202
- idTokenClaims: idTokenClaims,
203
- clientInfo: serverTokenResponse.client_info,
204
- cloudGraphHostName: authCodePayload?.cloud_graph_host_name,
205
- msGraphHost: authCodePayload?.msgraph_host,
206
- }, authority);
207
- }
208
- // AccessToken
209
- let cachedAccessToken = null;
210
- if (serverTokenResponse.access_token) {
211
- // If scopes not returned in server response, use request scopes
212
- const responseScopes = serverTokenResponse.scope
213
- ? ScopeSet.fromString(serverTokenResponse.scope)
214
- : new ScopeSet(request.scopes || []);
215
- /*
216
- * Use timestamp calculated before request
217
- * Server may return timestamps as strings, parse to numbers if so.
218
- */
219
- const expiresIn = (typeof serverTokenResponse.expires_in === "string"
220
- ? parseInt(serverTokenResponse.expires_in, 10)
221
- : serverTokenResponse.expires_in) || 0;
222
- const extExpiresIn = (typeof serverTokenResponse.ext_expires_in === "string"
223
- ? parseInt(serverTokenResponse.ext_expires_in, 10)
224
- : serverTokenResponse.ext_expires_in) || 0;
225
- const refreshIn = (typeof serverTokenResponse.refresh_in === "string"
226
- ? parseInt(serverTokenResponse.refresh_in, 10)
227
- : serverTokenResponse.refresh_in) || undefined;
228
- const tokenExpirationSeconds = reqTimestamp + expiresIn;
229
- const extendedTokenExpirationSeconds = tokenExpirationSeconds + extExpiresIn;
230
- const refreshOnSeconds = refreshIn && refreshIn > 0
231
- ? reqTimestamp + refreshIn
232
- : undefined;
233
- // non AAD scenarios can have empty realm
234
- cachedAccessToken = createAccessTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.access_token, this.clientId, idTokenClaims?.tid || authority.tenant, responseScopes.printScopes(), tokenExpirationSeconds, extendedTokenExpirationSeconds, this.cryptoObj.base64Decode, refreshOnSeconds, serverTokenResponse.token_type, userAssertionHash, serverTokenResponse.key_id, request.claims, request.requestedClaimsHash);
235
- }
236
- // refreshToken
237
- let cachedRefreshToken = null;
238
- if (serverTokenResponse.refresh_token) {
239
- cachedRefreshToken = createRefreshTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.refresh_token, this.clientId, serverTokenResponse.foci, userAssertionHash, rtExpiresOn);
240
- }
241
- // appMetadata
242
- let cachedAppMetadata = null;
243
- if (serverTokenResponse.foci) {
244
- cachedAppMetadata = AppMetadataEntity.createAppMetadataEntity(this.clientId, env, serverTokenResponse.foci);
245
- }
246
- return new CacheRecord(cachedAccount, cachedIdToken, cachedAccessToken, cachedRefreshToken, cachedAppMetadata);
247
- }
248
- /**
249
- * Creates an @AuthenticationResult from @CacheRecord , @IdToken , and a boolean that states whether or not the result is from cache.
250
- *
251
- * Optionally takes a state string that is set as-is in the response.
252
- *
253
- * @param cacheRecord
254
- * @param idTokenObj
255
- * @param fromTokenCache
256
- * @param stateString
257
- */
258
- static async generateAuthenticationResult(cryptoObj, authority, cacheRecord, fromTokenCache, request, idTokenClaims, requestState, serverTokenResponse, requestId) {
259
- let accessToken = Constants.EMPTY_STRING;
260
- let responseScopes = [];
261
- let expiresOn = null;
262
- let extExpiresOn;
263
- let refreshOn;
264
- let familyId = Constants.EMPTY_STRING;
265
- if (cacheRecord.accessToken) {
266
- if (cacheRecord.accessToken.tokenType === AuthenticationScheme.POP) {
267
- const popTokenGenerator = new PopTokenGenerator(cryptoObj);
268
- const { secret, keyId } = cacheRecord.accessToken;
269
- if (!keyId) {
270
- throw createClientAuthError(keyIdMissing);
271
- }
272
- accessToken = await popTokenGenerator.signPopToken(secret, keyId, request);
273
- }
274
- else {
275
- accessToken = cacheRecord.accessToken.secret;
276
- }
277
- responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray();
278
- expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000);
279
- extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000);
280
- if (cacheRecord.accessToken.refreshOn) {
281
- refreshOn = new Date(Number(cacheRecord.accessToken.refreshOn) * 1000);
282
- }
283
- }
284
- if (cacheRecord.appMetadata) {
285
- familyId =
286
- cacheRecord.appMetadata.familyId === THE_FAMILY_ID
287
- ? THE_FAMILY_ID
288
- : "";
289
- }
290
- const uid = idTokenClaims?.oid || idTokenClaims?.sub || "";
291
- const tid = idTokenClaims?.tid || "";
292
- // for hybrid + native bridge enablement, send back the native account Id
293
- if (serverTokenResponse?.spa_accountid && !!cacheRecord.account) {
294
- cacheRecord.account.nativeAccountId =
295
- serverTokenResponse?.spa_accountid;
296
- }
297
- const accountInfo = cacheRecord.account
298
- ? {
299
- ...cacheRecord.account.getAccountInfo(),
300
- idTokenClaims,
301
- }
302
- : null;
303
- return {
304
- authority: authority.canonicalAuthority,
305
- uniqueId: uid,
306
- tenantId: tid,
307
- scopes: responseScopes,
308
- account: accountInfo,
309
- idToken: cacheRecord?.idToken?.secret || "",
310
- idTokenClaims: idTokenClaims || {},
311
- accessToken: accessToken,
312
- fromCache: fromTokenCache,
313
- expiresOn: expiresOn,
314
- extExpiresOn: extExpiresOn,
315
- refreshOn: refreshOn,
316
- correlationId: request.correlationId,
317
- requestId: requestId || Constants.EMPTY_STRING,
318
- familyId: familyId,
319
- tokenType: cacheRecord.accessToken?.tokenType || Constants.EMPTY_STRING,
320
- state: requestState
321
- ? requestState.userRequestState
322
- : Constants.EMPTY_STRING,
323
- cloudGraphHostName: cacheRecord.account?.cloudGraphHostName ||
324
- Constants.EMPTY_STRING,
325
- msGraphHost: cacheRecord.account?.msGraphHost || Constants.EMPTY_STRING,
326
- code: serverTokenResponse?.spa_code,
327
- fromNativeBroker: false,
328
- };
329
- }
21
+ /*
22
+ * Copyright (c) Microsoft Corporation. All rights reserved.
23
+ * Licensed under the MIT License.
24
+ */
25
+ /**
26
+ * Class that handles response parsing.
27
+ * @internal
28
+ */
29
+ class ResponseHandler {
30
+ constructor(clientId, cacheStorage, cryptoObj, logger, serializableCache, persistencePlugin, performanceClient) {
31
+ this.clientId = clientId;
32
+ this.cacheStorage = cacheStorage;
33
+ this.cryptoObj = cryptoObj;
34
+ this.logger = logger;
35
+ this.serializableCache = serializableCache;
36
+ this.persistencePlugin = persistencePlugin;
37
+ this.performanceClient = performanceClient;
38
+ }
39
+ /**
40
+ * Function which validates server authorization code response.
41
+ * @param serverResponseHash
42
+ * @param requestState
43
+ * @param cryptoObj
44
+ */
45
+ validateServerAuthorizationCodeResponse(serverResponse, requestState) {
46
+ if (!serverResponse.state || !requestState) {
47
+ throw serverResponse.state
48
+ ? createClientAuthError(stateNotFound, "Cached State")
49
+ : createClientAuthError(stateNotFound, "Server State");
50
+ }
51
+ let decodedServerResponseState;
52
+ let decodedRequestState;
53
+ try {
54
+ decodedServerResponseState = decodeURIComponent(serverResponse.state);
55
+ }
56
+ catch (e) {
57
+ throw createClientAuthError(invalidState, serverResponse.state);
58
+ }
59
+ try {
60
+ decodedRequestState = decodeURIComponent(requestState);
61
+ }
62
+ catch (e) {
63
+ throw createClientAuthError(invalidState, serverResponse.state);
64
+ }
65
+ if (decodedServerResponseState !== decodedRequestState) {
66
+ throw createClientAuthError(stateMismatch);
67
+ }
68
+ // Check for error
69
+ if (serverResponse.error ||
70
+ serverResponse.error_description ||
71
+ serverResponse.suberror) {
72
+ if (isInteractionRequiredError(serverResponse.error, serverResponse.error_description, serverResponse.suberror)) {
73
+ throw new InteractionRequiredAuthError(serverResponse.error || "", serverResponse.error_description, serverResponse.suberror, serverResponse.timestamp || "", serverResponse.trace_id || "", serverResponse.correlation_id || "", serverResponse.claims || "");
74
+ }
75
+ throw new ServerError(serverResponse.error || "", serverResponse.error_description, serverResponse.suberror);
76
+ }
77
+ }
78
+ /**
79
+ * Function which validates server authorization token response.
80
+ * @param serverResponse
81
+ * @param refreshAccessToken
82
+ */
83
+ validateTokenResponse(serverResponse, refreshAccessToken) {
84
+ // Check for error
85
+ if (serverResponse.error ||
86
+ serverResponse.error_description ||
87
+ serverResponse.suberror) {
88
+ const errString = `${serverResponse.error_codes} - [${serverResponse.timestamp}]: ${serverResponse.error_description} - Correlation ID: ${serverResponse.correlation_id} - Trace ID: ${serverResponse.trace_id}`;
89
+ const serverError = new ServerError(serverResponse.error, errString, serverResponse.suberror);
90
+ // check if 500 error
91
+ if (refreshAccessToken &&
92
+ serverResponse.status &&
93
+ serverResponse.status >= HttpStatus.SERVER_ERROR_RANGE_START &&
94
+ serverResponse.status <= HttpStatus.SERVER_ERROR_RANGE_END) {
95
+ this.logger.warning(`executeTokenRequest:validateTokenResponse - AAD is currently unavailable and the access token is unable to be refreshed.\n${serverError}`);
96
+ // don't throw an exception, but alert the user via a log that the token was unable to be refreshed
97
+ return;
98
+ // check if 400 error
99
+ }
100
+ else if (refreshAccessToken &&
101
+ serverResponse.status &&
102
+ serverResponse.status >= HttpStatus.CLIENT_ERROR_RANGE_START &&
103
+ serverResponse.status <= HttpStatus.CLIENT_ERROR_RANGE_END) {
104
+ this.logger.warning(`executeTokenRequest:validateTokenResponse - AAD is currently available but is unable to refresh the access token.\n${serverError}`);
105
+ // don't throw an exception, but alert the user via a log that the token was unable to be refreshed
106
+ return;
107
+ }
108
+ if (isInteractionRequiredError(serverResponse.error, serverResponse.error_description, serverResponse.suberror)) {
109
+ throw new InteractionRequiredAuthError(serverResponse.error, serverResponse.error_description, serverResponse.suberror, serverResponse.timestamp || Constants.EMPTY_STRING, serverResponse.trace_id || Constants.EMPTY_STRING, serverResponse.correlation_id || Constants.EMPTY_STRING, serverResponse.claims || Constants.EMPTY_STRING);
110
+ }
111
+ throw serverError;
112
+ }
113
+ }
114
+ /**
115
+ * Returns a constructed token response based on given string. Also manages the cache updates and cleanups.
116
+ * @param serverTokenResponse
117
+ * @param authority
118
+ */
119
+ async handleServerTokenResponse(serverTokenResponse, authority, reqTimestamp, request, authCodePayload, userAssertionHash, handlingRefreshTokenResponse, forceCacheRefreshTokenResponse, serverRequestId) {
120
+ this.performanceClient?.addQueueMeasurement(PerformanceEvents.HandleServerTokenResponse, serverTokenResponse.correlation_id);
121
+ // create an idToken object (not entity)
122
+ let idTokenClaims;
123
+ if (serverTokenResponse.id_token) {
124
+ idTokenClaims = extractTokenClaims(serverTokenResponse.id_token || Constants.EMPTY_STRING, this.cryptoObj.base64Decode);
125
+ // token nonce check (TODO: Add a warning if no nonce is given?)
126
+ if (authCodePayload && authCodePayload.nonce) {
127
+ if (idTokenClaims.nonce !== authCodePayload.nonce) {
128
+ throw createClientAuthError(nonceMismatch);
129
+ }
130
+ }
131
+ // token max_age check
132
+ if (request.maxAge || request.maxAge === 0) {
133
+ const authTime = idTokenClaims.auth_time;
134
+ if (!authTime) {
135
+ throw createClientAuthError(authTimeNotFound);
136
+ }
137
+ checkMaxAge(authTime, request.maxAge);
138
+ }
139
+ }
140
+ // generate homeAccountId
141
+ this.homeAccountIdentifier = AccountEntity.generateHomeAccountId(serverTokenResponse.client_info || Constants.EMPTY_STRING, authority.authorityType, this.logger, this.cryptoObj, idTokenClaims);
142
+ // save the response tokens
143
+ let requestStateObj;
144
+ if (!!authCodePayload && !!authCodePayload.state) {
145
+ requestStateObj = ProtocolUtils.parseRequestState(this.cryptoObj, authCodePayload.state);
146
+ }
147
+ // Add keyId from request to serverTokenResponse if defined
148
+ serverTokenResponse.key_id =
149
+ serverTokenResponse.key_id || request.sshKid || undefined;
150
+ const cacheRecord = this.generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenClaims, userAssertionHash, authCodePayload);
151
+ let cacheContext;
152
+ try {
153
+ if (this.persistencePlugin && this.serializableCache) {
154
+ this.logger.verbose("Persistence enabled, calling beforeCacheAccess");
155
+ cacheContext = new TokenCacheContext(this.serializableCache, true);
156
+ await this.persistencePlugin.beforeCacheAccess(cacheContext);
157
+ }
158
+ /*
159
+ * When saving a refreshed tokens to the cache, it is expected that the account that was used is present in the cache.
160
+ * If not present, we should return null, as it's the case that another application called removeAccount in between
161
+ * the calls to getAllAccounts and acquireTokenSilent. We should not overwrite that removal, unless explicitly flagged by
162
+ * the developer, as in the case of refresh token flow used in ADAL Node to MSAL Node migration.
163
+ */
164
+ if (handlingRefreshTokenResponse &&
165
+ !forceCacheRefreshTokenResponse &&
166
+ cacheRecord.account) {
167
+ const key = cacheRecord.account.generateAccountKey();
168
+ const account = this.cacheStorage.getAccount(key, this.logger);
169
+ if (!account) {
170
+ this.logger.warning("Account used to refresh tokens not in persistence, refreshed tokens will not be stored in the cache");
171
+ return await ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenClaims, requestStateObj, undefined, serverRequestId);
172
+ }
173
+ }
174
+ await this.cacheStorage.saveCacheRecord(cacheRecord, request.storeInCache);
175
+ }
176
+ finally {
177
+ if (this.persistencePlugin &&
178
+ this.serializableCache &&
179
+ cacheContext) {
180
+ this.logger.verbose("Persistence enabled, calling afterCacheAccess");
181
+ await this.persistencePlugin.afterCacheAccess(cacheContext);
182
+ }
183
+ }
184
+ return ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenClaims, requestStateObj, serverTokenResponse, serverRequestId);
185
+ }
186
+ /**
187
+ * Generates CacheRecord
188
+ * @param serverTokenResponse
189
+ * @param idTokenObj
190
+ * @param authority
191
+ */
192
+ generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenClaims, userAssertionHash, authCodePayload) {
193
+ const env = authority.getPreferredCache();
194
+ if (!env) {
195
+ throw createClientAuthError(invalidCacheEnvironment);
196
+ }
197
+ const claimsTenantId = getTenantIdFromIdTokenClaims(idTokenClaims);
198
+ // IdToken: non AAD scenarios can have empty realm
199
+ let cachedIdToken;
200
+ let cachedAccount;
201
+ if (serverTokenResponse.id_token && !!idTokenClaims) {
202
+ cachedIdToken = createIdTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.id_token, this.clientId, claimsTenantId || "");
203
+ cachedAccount = buildAccountToCache(this.cacheStorage, authority, this.homeAccountIdentifier, idTokenClaims, this.cryptoObj.base64Decode, serverTokenResponse.client_info, claimsTenantId, authCodePayload, undefined, this.logger);
204
+ }
205
+ // AccessToken
206
+ let cachedAccessToken = null;
207
+ if (serverTokenResponse.access_token) {
208
+ // If scopes not returned in server response, use request scopes
209
+ const responseScopes = serverTokenResponse.scope
210
+ ? ScopeSet.fromString(serverTokenResponse.scope)
211
+ : new ScopeSet(request.scopes || []);
212
+ /*
213
+ * Use timestamp calculated before request
214
+ * Server may return timestamps as strings, parse to numbers if so.
215
+ */
216
+ const expiresIn = (typeof serverTokenResponse.expires_in === "string"
217
+ ? parseInt(serverTokenResponse.expires_in, 10)
218
+ : serverTokenResponse.expires_in) || 0;
219
+ const extExpiresIn = (typeof serverTokenResponse.ext_expires_in === "string"
220
+ ? parseInt(serverTokenResponse.ext_expires_in, 10)
221
+ : serverTokenResponse.ext_expires_in) || 0;
222
+ const refreshIn = (typeof serverTokenResponse.refresh_in === "string"
223
+ ? parseInt(serverTokenResponse.refresh_in, 10)
224
+ : serverTokenResponse.refresh_in) || undefined;
225
+ const tokenExpirationSeconds = reqTimestamp + expiresIn;
226
+ const extendedTokenExpirationSeconds = tokenExpirationSeconds + extExpiresIn;
227
+ const refreshOnSeconds = refreshIn && refreshIn > 0
228
+ ? reqTimestamp + refreshIn
229
+ : undefined;
230
+ // non AAD scenarios can have empty realm
231
+ cachedAccessToken = createAccessTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.access_token, this.clientId, claimsTenantId || authority.tenant, responseScopes.printScopes(), tokenExpirationSeconds, extendedTokenExpirationSeconds, this.cryptoObj.base64Decode, refreshOnSeconds, serverTokenResponse.token_type, userAssertionHash, serverTokenResponse.key_id, request.claims, request.requestedClaimsHash);
232
+ }
233
+ // refreshToken
234
+ let cachedRefreshToken = null;
235
+ if (serverTokenResponse.refresh_token) {
236
+ cachedRefreshToken = createRefreshTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.refresh_token, this.clientId, serverTokenResponse.foci, userAssertionHash);
237
+ }
238
+ // appMetadata
239
+ let cachedAppMetadata = null;
240
+ if (serverTokenResponse.foci) {
241
+ cachedAppMetadata = AppMetadataEntity.createAppMetadataEntity(this.clientId, env, serverTokenResponse.foci);
242
+ }
243
+ return new CacheRecord(cachedAccount, cachedIdToken, cachedAccessToken, cachedRefreshToken, cachedAppMetadata);
244
+ }
245
+ /**
246
+ * Creates an @AuthenticationResult from @CacheRecord , @IdToken , and a boolean that states whether or not the result is from cache.
247
+ *
248
+ * Optionally takes a state string that is set as-is in the response.
249
+ *
250
+ * @param cacheRecord
251
+ * @param idTokenObj
252
+ * @param fromTokenCache
253
+ * @param stateString
254
+ */
255
+ static async generateAuthenticationResult(cryptoObj, authority, cacheRecord, fromTokenCache, request, idTokenClaims, requestState, serverTokenResponse, requestId) {
256
+ let accessToken = Constants.EMPTY_STRING;
257
+ let responseScopes = [];
258
+ let expiresOn = null;
259
+ let extExpiresOn;
260
+ let refreshOn;
261
+ let familyId = Constants.EMPTY_STRING;
262
+ if (cacheRecord.accessToken) {
263
+ if (cacheRecord.accessToken.tokenType === AuthenticationScheme.POP) {
264
+ const popTokenGenerator = new PopTokenGenerator(cryptoObj);
265
+ const { secret, keyId } = cacheRecord.accessToken;
266
+ if (!keyId) {
267
+ throw createClientAuthError(keyIdMissing);
268
+ }
269
+ accessToken = await popTokenGenerator.signPopToken(secret, keyId, request);
270
+ }
271
+ else {
272
+ accessToken = cacheRecord.accessToken.secret;
273
+ }
274
+ responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray();
275
+ expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000);
276
+ extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000);
277
+ if (cacheRecord.accessToken.refreshOn) {
278
+ refreshOn = new Date(Number(cacheRecord.accessToken.refreshOn) * 1000);
279
+ }
280
+ }
281
+ if (cacheRecord.appMetadata) {
282
+ familyId =
283
+ cacheRecord.appMetadata.familyId === THE_FAMILY_ID
284
+ ? THE_FAMILY_ID
285
+ : "";
286
+ }
287
+ const uid = idTokenClaims?.oid || idTokenClaims?.sub || "";
288
+ const tid = idTokenClaims?.tid || "";
289
+ // for hybrid + native bridge enablement, send back the native account Id
290
+ if (serverTokenResponse?.spa_accountid && !!cacheRecord.account) {
291
+ cacheRecord.account.nativeAccountId =
292
+ serverTokenResponse?.spa_accountid;
293
+ }
294
+ const accountInfo = cacheRecord.account
295
+ ? updateAccountTenantProfileData(cacheRecord.account.getAccountInfo(), undefined, // tenantProfile optional
296
+ idTokenClaims)
297
+ : null;
298
+ return {
299
+ authority: authority.canonicalAuthority,
300
+ uniqueId: uid,
301
+ tenantId: tid,
302
+ scopes: responseScopes,
303
+ account: accountInfo,
304
+ idToken: cacheRecord?.idToken?.secret || "",
305
+ idTokenClaims: idTokenClaims || {},
306
+ accessToken: accessToken,
307
+ fromCache: fromTokenCache,
308
+ expiresOn: expiresOn,
309
+ extExpiresOn: extExpiresOn,
310
+ refreshOn: refreshOn,
311
+ correlationId: request.correlationId,
312
+ requestId: requestId || Constants.EMPTY_STRING,
313
+ familyId: familyId,
314
+ tokenType: cacheRecord.accessToken?.tokenType || Constants.EMPTY_STRING,
315
+ state: requestState
316
+ ? requestState.userRequestState
317
+ : Constants.EMPTY_STRING,
318
+ cloudGraphHostName: cacheRecord.account?.cloudGraphHostName ||
319
+ Constants.EMPTY_STRING,
320
+ msGraphHost: cacheRecord.account?.msGraphHost || Constants.EMPTY_STRING,
321
+ code: serverTokenResponse?.spa_code,
322
+ fromNativeBroker: false,
323
+ };
324
+ }
325
+ }
326
+ function buildAccountToCache(cacheStorage, authority, homeAccountId, idTokenClaims, base64Decode, clientInfo, claimsTenantId, authCodePayload, nativeAccountId, logger) {
327
+ logger?.verbose("setCachedAccount called");
328
+ // Check if base account is already cached
329
+ const accountKeys = cacheStorage.getAccountKeys();
330
+ const baseAccountKey = accountKeys.find((accountKey) => {
331
+ return accountKey.startsWith(homeAccountId);
332
+ });
333
+ let cachedAccount = null;
334
+ if (baseAccountKey) {
335
+ cachedAccount = cacheStorage.getAccount(baseAccountKey, logger);
336
+ }
337
+ const baseAccount = cachedAccount ||
338
+ AccountEntity.createAccount({
339
+ homeAccountId: homeAccountId,
340
+ idTokenClaims: idTokenClaims,
341
+ clientInfo: clientInfo,
342
+ cloudGraphHostName: authCodePayload?.cloud_graph_host_name,
343
+ msGraphHost: authCodePayload?.msgraph_host,
344
+ nativeAccountId: nativeAccountId,
345
+ }, authority, base64Decode);
346
+ const tenantProfiles = baseAccount.tenantProfiles || [];
347
+ if (claimsTenantId &&
348
+ !tenantProfiles.find((tenantProfile) => {
349
+ return tenantProfile.tenantId === claimsTenantId;
350
+ })) {
351
+ const newTenantProfile = buildTenantProfileFromIdTokenClaims(homeAccountId, idTokenClaims);
352
+ tenantProfiles.push(newTenantProfile);
353
+ }
354
+ baseAccount.tenantProfiles = tenantProfiles;
355
+ return baseAccount;
330
356
  }
331
357
 
332
- export { ResponseHandler };
358
+ export { ResponseHandler, buildAccountToCache };
333
359
  //# sourceMappingURL=ResponseHandler.mjs.map