@azure/msal-browser 3.0.0-alpha.1 → 3.0.0-alpha.2

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 (142) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +213 -213
  3. package/dist/app/IPublicClientApplication.d.ts +45 -45
  4. package/dist/app/IPublicClientApplication.js +96 -96
  5. package/dist/app/PublicClientApplication.d.ts +244 -244
  6. package/dist/app/PublicClientApplication.js +307 -307
  7. package/dist/broker/nativeBroker/NativeMessageHandler.d.ts +63 -63
  8. package/dist/broker/nativeBroker/NativeMessageHandler.js +255 -255
  9. package/dist/broker/nativeBroker/NativeRequest.d.ts +43 -43
  10. package/dist/broker/nativeBroker/NativeResponse.d.ts +48 -48
  11. package/dist/cache/AsyncMemoryStorage.d.ts +51 -51
  12. package/dist/cache/AsyncMemoryStorage.js +132 -132
  13. package/dist/cache/BrowserCacheManager.d.ts +377 -377
  14. package/dist/cache/BrowserCacheManager.js +1276 -1276
  15. package/dist/cache/BrowserStorage.d.ts +11 -11
  16. package/dist/cache/BrowserStorage.js +35 -35
  17. package/dist/cache/CryptoKeyStore.d.ts +17 -17
  18. package/dist/cache/CryptoKeyStore.js +41 -41
  19. package/dist/cache/DatabaseStorage.d.ts +56 -56
  20. package/dist/cache/DatabaseStorage.js +190 -190
  21. package/dist/cache/IAsyncMemoryStorage.d.ts +27 -27
  22. package/dist/cache/ITokenCache.d.ts +10 -10
  23. package/dist/cache/IWindowStorage.d.ts +27 -27
  24. package/dist/cache/MemoryStorage.d.ts +11 -11
  25. package/dist/cache/MemoryStorage.js +31 -31
  26. package/dist/cache/TokenCache.d.ts +76 -76
  27. package/dist/cache/TokenCache.js +225 -225
  28. package/dist/config/Configuration.d.ts +203 -203
  29. package/dist/config/Configuration.js +101 -101
  30. package/dist/controllers/ControllerFactory.d.ts +9 -9
  31. package/dist/controllers/ControllerFactory.js +37 -37
  32. package/dist/controllers/IController.d.ts +66 -66
  33. package/dist/controllers/StandardController.d.ts +413 -413
  34. package/dist/controllers/StandardController.js +1272 -1272
  35. package/dist/crypto/BrowserCrypto.d.ts +61 -61
  36. package/dist/crypto/BrowserCrypto.js +131 -131
  37. package/dist/crypto/CryptoOps.d.ts +73 -73
  38. package/dist/crypto/CryptoOps.js +150 -150
  39. package/dist/crypto/GuidGenerator.d.ts +12 -12
  40. package/dist/crypto/GuidGenerator.js +96 -96
  41. package/dist/crypto/ISubtleCrypto.d.ts +9 -9
  42. package/dist/crypto/ModernBrowserCrypto.d.ts +9 -9
  43. package/dist/crypto/ModernBrowserCrypto.js +24 -24
  44. package/dist/crypto/MsBrowserCrypto.d.ts +9 -9
  45. package/dist/crypto/MsBrowserCrypto.js +79 -79
  46. package/dist/crypto/MsrBrowserCrypto.d.ts +17 -17
  47. package/dist/crypto/MsrBrowserCrypto.js +28 -28
  48. package/dist/crypto/PkceGenerator.d.ts +24 -24
  49. package/dist/crypto/PkceGenerator.js +58 -58
  50. package/dist/crypto/SignedHttpRequest.d.ts +30 -30
  51. package/dist/crypto/SignedHttpRequest.js +39 -39
  52. package/dist/encode/Base64Decode.d.ts +22 -22
  53. package/dist/encode/Base64Decode.js +73 -73
  54. package/dist/encode/Base64Encode.d.ts +31 -31
  55. package/dist/encode/Base64Encode.js +79 -79
  56. package/dist/error/BrowserAuthError.d.ts +382 -382
  57. package/dist/error/BrowserAuthError.js +483 -483
  58. package/dist/error/BrowserConfigurationAuthError.d.ts +70 -70
  59. package/dist/error/BrowserConfigurationAuthError.js +96 -96
  60. package/dist/error/NativeAuthError.d.ts +56 -56
  61. package/dist/error/NativeAuthError.js +88 -88
  62. package/dist/event/EventHandler.d.ts +41 -41
  63. package/dist/event/EventHandler.js +119 -119
  64. package/dist/event/EventMessage.d.ts +25 -25
  65. package/dist/event/EventMessage.js +67 -67
  66. package/dist/event/EventType.d.ts +26 -26
  67. package/dist/event/EventType.js +31 -31
  68. package/dist/index.d.ts +35 -35
  69. package/dist/index.js +1 -1
  70. package/dist/interaction_client/BaseInteractionClient.d.ts +52 -52
  71. package/dist/interaction_client/BaseInteractionClient.js +138 -138
  72. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.d.ts +4 -4
  73. package/dist/interaction_client/HybridSpaAuthorizationCodeClient.js +10 -10
  74. package/dist/interaction_client/NativeInteractionClient.d.ts +148 -148
  75. package/dist/interaction_client/NativeInteractionClient.js +516 -516
  76. package/dist/interaction_client/PopupClient.d.ts +111 -111
  77. package/dist/interaction_client/PopupClient.js +476 -476
  78. package/dist/interaction_client/RedirectClient.d.ts +48 -48
  79. package/dist/interaction_client/RedirectClient.js +290 -290
  80. package/dist/interaction_client/SilentAuthCodeClient.d.ts +22 -22
  81. package/dist/interaction_client/SilentAuthCodeClient.js +62 -62
  82. package/dist/interaction_client/SilentCacheClient.d.ts +21 -21
  83. package/dist/interaction_client/SilentCacheClient.js +67 -67
  84. package/dist/interaction_client/SilentIframeClient.d.ts +31 -31
  85. package/dist/interaction_client/SilentIframeClient.js +127 -127
  86. package/dist/interaction_client/SilentRefreshClient.d.ts +19 -19
  87. package/dist/interaction_client/SilentRefreshClient.js +62 -62
  88. package/dist/interaction_client/StandardInteractionClient.d.ts +59 -59
  89. package/dist/interaction_client/StandardInteractionClient.js +259 -259
  90. package/dist/interaction_handler/InteractionHandler.d.ts +39 -39
  91. package/dist/interaction_handler/InteractionHandler.js +127 -127
  92. package/dist/interaction_handler/RedirectHandler.d.ts +24 -24
  93. package/dist/interaction_handler/RedirectHandler.js +118 -118
  94. package/dist/interaction_handler/SilentHandler.d.ts +47 -47
  95. package/dist/interaction_handler/SilentHandler.js +162 -162
  96. package/dist/internals.d.ts +23 -23
  97. package/dist/internals.js +4 -4
  98. package/dist/navigation/INavigationClient.d.ts +16 -16
  99. package/dist/navigation/NavigationClient.d.ts +22 -22
  100. package/dist/navigation/NavigationClient.js +40 -40
  101. package/dist/navigation/NavigationOptions.d.ts +12 -12
  102. package/dist/network/FetchClient.d.ts +26 -26
  103. package/dist/network/FetchClient.js +99 -99
  104. package/dist/network/XhrClient.d.ts +40 -40
  105. package/dist/network/XhrClient.js +117 -117
  106. package/dist/operatingcontext/BaseOperatingContext.d.ts +40 -40
  107. package/dist/operatingcontext/BaseOperatingContext.js +44 -44
  108. package/dist/operatingcontext/StandardOperatingContext.d.ts +25 -25
  109. package/dist/operatingcontext/StandardOperatingContext.js +43 -43
  110. package/dist/operatingcontext/TeamsAppOperatingContext.d.ts +25 -25
  111. package/dist/operatingcontext/TeamsAppOperatingContext.js +42 -42
  112. package/dist/packageMetadata.d.ts +2 -2
  113. package/dist/packageMetadata.js +4 -4
  114. package/dist/request/AuthorizationCodeRequest.d.ts +8 -8
  115. package/dist/request/AuthorizationUrlRequest.d.ts +8 -8
  116. package/dist/request/EndSessionPopupRequest.d.ts +18 -18
  117. package/dist/request/EndSessionRequest.d.ts +15 -15
  118. package/dist/request/PopupRequest.d.ts +32 -32
  119. package/dist/request/PopupWindowAttributes.d.ts +15 -15
  120. package/dist/request/RedirectRequest.d.ts +33 -33
  121. package/dist/request/SilentRequest.d.ts +30 -30
  122. package/dist/request/SsoSilentRequest.d.ts +26 -26
  123. package/dist/telemetry/BrowserPerformanceClient.d.ts +38 -38
  124. package/dist/telemetry/BrowserPerformanceClient.js +124 -124
  125. package/dist/telemetry/BrowserPerformanceMeasurement.d.ts +21 -21
  126. package/dist/telemetry/BrowserPerformanceMeasurement.js +92 -92
  127. package/dist/utils/BrowserConstants.d.ts +166 -166
  128. package/dist/utils/BrowserConstants.js +214 -214
  129. package/dist/utils/BrowserProtocolUtils.d.ts +18 -18
  130. package/dist/utils/BrowserProtocolUtils.js +34 -34
  131. package/dist/utils/BrowserStringUtils.d.ts +26 -26
  132. package/dist/utils/BrowserStringUtils.js +149 -149
  133. package/dist/utils/BrowserUtils.d.ts +65 -65
  134. package/dist/utils/BrowserUtils.js +138 -138
  135. package/dist/utils/MathUtils.d.ts +11 -11
  136. package/dist/utils/MathUtils.js +21 -21
  137. package/lib/msal-browser.cjs.js +18383 -0
  138. package/lib/msal-browser.cjs.js.map +1 -0
  139. package/lib/msal-browser.js +18389 -0
  140. package/lib/msal-browser.js.map +1 -0
  141. package/lib/msal-browser.min.js +74 -0
  142. package/package.json +97 -95
@@ -1,77 +1,77 @@
1
- import { ICrypto, Logger, ExternalTokenResponse, AuthenticationResult } from "@azure/msal-common";
2
- import { BrowserConfiguration } from "../config/Configuration";
3
- import { SilentRequest } from "../request/SilentRequest";
4
- import { BrowserCacheManager } from "./BrowserCacheManager";
5
- import { ITokenCache } from "./ITokenCache";
6
- export type LoadTokenOptions = {
7
- clientInfo?: string;
8
- expiresOn?: number;
9
- extendedExpiresOn?: number;
10
- };
11
- /**
12
- * Token cache manager
13
- */
14
- export declare class TokenCache implements ITokenCache {
15
- isBrowserEnvironment: boolean;
16
- protected config: BrowserConfiguration;
17
- private storage;
18
- private logger;
19
- private cryptoObj;
20
- constructor(configuration: BrowserConfiguration, storage: BrowserCacheManager, logger: Logger, cryptoObj: ICrypto);
21
- /**
22
- * API to load tokens to msal-browser cache.
23
- * @param request
24
- * @param response
25
- * @param options
26
- * @returns `AuthenticationResult` for the response that was loaded.
27
- */
28
- loadExternalTokens(request: SilentRequest, response: ExternalTokenResponse, options: LoadTokenOptions): AuthenticationResult;
29
- /**
30
- * Helper function to load account to msal-browser cache
31
- * @param idToken
32
- * @param environment
33
- * @param clientInfo
34
- * @param authorityType
35
- * @param requestHomeAccountId
36
- * @returns `AccountEntity`
37
- */
38
- private loadAccount;
39
- /**
40
- * Helper function to load id tokens to msal-browser cache
41
- * @param idToken
42
- * @param homeAccountId
43
- * @param environment
44
- * @param tenantId
45
- * @returns `IdTokenEntity`
46
- */
47
- private loadIdToken;
48
- /**
49
- * Helper function to load access tokens to msal-browser cache
50
- * @param request
51
- * @param response
52
- * @param homeAccountId
53
- * @param environment
54
- * @param tenantId
55
- * @returns `AccessTokenEntity`
56
- */
57
- private loadAccessToken;
58
- /**
59
- * Helper function to load refresh tokens to msal-browser cache
60
- * @param request
61
- * @param response
62
- * @param homeAccountId
63
- * @param environment
64
- * @returns `RefreshTokenEntity`
65
- */
66
- private loadRefreshToken;
67
- /**
68
- * Helper function to generate an `AuthenticationResult` for the result.
69
- * @param request
70
- * @param idTokenObj
71
- * @param cacheRecord
72
- * @param authority
73
- * @returns `AuthenticationResult`
74
- */
75
- private generateAuthenticationResult;
76
- }
1
+ import { ICrypto, Logger, ExternalTokenResponse, AuthenticationResult } from "@azure/msal-common";
2
+ import { BrowserConfiguration } from "../config/Configuration";
3
+ import { SilentRequest } from "../request/SilentRequest";
4
+ import { BrowserCacheManager } from "./BrowserCacheManager";
5
+ import { ITokenCache } from "./ITokenCache";
6
+ export type LoadTokenOptions = {
7
+ clientInfo?: string;
8
+ expiresOn?: number;
9
+ extendedExpiresOn?: number;
10
+ };
11
+ /**
12
+ * Token cache manager
13
+ */
14
+ export declare class TokenCache implements ITokenCache {
15
+ isBrowserEnvironment: boolean;
16
+ protected config: BrowserConfiguration;
17
+ private storage;
18
+ private logger;
19
+ private cryptoObj;
20
+ constructor(configuration: BrowserConfiguration, storage: BrowserCacheManager, logger: Logger, cryptoObj: ICrypto);
21
+ /**
22
+ * API to load tokens to msal-browser cache.
23
+ * @param request
24
+ * @param response
25
+ * @param options
26
+ * @returns `AuthenticationResult` for the response that was loaded.
27
+ */
28
+ loadExternalTokens(request: SilentRequest, response: ExternalTokenResponse, options: LoadTokenOptions): AuthenticationResult;
29
+ /**
30
+ * Helper function to load account to msal-browser cache
31
+ * @param idToken
32
+ * @param environment
33
+ * @param clientInfo
34
+ * @param authorityType
35
+ * @param requestHomeAccountId
36
+ * @returns `AccountEntity`
37
+ */
38
+ private loadAccount;
39
+ /**
40
+ * Helper function to load id tokens to msal-browser cache
41
+ * @param idToken
42
+ * @param homeAccountId
43
+ * @param environment
44
+ * @param tenantId
45
+ * @returns `IdTokenEntity`
46
+ */
47
+ private loadIdToken;
48
+ /**
49
+ * Helper function to load access tokens to msal-browser cache
50
+ * @param request
51
+ * @param response
52
+ * @param homeAccountId
53
+ * @param environment
54
+ * @param tenantId
55
+ * @returns `AccessTokenEntity`
56
+ */
57
+ private loadAccessToken;
58
+ /**
59
+ * Helper function to load refresh tokens to msal-browser cache
60
+ * @param request
61
+ * @param response
62
+ * @param homeAccountId
63
+ * @param environment
64
+ * @returns `RefreshTokenEntity`
65
+ */
66
+ private loadRefreshToken;
67
+ /**
68
+ * Helper function to generate an `AuthenticationResult` for the result.
69
+ * @param request
70
+ * @param idTokenObj
71
+ * @param cacheRecord
72
+ * @param authority
73
+ * @returns `AuthenticationResult`
74
+ */
75
+ private generateAuthenticationResult;
76
+ }
77
77
  //# sourceMappingURL=TokenCache.d.ts.map
@@ -1,232 +1,232 @@
1
- /*! @azure/msal-browser v3.0.0-alpha.1 2023-05-08 */
1
+ /*! @azure/msal-browser v3.0.0-alpha.2 2023-05-17 */
2
2
  'use strict';
3
3
  import { AuthToken, CacheRecord, Authority, AccountEntity, IdTokenEntity, ScopeSet, AccessTokenEntity, RefreshTokenEntity, Constants } from '@azure/msal-common';
4
4
  import { BrowserAuthError } from '../error/BrowserAuthError.js';
5
5
 
6
- /*
7
- * Copyright (c) Microsoft Corporation. All rights reserved.
8
- * Licensed under the MIT License.
9
- */
10
- /**
11
- * Token cache manager
12
- */
13
- class TokenCache {
14
- constructor(configuration, storage, logger, cryptoObj) {
15
- this.isBrowserEnvironment = typeof window !== "undefined";
16
- this.config = configuration;
17
- this.storage = storage;
18
- this.logger = logger;
19
- this.cryptoObj = cryptoObj;
20
- }
21
- // Move getAllAccounts here and cache utility APIs
22
- /**
23
- * API to load tokens to msal-browser cache.
24
- * @param request
25
- * @param response
26
- * @param options
27
- * @returns `AuthenticationResult` for the response that was loaded.
28
- */
29
- loadExternalTokens(request, response, options) {
30
- this.logger.info("TokenCache - loadExternalTokens called");
31
- if (!response.id_token) {
32
- throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes id token.");
33
- }
34
- const idToken = new AuthToken(response.id_token, this.cryptoObj);
35
- let cacheRecord;
36
- let authority;
37
- if (request.account) {
38
- const cacheRecordAccount = this.loadAccount(idToken, request.account.environment, undefined, undefined, request.account.homeAccountId);
39
- cacheRecord = new CacheRecord(cacheRecordAccount, this.loadIdToken(idToken, cacheRecordAccount.homeAccountId, request.account.environment, request.account.tenantId), this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, request.account.environment, request.account.tenantId, options), this.loadRefreshToken(request, response, cacheRecordAccount.homeAccountId, request.account.environment));
40
- }
41
- else if (request.authority) {
42
- const authorityUrl = Authority.generateAuthority(request.authority, request.azureCloudOptions);
43
- const authorityOptions = {
44
- protocolMode: this.config.auth.protocolMode,
45
- knownAuthorities: this.config.auth.knownAuthorities,
46
- cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
47
- authorityMetadata: this.config.auth.authorityMetadata,
48
- skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache,
49
- };
50
- authority = new Authority(authorityUrl, this.config.system.networkClient, this.storage, authorityOptions, this.logger);
51
- // "clientInfo" from options takes precedence over "clientInfo" in response
52
- if (options.clientInfo) {
53
- this.logger.trace("TokenCache - homeAccountId from options");
54
- const cacheRecordAccount = this.loadAccount(idToken, authority.hostnameAndPort, options.clientInfo, authority.authorityType);
55
- cacheRecord = new CacheRecord(cacheRecordAccount, this.loadIdToken(idToken, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant), this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant, options), this.loadRefreshToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort));
56
- }
57
- else if (response.client_info) {
58
- this.logger.trace("TokenCache - homeAccountId from response");
59
- const cacheRecordAccount = this.loadAccount(idToken, authority.hostnameAndPort, response.client_info, authority.authorityType);
60
- cacheRecord = new CacheRecord(cacheRecordAccount, this.loadIdToken(idToken, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant), this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant, options), this.loadRefreshToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort));
61
- }
62
- else {
63
- throw BrowserAuthError.createUnableToLoadTokenError("Please provide clientInfo in the response or options.");
64
- }
65
- }
66
- else {
67
- throw BrowserAuthError.createUnableToLoadTokenError("Please provide a request with an account or a request with authority.");
68
- }
69
- return this.generateAuthenticationResult(request, idToken, cacheRecord, authority);
70
- }
71
- /**
72
- * Helper function to load account to msal-browser cache
73
- * @param idToken
74
- * @param environment
75
- * @param clientInfo
76
- * @param authorityType
77
- * @param requestHomeAccountId
78
- * @returns `AccountEntity`
79
- */
80
- loadAccount(idToken, environment, clientInfo, authorityType, requestHomeAccountId) {
81
- let homeAccountId;
82
- if (requestHomeAccountId) {
83
- homeAccountId = requestHomeAccountId;
84
- }
85
- else if (authorityType !== undefined && clientInfo) {
86
- homeAccountId = AccountEntity.generateHomeAccountId(clientInfo, authorityType, this.logger, this.cryptoObj, idToken);
87
- }
88
- if (!homeAccountId) {
89
- throw BrowserAuthError.createUnableToLoadTokenError("Unexpected missing homeAccountId");
90
- }
91
- const accountEntity = clientInfo
92
- ? AccountEntity.createAccount(clientInfo, homeAccountId, idToken, undefined, undefined, undefined, environment)
93
- : AccountEntity.createGenericAccount(homeAccountId, idToken, undefined, undefined, undefined, environment);
94
- if (this.isBrowserEnvironment) {
95
- this.logger.verbose("TokenCache - loading account");
96
- this.storage.setAccount(accountEntity);
97
- return accountEntity;
98
- }
99
- else {
100
- throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
101
- }
102
- }
103
- /**
104
- * Helper function to load id tokens to msal-browser cache
105
- * @param idToken
106
- * @param homeAccountId
107
- * @param environment
108
- * @param tenantId
109
- * @returns `IdTokenEntity`
110
- */
111
- loadIdToken(idToken, homeAccountId, environment, tenantId) {
112
- const idTokenEntity = IdTokenEntity.createIdTokenEntity(homeAccountId, environment, idToken.rawToken, this.config.auth.clientId, tenantId);
113
- if (this.isBrowserEnvironment) {
114
- this.logger.verbose("TokenCache - loading id token");
115
- this.storage.setIdTokenCredential(idTokenEntity);
116
- return idTokenEntity;
117
- }
118
- else {
119
- throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
120
- }
121
- }
122
- /**
123
- * Helper function to load access tokens to msal-browser cache
124
- * @param request
125
- * @param response
126
- * @param homeAccountId
127
- * @param environment
128
- * @param tenantId
129
- * @returns `AccessTokenEntity`
130
- */
131
- loadAccessToken(request, response, homeAccountId, environment, tenantId, options) {
132
- if (!response.access_token) {
133
- this.logger.verbose("TokenCache - No access token provided for caching");
134
- return null;
135
- }
136
- if (!response.expires_in) {
137
- throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes expires_in value.");
138
- }
139
- if (!options.extendedExpiresOn) {
140
- throw BrowserAuthError.createUnableToLoadTokenError("Please provide an extendedExpiresOn value in the options.");
141
- }
142
- const scopes = new ScopeSet(request.scopes).printScopes();
143
- const expiresOn = options.expiresOn ||
144
- response.expires_in + new Date().getTime() / 1000;
145
- const extendedExpiresOn = options.extendedExpiresOn;
146
- const accessTokenEntity = AccessTokenEntity.createAccessTokenEntity(homeAccountId, environment, response.access_token, this.config.auth.clientId, tenantId, scopes, expiresOn, extendedExpiresOn, this.cryptoObj);
147
- if (this.isBrowserEnvironment) {
148
- this.logger.verbose("TokenCache - loading access token");
149
- this.storage.setAccessTokenCredential(accessTokenEntity);
150
- return accessTokenEntity;
151
- }
152
- else {
153
- throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
154
- }
155
- }
156
- /**
157
- * Helper function to load refresh tokens to msal-browser cache
158
- * @param request
159
- * @param response
160
- * @param homeAccountId
161
- * @param environment
162
- * @returns `RefreshTokenEntity`
163
- */
164
- loadRefreshToken(request, response, homeAccountId, environment) {
165
- if (!response.refresh_token) {
166
- this.logger.verbose("TokenCache - No refresh token provided for caching");
167
- return null;
168
- }
169
- const refreshTokenEntity = RefreshTokenEntity.createRefreshTokenEntity(homeAccountId, environment, response.refresh_token, this.config.auth.clientId);
170
- if (this.isBrowserEnvironment) {
171
- this.logger.verbose("TokenCache - loading refresh token");
172
- this.storage.setRefreshTokenCredential(refreshTokenEntity);
173
- return refreshTokenEntity;
174
- }
175
- else {
176
- throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
177
- }
178
- }
179
- /**
180
- * Helper function to generate an `AuthenticationResult` for the result.
181
- * @param request
182
- * @param idTokenObj
183
- * @param cacheRecord
184
- * @param authority
185
- * @returns `AuthenticationResult`
186
- */
187
- generateAuthenticationResult(request, idTokenObj, cacheRecord, authority) {
188
- let accessToken = Constants.EMPTY_STRING;
189
- let responseScopes = [];
190
- let expiresOn = null;
191
- let extExpiresOn;
192
- if (cacheRecord?.accessToken) {
193
- accessToken = cacheRecord.accessToken.secret;
194
- responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray();
195
- expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000);
196
- extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000);
197
- }
198
- const uid = idTokenObj?.claims.oid ||
199
- idTokenObj?.claims.sub ||
200
- Constants.EMPTY_STRING;
201
- const tid = idTokenObj?.claims.tid || Constants.EMPTY_STRING;
202
- return {
203
- authority: authority
204
- ? authority.canonicalAuthority
205
- : Constants.EMPTY_STRING,
206
- uniqueId: uid,
207
- tenantId: tid,
208
- scopes: responseScopes,
209
- account: cacheRecord?.account
210
- ? cacheRecord.account.getAccountInfo()
211
- : null,
212
- idToken: idTokenObj ? idTokenObj.rawToken : Constants.EMPTY_STRING,
213
- idTokenClaims: idTokenObj ? idTokenObj.claims : {},
214
- accessToken: accessToken,
215
- fromCache: true,
216
- expiresOn: expiresOn,
217
- correlationId: request.correlationId || Constants.EMPTY_STRING,
218
- requestId: Constants.EMPTY_STRING,
219
- extExpiresOn: extExpiresOn,
220
- familyId: Constants.EMPTY_STRING,
221
- tokenType: cacheRecord?.accessToken?.tokenType || Constants.EMPTY_STRING,
222
- state: Constants.EMPTY_STRING,
223
- cloudGraphHostName: cacheRecord?.account?.cloudGraphHostName ||
224
- Constants.EMPTY_STRING,
225
- msGraphHost: cacheRecord?.account?.msGraphHost || Constants.EMPTY_STRING,
226
- code: undefined,
227
- fromNativeBroker: false,
228
- };
229
- }
6
+ /*
7
+ * Copyright (c) Microsoft Corporation. All rights reserved.
8
+ * Licensed under the MIT License.
9
+ */
10
+ /**
11
+ * Token cache manager
12
+ */
13
+ class TokenCache {
14
+ constructor(configuration, storage, logger, cryptoObj) {
15
+ this.isBrowserEnvironment = typeof window !== "undefined";
16
+ this.config = configuration;
17
+ this.storage = storage;
18
+ this.logger = logger;
19
+ this.cryptoObj = cryptoObj;
20
+ }
21
+ // Move getAllAccounts here and cache utility APIs
22
+ /**
23
+ * API to load tokens to msal-browser cache.
24
+ * @param request
25
+ * @param response
26
+ * @param options
27
+ * @returns `AuthenticationResult` for the response that was loaded.
28
+ */
29
+ loadExternalTokens(request, response, options) {
30
+ this.logger.info("TokenCache - loadExternalTokens called");
31
+ if (!response.id_token) {
32
+ throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes id token.");
33
+ }
34
+ const idToken = new AuthToken(response.id_token, this.cryptoObj);
35
+ let cacheRecord;
36
+ let authority;
37
+ if (request.account) {
38
+ const cacheRecordAccount = this.loadAccount(idToken, request.account.environment, undefined, undefined, request.account.homeAccountId);
39
+ cacheRecord = new CacheRecord(cacheRecordAccount, this.loadIdToken(idToken, cacheRecordAccount.homeAccountId, request.account.environment, request.account.tenantId), this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, request.account.environment, request.account.tenantId, options), this.loadRefreshToken(request, response, cacheRecordAccount.homeAccountId, request.account.environment));
40
+ }
41
+ else if (request.authority) {
42
+ const authorityUrl = Authority.generateAuthority(request.authority, request.azureCloudOptions);
43
+ const authorityOptions = {
44
+ protocolMode: this.config.auth.protocolMode,
45
+ knownAuthorities: this.config.auth.knownAuthorities,
46
+ cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
47
+ authorityMetadata: this.config.auth.authorityMetadata,
48
+ skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache,
49
+ };
50
+ authority = new Authority(authorityUrl, this.config.system.networkClient, this.storage, authorityOptions, this.logger);
51
+ // "clientInfo" from options takes precedence over "clientInfo" in response
52
+ if (options.clientInfo) {
53
+ this.logger.trace("TokenCache - homeAccountId from options");
54
+ const cacheRecordAccount = this.loadAccount(idToken, authority.hostnameAndPort, options.clientInfo, authority.authorityType);
55
+ cacheRecord = new CacheRecord(cacheRecordAccount, this.loadIdToken(idToken, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant), this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant, options), this.loadRefreshToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort));
56
+ }
57
+ else if (response.client_info) {
58
+ this.logger.trace("TokenCache - homeAccountId from response");
59
+ const cacheRecordAccount = this.loadAccount(idToken, authority.hostnameAndPort, response.client_info, authority.authorityType);
60
+ cacheRecord = new CacheRecord(cacheRecordAccount, this.loadIdToken(idToken, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant), this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant, options), this.loadRefreshToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort));
61
+ }
62
+ else {
63
+ throw BrowserAuthError.createUnableToLoadTokenError("Please provide clientInfo in the response or options.");
64
+ }
65
+ }
66
+ else {
67
+ throw BrowserAuthError.createUnableToLoadTokenError("Please provide a request with an account or a request with authority.");
68
+ }
69
+ return this.generateAuthenticationResult(request, idToken, cacheRecord, authority);
70
+ }
71
+ /**
72
+ * Helper function to load account to msal-browser cache
73
+ * @param idToken
74
+ * @param environment
75
+ * @param clientInfo
76
+ * @param authorityType
77
+ * @param requestHomeAccountId
78
+ * @returns `AccountEntity`
79
+ */
80
+ loadAccount(idToken, environment, clientInfo, authorityType, requestHomeAccountId) {
81
+ let homeAccountId;
82
+ if (requestHomeAccountId) {
83
+ homeAccountId = requestHomeAccountId;
84
+ }
85
+ else if (authorityType !== undefined && clientInfo) {
86
+ homeAccountId = AccountEntity.generateHomeAccountId(clientInfo, authorityType, this.logger, this.cryptoObj, idToken);
87
+ }
88
+ if (!homeAccountId) {
89
+ throw BrowserAuthError.createUnableToLoadTokenError("Unexpected missing homeAccountId");
90
+ }
91
+ const accountEntity = clientInfo
92
+ ? AccountEntity.createAccount(clientInfo, homeAccountId, idToken, undefined, undefined, undefined, environment)
93
+ : AccountEntity.createGenericAccount(homeAccountId, idToken, undefined, undefined, undefined, environment);
94
+ if (this.isBrowserEnvironment) {
95
+ this.logger.verbose("TokenCache - loading account");
96
+ this.storage.setAccount(accountEntity);
97
+ return accountEntity;
98
+ }
99
+ else {
100
+ throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
101
+ }
102
+ }
103
+ /**
104
+ * Helper function to load id tokens to msal-browser cache
105
+ * @param idToken
106
+ * @param homeAccountId
107
+ * @param environment
108
+ * @param tenantId
109
+ * @returns `IdTokenEntity`
110
+ */
111
+ loadIdToken(idToken, homeAccountId, environment, tenantId) {
112
+ const idTokenEntity = IdTokenEntity.createIdTokenEntity(homeAccountId, environment, idToken.rawToken, this.config.auth.clientId, tenantId);
113
+ if (this.isBrowserEnvironment) {
114
+ this.logger.verbose("TokenCache - loading id token");
115
+ this.storage.setIdTokenCredential(idTokenEntity);
116
+ return idTokenEntity;
117
+ }
118
+ else {
119
+ throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
120
+ }
121
+ }
122
+ /**
123
+ * Helper function to load access tokens to msal-browser cache
124
+ * @param request
125
+ * @param response
126
+ * @param homeAccountId
127
+ * @param environment
128
+ * @param tenantId
129
+ * @returns `AccessTokenEntity`
130
+ */
131
+ loadAccessToken(request, response, homeAccountId, environment, tenantId, options) {
132
+ if (!response.access_token) {
133
+ this.logger.verbose("TokenCache - No access token provided for caching");
134
+ return null;
135
+ }
136
+ if (!response.expires_in) {
137
+ throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes expires_in value.");
138
+ }
139
+ if (!options.extendedExpiresOn) {
140
+ throw BrowserAuthError.createUnableToLoadTokenError("Please provide an extendedExpiresOn value in the options.");
141
+ }
142
+ const scopes = new ScopeSet(request.scopes).printScopes();
143
+ const expiresOn = options.expiresOn ||
144
+ response.expires_in + new Date().getTime() / 1000;
145
+ const extendedExpiresOn = options.extendedExpiresOn;
146
+ const accessTokenEntity = AccessTokenEntity.createAccessTokenEntity(homeAccountId, environment, response.access_token, this.config.auth.clientId, tenantId, scopes, expiresOn, extendedExpiresOn, this.cryptoObj);
147
+ if (this.isBrowserEnvironment) {
148
+ this.logger.verbose("TokenCache - loading access token");
149
+ this.storage.setAccessTokenCredential(accessTokenEntity);
150
+ return accessTokenEntity;
151
+ }
152
+ else {
153
+ throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
154
+ }
155
+ }
156
+ /**
157
+ * Helper function to load refresh tokens to msal-browser cache
158
+ * @param request
159
+ * @param response
160
+ * @param homeAccountId
161
+ * @param environment
162
+ * @returns `RefreshTokenEntity`
163
+ */
164
+ loadRefreshToken(request, response, homeAccountId, environment) {
165
+ if (!response.refresh_token) {
166
+ this.logger.verbose("TokenCache - No refresh token provided for caching");
167
+ return null;
168
+ }
169
+ const refreshTokenEntity = RefreshTokenEntity.createRefreshTokenEntity(homeAccountId, environment, response.refresh_token, this.config.auth.clientId);
170
+ if (this.isBrowserEnvironment) {
171
+ this.logger.verbose("TokenCache - loading refresh token");
172
+ this.storage.setRefreshTokenCredential(refreshTokenEntity);
173
+ return refreshTokenEntity;
174
+ }
175
+ else {
176
+ throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
177
+ }
178
+ }
179
+ /**
180
+ * Helper function to generate an `AuthenticationResult` for the result.
181
+ * @param request
182
+ * @param idTokenObj
183
+ * @param cacheRecord
184
+ * @param authority
185
+ * @returns `AuthenticationResult`
186
+ */
187
+ generateAuthenticationResult(request, idTokenObj, cacheRecord, authority) {
188
+ let accessToken = Constants.EMPTY_STRING;
189
+ let responseScopes = [];
190
+ let expiresOn = null;
191
+ let extExpiresOn;
192
+ if (cacheRecord?.accessToken) {
193
+ accessToken = cacheRecord.accessToken.secret;
194
+ responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray();
195
+ expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000);
196
+ extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000);
197
+ }
198
+ const uid = idTokenObj?.claims.oid ||
199
+ idTokenObj?.claims.sub ||
200
+ Constants.EMPTY_STRING;
201
+ const tid = idTokenObj?.claims.tid || Constants.EMPTY_STRING;
202
+ return {
203
+ authority: authority
204
+ ? authority.canonicalAuthority
205
+ : Constants.EMPTY_STRING,
206
+ uniqueId: uid,
207
+ tenantId: tid,
208
+ scopes: responseScopes,
209
+ account: cacheRecord?.account
210
+ ? cacheRecord.account.getAccountInfo()
211
+ : null,
212
+ idToken: idTokenObj ? idTokenObj.rawToken : Constants.EMPTY_STRING,
213
+ idTokenClaims: idTokenObj ? idTokenObj.claims : {},
214
+ accessToken: accessToken,
215
+ fromCache: true,
216
+ expiresOn: expiresOn,
217
+ correlationId: request.correlationId || Constants.EMPTY_STRING,
218
+ requestId: Constants.EMPTY_STRING,
219
+ extExpiresOn: extExpiresOn,
220
+ familyId: Constants.EMPTY_STRING,
221
+ tokenType: cacheRecord?.accessToken?.tokenType || Constants.EMPTY_STRING,
222
+ state: Constants.EMPTY_STRING,
223
+ cloudGraphHostName: cacheRecord?.account?.cloudGraphHostName ||
224
+ Constants.EMPTY_STRING,
225
+ msGraphHost: cacheRecord?.account?.msGraphHost || Constants.EMPTY_STRING,
226
+ code: undefined,
227
+ fromNativeBroker: false,
228
+ };
229
+ }
230
230
  }
231
231
 
232
232
  export { TokenCache };