@azure/msal-common 14.6.0-alpha.0 → 14.6.1

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 (212) hide show
  1. package/dist/account/AccountInfo.d.ts +58 -58
  2. package/dist/account/AccountInfo.mjs +59 -59
  3. package/dist/account/AuthToken.d.ts +17 -17
  4. package/dist/account/AuthToken.mjs +58 -58
  5. package/dist/account/CcsCredential.d.ts +9 -9
  6. package/dist/account/CcsCredential.mjs +8 -8
  7. package/dist/account/ClientCredentials.d.ts +14 -14
  8. package/dist/account/ClientInfo.d.ts +18 -18
  9. package/dist/account/ClientInfo.mjs +37 -37
  10. package/dist/account/TokenClaims.d.ts +83 -83
  11. package/dist/account/TokenClaims.mjs +20 -20
  12. package/dist/authority/Authority.d.ts +253 -254
  13. package/dist/authority/Authority.d.ts.map +1 -1
  14. package/dist/authority/Authority.mjs +831 -816
  15. package/dist/authority/Authority.mjs.map +1 -1
  16. package/dist/authority/AuthorityFactory.d.ts +18 -31
  17. package/dist/authority/AuthorityFactory.d.ts.map +1 -1
  18. package/dist/authority/AuthorityFactory.mjs +29 -50
  19. package/dist/authority/AuthorityFactory.mjs.map +1 -1
  20. package/dist/authority/AuthorityMetadata.d.ts +43 -503
  21. package/dist/authority/AuthorityMetadata.d.ts.map +1 -1
  22. package/dist/authority/AuthorityMetadata.mjs +137 -603
  23. package/dist/authority/AuthorityMetadata.mjs.map +1 -1
  24. package/dist/authority/AuthorityOptions.d.ts +27 -27
  25. package/dist/authority/AuthorityOptions.mjs +18 -18
  26. package/dist/authority/AuthorityType.d.ts +10 -10
  27. package/dist/authority/AuthorityType.mjs +13 -13
  28. package/dist/authority/AzureRegion.d.ts +1 -1
  29. package/dist/authority/AzureRegionConfiguration.d.ts +5 -5
  30. package/dist/authority/CloudDiscoveryMetadata.d.ts +5 -5
  31. package/dist/authority/CloudInstanceDiscoveryErrorResponse.d.ts +13 -13
  32. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs +8 -8
  33. package/dist/authority/CloudInstanceDiscoveryResponse.d.ts +9 -9
  34. package/dist/authority/CloudInstanceDiscoveryResponse.mjs +8 -8
  35. package/dist/authority/ImdsOptions.d.ts +5 -5
  36. package/dist/authority/OIDCOptions.d.ts +8 -8
  37. package/dist/authority/OpenIdConfigResponse.d.ts +11 -11
  38. package/dist/authority/OpenIdConfigResponse.mjs +10 -10
  39. package/dist/authority/ProtocolMode.d.ts +8 -8
  40. package/dist/authority/ProtocolMode.mjs +11 -11
  41. package/dist/authority/RegionDiscovery.d.ts +32 -32
  42. package/dist/authority/RegionDiscovery.mjs +106 -106
  43. package/dist/authority/RegionDiscoveryMetadata.d.ts +6 -6
  44. package/dist/broker/nativeBroker/INativeBrokerPlugin.d.ts +15 -15
  45. package/dist/cache/CacheManager.d.ts +508 -508
  46. package/dist/cache/CacheManager.mjs +1237 -1237
  47. package/dist/cache/entities/AccessTokenEntity.d.ts +25 -25
  48. package/dist/cache/entities/AccountEntity.d.ts +106 -106
  49. package/dist/cache/entities/AccountEntity.mjs +244 -244
  50. package/dist/cache/entities/AppMetadataEntity.d.ts +11 -39
  51. package/dist/cache/entities/AppMetadataEntity.d.ts.map +1 -1
  52. package/dist/cache/entities/AuthorityMetadataEntity.d.ts +15 -48
  53. package/dist/cache/entities/AuthorityMetadataEntity.d.ts.map +1 -1
  54. package/dist/cache/entities/CacheRecord.d.ts +14 -14
  55. package/dist/cache/entities/CacheRecord.mjs +14 -14
  56. package/dist/cache/entities/CredentialEntity.d.ts +30 -30
  57. package/dist/cache/entities/IdTokenEntity.d.ts +8 -8
  58. package/dist/cache/entities/RefreshTokenEntity.d.ts +7 -7
  59. package/dist/cache/entities/ServerTelemetryEntity.d.ts +5 -5
  60. package/dist/cache/entities/ThrottlingEntity.d.ts +7 -7
  61. package/dist/cache/interface/ICacheManager.d.ts +166 -166
  62. package/dist/cache/interface/ICachePlugin.d.ts +5 -5
  63. package/dist/cache/interface/ISerializableTokenCache.d.ts +4 -4
  64. package/dist/cache/persistence/TokenCacheContext.d.ts +23 -23
  65. package/dist/cache/persistence/TokenCacheContext.mjs +25 -25
  66. package/dist/cache/utils/CacheHelpers.d.ts +94 -70
  67. package/dist/cache/utils/CacheHelpers.d.ts.map +1 -1
  68. package/dist/cache/utils/CacheHelpers.mjs +326 -252
  69. package/dist/cache/utils/CacheHelpers.mjs.map +1 -1
  70. package/dist/cache/utils/CacheTypes.d.ts +69 -69
  71. package/dist/client/AuthorizationCodeClient.d.ts +74 -74
  72. package/dist/client/AuthorizationCodeClient.mjs +402 -402
  73. package/dist/client/BaseClient.d.ts +51 -51
  74. package/dist/client/BaseClient.d.ts.map +1 -1
  75. package/dist/client/BaseClient.mjs +101 -101
  76. package/dist/client/BaseClient.mjs.map +1 -1
  77. package/dist/client/RefreshTokenClient.d.ts +35 -35
  78. package/dist/client/RefreshTokenClient.mjs +204 -204
  79. package/dist/client/SilentFlowClient.d.ts +27 -27
  80. package/dist/client/SilentFlowClient.mjs +128 -128
  81. package/dist/config/AppTokenProvider.d.ts +38 -38
  82. package/dist/config/ClientConfiguration.d.ts +150 -150
  83. package/dist/config/ClientConfiguration.d.ts.map +1 -1
  84. package/dist/config/ClientConfiguration.mjs +98 -96
  85. package/dist/config/ClientConfiguration.mjs.map +1 -1
  86. package/dist/constants/AADServerParamKeys.d.ts +52 -52
  87. package/dist/constants/AADServerParamKeys.mjs +56 -56
  88. package/dist/crypto/ICrypto.d.ts +58 -58
  89. package/dist/crypto/ICrypto.mjs +30 -30
  90. package/dist/crypto/IGuidGenerator.d.ts +4 -4
  91. package/dist/crypto/JoseHeader.d.ts +22 -22
  92. package/dist/crypto/JoseHeader.mjs +37 -37
  93. package/dist/crypto/PopTokenGenerator.d.ts +60 -60
  94. package/dist/crypto/PopTokenGenerator.mjs +82 -82
  95. package/dist/crypto/SignedHttpRequest.d.ts +15 -15
  96. package/dist/error/AuthError.d.ts +44 -44
  97. package/dist/error/AuthError.mjs +46 -46
  98. package/dist/error/AuthErrorCodes.d.ts +5 -5
  99. package/dist/error/AuthErrorCodes.mjs +9 -9
  100. package/dist/error/ClientAuthError.d.ts +237 -237
  101. package/dist/error/ClientAuthError.mjs +249 -249
  102. package/dist/error/ClientAuthErrorCodes.d.ts +44 -44
  103. package/dist/error/ClientAuthErrorCodes.mjs +48 -48
  104. package/dist/error/ClientConfigurationError.d.ts +128 -128
  105. package/dist/error/ClientConfigurationError.mjs +135 -135
  106. package/dist/error/ClientConfigurationErrorCodes.d.ts +22 -22
  107. package/dist/error/ClientConfigurationErrorCodes.mjs +26 -26
  108. package/dist/error/InteractionRequiredAuthError.d.ts +61 -61
  109. package/dist/error/InteractionRequiredAuthError.mjs +84 -84
  110. package/dist/error/InteractionRequiredAuthErrorCodes.d.ts +7 -7
  111. package/dist/error/InteractionRequiredAuthErrorCodes.mjs +13 -13
  112. package/dist/error/JoseHeaderError.d.ts +15 -15
  113. package/dist/error/JoseHeaderError.mjs +22 -22
  114. package/dist/error/JoseHeaderErrorCodes.d.ts +2 -2
  115. package/dist/error/JoseHeaderErrorCodes.mjs +6 -6
  116. package/dist/error/ServerError.d.ts +7 -7
  117. package/dist/error/ServerError.mjs +14 -14
  118. package/dist/index.cjs +8081 -8611
  119. package/dist/index.cjs.map +1 -1
  120. package/dist/index.d.ts +99 -99
  121. package/dist/index.d.ts.map +1 -1
  122. package/dist/index.mjs +4 -5
  123. package/dist/index.mjs.map +1 -1
  124. package/dist/logger/Logger.d.ts +95 -95
  125. package/dist/logger/Logger.mjs +188 -188
  126. package/dist/network/INetworkModule.d.ts +29 -29
  127. package/dist/network/INetworkModule.mjs +12 -12
  128. package/dist/network/NetworkManager.d.ts +33 -33
  129. package/dist/network/NetworkManager.mjs +34 -34
  130. package/dist/network/RequestThumbprint.d.ts +18 -18
  131. package/dist/network/ThrottlingUtils.d.ts +42 -42
  132. package/dist/network/ThrottlingUtils.mjs +95 -95
  133. package/dist/packageMetadata.d.ts +2 -2
  134. package/dist/packageMetadata.d.ts.map +1 -1
  135. package/dist/packageMetadata.mjs +4 -4
  136. package/dist/request/AuthenticationHeaderParser.d.ts +19 -19
  137. package/dist/request/AuthenticationHeaderParser.mjs +55 -55
  138. package/dist/request/BaseAuthRequest.d.ts +43 -43
  139. package/dist/request/CommonAuthorizationCodeRequest.d.ts +27 -27
  140. package/dist/request/CommonAuthorizationUrlRequest.d.ts +50 -50
  141. package/dist/request/CommonClientCredentialRequest.d.ts +17 -17
  142. package/dist/request/CommonDeviceCodeRequest.d.ts +21 -21
  143. package/dist/request/CommonEndSessionRequest.d.ts +21 -21
  144. package/dist/request/CommonOnBehalfOfRequest.d.ts +13 -13
  145. package/dist/request/CommonRefreshTokenRequest.d.ts +22 -22
  146. package/dist/request/CommonSilentFlowRequest.d.ts +27 -27
  147. package/dist/request/CommonUsernamePasswordRequest.d.ts +17 -17
  148. package/dist/request/NativeRequest.d.ts +19 -19
  149. package/dist/request/NativeSignOutRequest.d.ts +5 -5
  150. package/dist/request/RequestParameterBuilder.d.ts +217 -217
  151. package/dist/request/RequestParameterBuilder.mjs +381 -381
  152. package/dist/request/RequestValidator.d.ts +33 -33
  153. package/dist/request/RequestValidator.mjs +81 -81
  154. package/dist/request/ScopeSet.d.ts +88 -88
  155. package/dist/request/ScopeSet.mjs +197 -197
  156. package/dist/request/StoreInCache.d.ts +8 -8
  157. package/dist/response/AuthenticationResult.d.ts +41 -41
  158. package/dist/response/AuthorizationCodePayload.d.ts +13 -13
  159. package/dist/response/DeviceCodeResponse.d.ts +25 -25
  160. package/dist/response/ExternalTokenResponse.d.ts +15 -15
  161. package/dist/response/IMDSBadResponse.d.ts +4 -4
  162. package/dist/response/ResponseHandler.d.ts +69 -69
  163. package/dist/response/ResponseHandler.mjs +350 -347
  164. package/dist/response/ResponseHandler.mjs.map +1 -1
  165. package/dist/response/ServerAuthorizationCodeResponse.d.ts +25 -25
  166. package/dist/response/ServerAuthorizationTokenResponse.d.ts +47 -47
  167. package/dist/telemetry/performance/IPerformanceClient.d.ts +57 -57
  168. package/dist/telemetry/performance/IPerformanceMeasurement.d.ts +5 -5
  169. package/dist/telemetry/performance/PerformanceClient.d.ts +198 -198
  170. package/dist/telemetry/performance/PerformanceClient.mjs +412 -412
  171. package/dist/telemetry/performance/PerformanceEvent.d.ts +464 -464
  172. package/dist/telemetry/performance/PerformanceEvent.mjs +253 -253
  173. package/dist/telemetry/performance/StubPerformanceClient.d.ts +24 -24
  174. package/dist/telemetry/performance/StubPerformanceClient.mjs +76 -76
  175. package/dist/telemetry/server/ServerTelemetryManager.d.ts +66 -66
  176. package/dist/telemetry/server/ServerTelemetryManager.mjs +201 -201
  177. package/dist/telemetry/server/ServerTelemetryRequest.d.ts +8 -8
  178. package/dist/url/IUri.d.ts +12 -12
  179. package/dist/url/UrlString.d.ts +48 -48
  180. package/dist/url/UrlString.mjs +161 -161
  181. package/dist/utils/Constants.d.ts +296 -298
  182. package/dist/utils/Constants.d.ts.map +1 -1
  183. package/dist/utils/Constants.mjs +310 -313
  184. package/dist/utils/Constants.mjs.map +1 -1
  185. package/dist/utils/FunctionWrappers.d.ts +27 -27
  186. package/dist/utils/FunctionWrappers.mjs +84 -84
  187. package/dist/utils/MsalTypes.d.ts +6 -6
  188. package/dist/utils/ProtocolUtils.d.ts +42 -42
  189. package/dist/utils/ProtocolUtils.mjs +69 -69
  190. package/dist/utils/StringUtils.d.ts +40 -40
  191. package/dist/utils/StringUtils.mjs +95 -95
  192. package/dist/utils/TimeUtils.d.ts +27 -27
  193. package/dist/utils/TimeUtils.mjs +45 -45
  194. package/dist/utils/UrlUtils.d.ts +10 -10
  195. package/dist/utils/UrlUtils.mjs +44 -44
  196. package/package.json +1 -1
  197. package/src/authority/Authority.ts +69 -29
  198. package/src/authority/AuthorityFactory.ts +48 -92
  199. package/src/authority/AuthorityMetadata.ts +23 -526
  200. package/src/cache/entities/AppMetadataEntity.ts +6 -81
  201. package/src/cache/entities/AuthorityMetadataEntity.ts +2 -94
  202. package/src/cache/utils/CacheHelpers.ts +111 -0
  203. package/src/client/BaseClient.ts +10 -11
  204. package/src/config/ClientConfiguration.ts +4 -4
  205. package/src/index.ts +1 -2
  206. package/src/packageMetadata.ts +1 -1
  207. package/src/response/ResponseHandler.ts +5 -5
  208. package/src/utils/Constants.ts +0 -4
  209. package/dist/cache/entities/AppMetadataEntity.mjs +0 -73
  210. package/dist/cache/entities/AppMetadataEntity.mjs.map +0 -1
  211. package/dist/cache/entities/AuthorityMetadataEntity.mjs +0 -86
  212. package/dist/cache/entities/AuthorityMetadataEntity.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- /*! @azure/msal-common v14.6.0-alpha.0 2023-12-15 */
1
+ /*! @azure/msal-common v14.6.1 2024-01-23 */
2
2
  'use strict';
3
3
  import { isOidcProtocolMode } from '../config/ClientConfiguration.mjs';
4
4
  import { BaseClient } from './BaseClient.mjs';
@@ -23,209 +23,209 @@ import { tokenRequestEmpty, missingSshJwk } from '../error/ClientConfigurationEr
23
23
  import { noAccountInSilentRequest } from '../error/ClientAuthErrorCodes.mjs';
24
24
  import { noTokensFound, refreshTokenExpired, badToken } from '../error/InteractionRequiredAuthErrorCodes.mjs';
25
25
 
26
- /*
27
- * Copyright (c) Microsoft Corporation. All rights reserved.
28
- * Licensed under the MIT License.
29
- */
30
- const DEFAULT_REFRESH_TOKEN_EXPIRATION_OFFSET_SECONDS = 300; // 5 Minutes
31
- /**
32
- * OAuth2.0 refresh token client
33
- * @internal
34
- */
35
- class RefreshTokenClient extends BaseClient {
36
- constructor(configuration, performanceClient) {
37
- super(configuration, performanceClient);
38
- }
39
- async acquireToken(request) {
40
- this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientAcquireToken, request.correlationId);
41
- const reqTimestamp = TimeUtils.nowSeconds();
42
- const response = await invokeAsync(this.executeTokenRequest.bind(this), PerformanceEvents.RefreshTokenClientExecuteTokenRequest, this.logger, this.performanceClient, request.correlationId)(request, this.authority);
43
- // Retrieve requestId from response headers
44
- const requestId = response.headers?.[HeaderNames.X_MS_REQUEST_ID];
45
- const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
46
- responseHandler.validateTokenResponse(response.body);
47
- return invokeAsync(responseHandler.handleServerTokenResponse.bind(responseHandler), PerformanceEvents.HandleServerTokenResponse, this.logger, this.performanceClient, request.correlationId)(response.body, this.authority, reqTimestamp, request, undefined, undefined, true, request.forceCache, requestId);
48
- }
49
- /**
50
- * Gets cached refresh token and attaches to request, then calls acquireToken API
51
- * @param request
52
- */
53
- async acquireTokenByRefreshToken(request) {
54
- // Cannot renew token if no request object is given.
55
- if (!request) {
56
- throw createClientConfigurationError(tokenRequestEmpty);
57
- }
58
- this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientAcquireTokenByRefreshToken, request.correlationId);
59
- // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases
60
- if (!request.account) {
61
- throw createClientAuthError(noAccountInSilentRequest);
62
- }
63
- // try checking if FOCI is enabled for the given application
64
- const isFOCI = this.cacheManager.isAppMetadataFOCI(request.account.environment);
65
- // if the app is part of the family, retrive a Family refresh token if present and make a refreshTokenRequest
66
- if (isFOCI) {
67
- try {
68
- return await invokeAsync(this.acquireTokenWithCachedRefreshToken.bind(this), PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, this.logger, this.performanceClient, request.correlationId)(request, true);
69
- }
70
- catch (e) {
71
- const noFamilyRTInCache = e instanceof InteractionRequiredAuthError &&
72
- e.errorCode ===
73
- noTokensFound;
74
- const clientMismatchErrorWithFamilyRT = e instanceof ServerError &&
75
- e.errorCode === Errors.INVALID_GRANT_ERROR &&
76
- e.subError === Errors.CLIENT_MISMATCH_ERROR;
77
- // if family Refresh Token (FRT) cache acquisition fails or if client_mismatch error is seen with FRT, reattempt with application Refresh Token (ART)
78
- if (noFamilyRTInCache || clientMismatchErrorWithFamilyRT) {
79
- return invokeAsync(this.acquireTokenWithCachedRefreshToken.bind(this), PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, this.logger, this.performanceClient, request.correlationId)(request, false);
80
- // throw in all other cases
81
- }
82
- else {
83
- throw e;
84
- }
85
- }
86
- }
87
- // fall back to application refresh token acquisition
88
- return invokeAsync(this.acquireTokenWithCachedRefreshToken.bind(this), PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, this.logger, this.performanceClient, request.correlationId)(request, false);
89
- }
90
- /**
91
- * makes a network call to acquire tokens by exchanging RefreshToken available in userCache; throws if refresh token is not cached
92
- * @param request
93
- */
94
- async acquireTokenWithCachedRefreshToken(request, foci) {
95
- this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, request.correlationId);
96
- // fetches family RT or application RT based on FOCI value
97
- const refreshToken = invoke(this.cacheManager.getRefreshToken.bind(this.cacheManager), PerformanceEvents.CacheManagerGetRefreshToken, this.logger, this.performanceClient, request.correlationId)(request.account, foci, undefined, this.performanceClient, request.correlationId);
98
- if (!refreshToken) {
99
- throw createInteractionRequiredAuthError(noTokensFound);
100
- }
101
- if (refreshToken.expiresOn &&
102
- TimeUtils.isTokenExpired(refreshToken.expiresOn, request.refreshTokenExpirationOffsetSeconds ||
103
- DEFAULT_REFRESH_TOKEN_EXPIRATION_OFFSET_SECONDS)) {
104
- throw createInteractionRequiredAuthError(refreshTokenExpired);
105
- }
106
- // attach cached RT size to the current measurement
107
- const refreshTokenRequest = {
108
- ...request,
109
- refreshToken: refreshToken.secret,
110
- authenticationScheme: request.authenticationScheme || AuthenticationScheme.BEARER,
111
- ccsCredential: {
112
- credential: request.account.homeAccountId,
113
- type: CcsCredentialType.HOME_ACCOUNT_ID,
114
- },
115
- };
116
- try {
117
- return await invokeAsync(this.acquireToken.bind(this), PerformanceEvents.RefreshTokenClientAcquireToken, this.logger, this.performanceClient, request.correlationId)(refreshTokenRequest);
118
- }
119
- catch (e) {
120
- if (e instanceof InteractionRequiredAuthError &&
121
- e.subError === badToken) {
122
- // Remove bad refresh token from cache
123
- this.logger.verbose("acquireTokenWithRefreshToken: bad refresh token, removing from cache");
124
- const badRefreshTokenKey = generateCredentialKey(refreshToken);
125
- this.cacheManager.removeRefreshToken(badRefreshTokenKey);
126
- }
127
- throw e;
128
- }
129
- }
130
- /**
131
- * Constructs the network message and makes a NW call to the underlying secure token service
132
- * @param request
133
- * @param authority
134
- */
135
- async executeTokenRequest(request, authority) {
136
- this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientExecuteTokenRequest, request.correlationId);
137
- const queryParametersString = this.createTokenQueryParameters(request);
138
- const endpoint = UrlString.appendQueryString(authority.tokenEndpoint, queryParametersString);
139
- const requestBody = await invokeAsync(this.createTokenRequestBody.bind(this), PerformanceEvents.RefreshTokenClientCreateTokenRequestBody, this.logger, this.performanceClient, request.correlationId)(request);
140
- const headers = this.createTokenRequestHeaders(request.ccsCredential);
141
- const thumbprint = {
142
- clientId: request.tokenBodyParameters?.clientId ||
143
- this.config.authOptions.clientId,
144
- authority: authority.canonicalAuthority,
145
- scopes: request.scopes,
146
- claims: request.claims,
147
- authenticationScheme: request.authenticationScheme,
148
- resourceRequestMethod: request.resourceRequestMethod,
149
- resourceRequestUri: request.resourceRequestUri,
150
- shrClaims: request.shrClaims,
151
- sshKid: request.sshKid,
152
- };
153
- return invokeAsync(this.executePostToTokenEndpoint.bind(this), PerformanceEvents.RefreshTokenClientExecutePostToTokenEndpoint, this.logger, this.performanceClient, request.correlationId)(endpoint, requestBody, headers, thumbprint, request.correlationId, PerformanceEvents.RefreshTokenClientExecutePostToTokenEndpoint);
154
- }
155
- /**
156
- * Helper function to create the token request body
157
- * @param request
158
- */
159
- async createTokenRequestBody(request) {
160
- this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientCreateTokenRequestBody, request.correlationId);
161
- const correlationId = request.correlationId;
162
- const parameterBuilder = new RequestParameterBuilder();
163
- parameterBuilder.addClientId(request.tokenBodyParameters?.[CLIENT_ID] ||
164
- this.config.authOptions.clientId);
165
- if (request.redirectUri) {
166
- parameterBuilder.addRedirectUri(request.redirectUri);
167
- }
168
- parameterBuilder.addScopes(request.scopes, true, this.config.authOptions.authority.options.OIDCOptions?.defaultScopes);
169
- parameterBuilder.addGrantType(GrantType.REFRESH_TOKEN_GRANT);
170
- parameterBuilder.addClientInfo();
171
- parameterBuilder.addLibraryInfo(this.config.libraryInfo);
172
- parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
173
- parameterBuilder.addThrottling();
174
- if (this.serverTelemetryManager && !isOidcProtocolMode(this.config)) {
175
- parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
176
- }
177
- parameterBuilder.addCorrelationId(correlationId);
178
- parameterBuilder.addRefreshToken(request.refreshToken);
179
- if (this.config.clientCredentials.clientSecret) {
180
- parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
181
- }
182
- if (this.config.clientCredentials.clientAssertion) {
183
- const clientAssertion = this.config.clientCredentials.clientAssertion;
184
- parameterBuilder.addClientAssertion(clientAssertion.assertion);
185
- parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
186
- }
187
- if (request.authenticationScheme === AuthenticationScheme.POP) {
188
- const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils, this.performanceClient);
189
- const reqCnfData = await invokeAsync(popTokenGenerator.generateCnf.bind(popTokenGenerator), PerformanceEvents.PopTokenGenerateCnf, this.logger, this.performanceClient, request.correlationId)(request, this.logger);
190
- // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)
191
- parameterBuilder.addPopToken(reqCnfData.reqCnfString);
192
- }
193
- else if (request.authenticationScheme === AuthenticationScheme.SSH) {
194
- if (request.sshJwk) {
195
- parameterBuilder.addSshJwk(request.sshJwk);
196
- }
197
- else {
198
- throw createClientConfigurationError(missingSshJwk);
199
- }
200
- }
201
- if (!StringUtils.isEmptyObj(request.claims) ||
202
- (this.config.authOptions.clientCapabilities &&
203
- this.config.authOptions.clientCapabilities.length > 0)) {
204
- parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
205
- }
206
- if (this.config.systemOptions.preventCorsPreflight &&
207
- request.ccsCredential) {
208
- switch (request.ccsCredential.type) {
209
- case CcsCredentialType.HOME_ACCOUNT_ID:
210
- try {
211
- const clientInfo = buildClientInfoFromHomeAccountId(request.ccsCredential.credential);
212
- parameterBuilder.addCcsOid(clientInfo);
213
- }
214
- catch (e) {
215
- this.logger.verbose("Could not parse home account ID for CCS Header: " +
216
- e);
217
- }
218
- break;
219
- case CcsCredentialType.UPN:
220
- parameterBuilder.addCcsUpn(request.ccsCredential.credential);
221
- break;
222
- }
223
- }
224
- if (request.tokenBodyParameters) {
225
- parameterBuilder.addExtraQueryParameters(request.tokenBodyParameters);
226
- }
227
- return parameterBuilder.createQueryString();
228
- }
26
+ /*
27
+ * Copyright (c) Microsoft Corporation. All rights reserved.
28
+ * Licensed under the MIT License.
29
+ */
30
+ const DEFAULT_REFRESH_TOKEN_EXPIRATION_OFFSET_SECONDS = 300; // 5 Minutes
31
+ /**
32
+ * OAuth2.0 refresh token client
33
+ * @internal
34
+ */
35
+ class RefreshTokenClient extends BaseClient {
36
+ constructor(configuration, performanceClient) {
37
+ super(configuration, performanceClient);
38
+ }
39
+ async acquireToken(request) {
40
+ this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientAcquireToken, request.correlationId);
41
+ const reqTimestamp = TimeUtils.nowSeconds();
42
+ const response = await invokeAsync(this.executeTokenRequest.bind(this), PerformanceEvents.RefreshTokenClientExecuteTokenRequest, this.logger, this.performanceClient, request.correlationId)(request, this.authority);
43
+ // Retrieve requestId from response headers
44
+ const requestId = response.headers?.[HeaderNames.X_MS_REQUEST_ID];
45
+ const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
46
+ responseHandler.validateTokenResponse(response.body);
47
+ return invokeAsync(responseHandler.handleServerTokenResponse.bind(responseHandler), PerformanceEvents.HandleServerTokenResponse, this.logger, this.performanceClient, request.correlationId)(response.body, this.authority, reqTimestamp, request, undefined, undefined, true, request.forceCache, requestId);
48
+ }
49
+ /**
50
+ * Gets cached refresh token and attaches to request, then calls acquireToken API
51
+ * @param request
52
+ */
53
+ async acquireTokenByRefreshToken(request) {
54
+ // Cannot renew token if no request object is given.
55
+ if (!request) {
56
+ throw createClientConfigurationError(tokenRequestEmpty);
57
+ }
58
+ this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientAcquireTokenByRefreshToken, request.correlationId);
59
+ // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases
60
+ if (!request.account) {
61
+ throw createClientAuthError(noAccountInSilentRequest);
62
+ }
63
+ // try checking if FOCI is enabled for the given application
64
+ const isFOCI = this.cacheManager.isAppMetadataFOCI(request.account.environment);
65
+ // if the app is part of the family, retrive a Family refresh token if present and make a refreshTokenRequest
66
+ if (isFOCI) {
67
+ try {
68
+ return await invokeAsync(this.acquireTokenWithCachedRefreshToken.bind(this), PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, this.logger, this.performanceClient, request.correlationId)(request, true);
69
+ }
70
+ catch (e) {
71
+ const noFamilyRTInCache = e instanceof InteractionRequiredAuthError &&
72
+ e.errorCode ===
73
+ noTokensFound;
74
+ const clientMismatchErrorWithFamilyRT = e instanceof ServerError &&
75
+ e.errorCode === Errors.INVALID_GRANT_ERROR &&
76
+ e.subError === Errors.CLIENT_MISMATCH_ERROR;
77
+ // if family Refresh Token (FRT) cache acquisition fails or if client_mismatch error is seen with FRT, reattempt with application Refresh Token (ART)
78
+ if (noFamilyRTInCache || clientMismatchErrorWithFamilyRT) {
79
+ return invokeAsync(this.acquireTokenWithCachedRefreshToken.bind(this), PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, this.logger, this.performanceClient, request.correlationId)(request, false);
80
+ // throw in all other cases
81
+ }
82
+ else {
83
+ throw e;
84
+ }
85
+ }
86
+ }
87
+ // fall back to application refresh token acquisition
88
+ return invokeAsync(this.acquireTokenWithCachedRefreshToken.bind(this), PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, this.logger, this.performanceClient, request.correlationId)(request, false);
89
+ }
90
+ /**
91
+ * makes a network call to acquire tokens by exchanging RefreshToken available in userCache; throws if refresh token is not cached
92
+ * @param request
93
+ */
94
+ async acquireTokenWithCachedRefreshToken(request, foci) {
95
+ this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, request.correlationId);
96
+ // fetches family RT or application RT based on FOCI value
97
+ const refreshToken = invoke(this.cacheManager.getRefreshToken.bind(this.cacheManager), PerformanceEvents.CacheManagerGetRefreshToken, this.logger, this.performanceClient, request.correlationId)(request.account, foci, undefined, this.performanceClient, request.correlationId);
98
+ if (!refreshToken) {
99
+ throw createInteractionRequiredAuthError(noTokensFound);
100
+ }
101
+ if (refreshToken.expiresOn &&
102
+ TimeUtils.isTokenExpired(refreshToken.expiresOn, request.refreshTokenExpirationOffsetSeconds ||
103
+ DEFAULT_REFRESH_TOKEN_EXPIRATION_OFFSET_SECONDS)) {
104
+ throw createInteractionRequiredAuthError(refreshTokenExpired);
105
+ }
106
+ // attach cached RT size to the current measurement
107
+ const refreshTokenRequest = {
108
+ ...request,
109
+ refreshToken: refreshToken.secret,
110
+ authenticationScheme: request.authenticationScheme || AuthenticationScheme.BEARER,
111
+ ccsCredential: {
112
+ credential: request.account.homeAccountId,
113
+ type: CcsCredentialType.HOME_ACCOUNT_ID,
114
+ },
115
+ };
116
+ try {
117
+ return await invokeAsync(this.acquireToken.bind(this), PerformanceEvents.RefreshTokenClientAcquireToken, this.logger, this.performanceClient, request.correlationId)(refreshTokenRequest);
118
+ }
119
+ catch (e) {
120
+ if (e instanceof InteractionRequiredAuthError &&
121
+ e.subError === badToken) {
122
+ // Remove bad refresh token from cache
123
+ this.logger.verbose("acquireTokenWithRefreshToken: bad refresh token, removing from cache");
124
+ const badRefreshTokenKey = generateCredentialKey(refreshToken);
125
+ this.cacheManager.removeRefreshToken(badRefreshTokenKey);
126
+ }
127
+ throw e;
128
+ }
129
+ }
130
+ /**
131
+ * Constructs the network message and makes a NW call to the underlying secure token service
132
+ * @param request
133
+ * @param authority
134
+ */
135
+ async executeTokenRequest(request, authority) {
136
+ this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientExecuteTokenRequest, request.correlationId);
137
+ const queryParametersString = this.createTokenQueryParameters(request);
138
+ const endpoint = UrlString.appendQueryString(authority.tokenEndpoint, queryParametersString);
139
+ const requestBody = await invokeAsync(this.createTokenRequestBody.bind(this), PerformanceEvents.RefreshTokenClientCreateTokenRequestBody, this.logger, this.performanceClient, request.correlationId)(request);
140
+ const headers = this.createTokenRequestHeaders(request.ccsCredential);
141
+ const thumbprint = {
142
+ clientId: request.tokenBodyParameters?.clientId ||
143
+ this.config.authOptions.clientId,
144
+ authority: authority.canonicalAuthority,
145
+ scopes: request.scopes,
146
+ claims: request.claims,
147
+ authenticationScheme: request.authenticationScheme,
148
+ resourceRequestMethod: request.resourceRequestMethod,
149
+ resourceRequestUri: request.resourceRequestUri,
150
+ shrClaims: request.shrClaims,
151
+ sshKid: request.sshKid,
152
+ };
153
+ return invokeAsync(this.executePostToTokenEndpoint.bind(this), PerformanceEvents.RefreshTokenClientExecutePostToTokenEndpoint, this.logger, this.performanceClient, request.correlationId)(endpoint, requestBody, headers, thumbprint, request.correlationId, PerformanceEvents.RefreshTokenClientExecutePostToTokenEndpoint);
154
+ }
155
+ /**
156
+ * Helper function to create the token request body
157
+ * @param request
158
+ */
159
+ async createTokenRequestBody(request) {
160
+ this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientCreateTokenRequestBody, request.correlationId);
161
+ const correlationId = request.correlationId;
162
+ const parameterBuilder = new RequestParameterBuilder();
163
+ parameterBuilder.addClientId(request.tokenBodyParameters?.[CLIENT_ID] ||
164
+ this.config.authOptions.clientId);
165
+ if (request.redirectUri) {
166
+ parameterBuilder.addRedirectUri(request.redirectUri);
167
+ }
168
+ parameterBuilder.addScopes(request.scopes, true, this.config.authOptions.authority.options.OIDCOptions?.defaultScopes);
169
+ parameterBuilder.addGrantType(GrantType.REFRESH_TOKEN_GRANT);
170
+ parameterBuilder.addClientInfo();
171
+ parameterBuilder.addLibraryInfo(this.config.libraryInfo);
172
+ parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
173
+ parameterBuilder.addThrottling();
174
+ if (this.serverTelemetryManager && !isOidcProtocolMode(this.config)) {
175
+ parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
176
+ }
177
+ parameterBuilder.addCorrelationId(correlationId);
178
+ parameterBuilder.addRefreshToken(request.refreshToken);
179
+ if (this.config.clientCredentials.clientSecret) {
180
+ parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
181
+ }
182
+ if (this.config.clientCredentials.clientAssertion) {
183
+ const clientAssertion = this.config.clientCredentials.clientAssertion;
184
+ parameterBuilder.addClientAssertion(clientAssertion.assertion);
185
+ parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
186
+ }
187
+ if (request.authenticationScheme === AuthenticationScheme.POP) {
188
+ const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils, this.performanceClient);
189
+ const reqCnfData = await invokeAsync(popTokenGenerator.generateCnf.bind(popTokenGenerator), PerformanceEvents.PopTokenGenerateCnf, this.logger, this.performanceClient, request.correlationId)(request, this.logger);
190
+ // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)
191
+ parameterBuilder.addPopToken(reqCnfData.reqCnfString);
192
+ }
193
+ else if (request.authenticationScheme === AuthenticationScheme.SSH) {
194
+ if (request.sshJwk) {
195
+ parameterBuilder.addSshJwk(request.sshJwk);
196
+ }
197
+ else {
198
+ throw createClientConfigurationError(missingSshJwk);
199
+ }
200
+ }
201
+ if (!StringUtils.isEmptyObj(request.claims) ||
202
+ (this.config.authOptions.clientCapabilities &&
203
+ this.config.authOptions.clientCapabilities.length > 0)) {
204
+ parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
205
+ }
206
+ if (this.config.systemOptions.preventCorsPreflight &&
207
+ request.ccsCredential) {
208
+ switch (request.ccsCredential.type) {
209
+ case CcsCredentialType.HOME_ACCOUNT_ID:
210
+ try {
211
+ const clientInfo = buildClientInfoFromHomeAccountId(request.ccsCredential.credential);
212
+ parameterBuilder.addCcsOid(clientInfo);
213
+ }
214
+ catch (e) {
215
+ this.logger.verbose("Could not parse home account ID for CCS Header: " +
216
+ e);
217
+ }
218
+ break;
219
+ case CcsCredentialType.UPN:
220
+ parameterBuilder.addCcsUpn(request.ccsCredential.credential);
221
+ break;
222
+ }
223
+ }
224
+ if (request.tokenBodyParameters) {
225
+ parameterBuilder.addExtraQueryParameters(request.tokenBodyParameters);
226
+ }
227
+ return parameterBuilder.createQueryString();
228
+ }
229
229
  }
230
230
 
231
231
  export { RefreshTokenClient };
@@ -1,28 +1,28 @@
1
- import { BaseClient } from "./BaseClient";
2
- import { ClientConfiguration } from "../config/ClientConfiguration";
3
- import { CommonSilentFlowRequest } from "../request/CommonSilentFlowRequest";
4
- import { AuthenticationResult } from "../response/AuthenticationResult";
5
- import { CacheOutcome } from "../utils/Constants";
6
- import { IPerformanceClient } from "../telemetry/performance/IPerformanceClient";
7
- /** @internal */
8
- export declare class SilentFlowClient extends BaseClient {
9
- constructor(configuration: ClientConfiguration, performanceClient?: IPerformanceClient);
10
- /**
11
- * Retrieves a token from cache if it is still valid, or uses the cached refresh token to renew
12
- * the given token and returns the renewed token
13
- * @param request
14
- */
15
- acquireToken(request: CommonSilentFlowRequest): Promise<AuthenticationResult>;
16
- /**
17
- * Retrieves token from cache or throws an error if it must be refreshed.
18
- * @param request
19
- */
20
- acquireCachedToken(request: CommonSilentFlowRequest): Promise<[AuthenticationResult, CacheOutcome]>;
21
- private setCacheOutcome;
22
- /**
23
- * Helper function to build response object from the CacheRecord
24
- * @param cacheRecord
25
- */
26
- private generateResultFromCacheRecord;
27
- }
1
+ import { BaseClient } from "./BaseClient";
2
+ import { ClientConfiguration } from "../config/ClientConfiguration";
3
+ import { CommonSilentFlowRequest } from "../request/CommonSilentFlowRequest";
4
+ import { AuthenticationResult } from "../response/AuthenticationResult";
5
+ import { CacheOutcome } from "../utils/Constants";
6
+ import { IPerformanceClient } from "../telemetry/performance/IPerformanceClient";
7
+ /** @internal */
8
+ export declare class SilentFlowClient extends BaseClient {
9
+ constructor(configuration: ClientConfiguration, performanceClient?: IPerformanceClient);
10
+ /**
11
+ * Retrieves a token from cache if it is still valid, or uses the cached refresh token to renew
12
+ * the given token and returns the renewed token
13
+ * @param request
14
+ */
15
+ acquireToken(request: CommonSilentFlowRequest): Promise<AuthenticationResult>;
16
+ /**
17
+ * Retrieves token from cache or throws an error if it must be refreshed.
18
+ * @param request
19
+ */
20
+ acquireCachedToken(request: CommonSilentFlowRequest): Promise<[AuthenticationResult, CacheOutcome]>;
21
+ private setCacheOutcome;
22
+ /**
23
+ * Helper function to build response object from the CacheRecord
24
+ * @param cacheRecord
25
+ */
26
+ private generateResultFromCacheRecord;
27
+ }
28
28
  //# sourceMappingURL=SilentFlowClient.d.ts.map