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