@azure/msal-browser 3.20.0 → 3.22.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.
- package/dist/app/IPublicClientApplication.d.ts +53 -53
- package/dist/app/IPublicClientApplication.mjs +105 -105
- package/dist/app/PublicClientApplication.d.ts +293 -293
- package/dist/app/PublicClientApplication.mjs +364 -364
- package/dist/app/PublicClientNext.d.ts +276 -276
- package/dist/app/PublicClientNext.mjs +354 -354
- package/dist/broker/nativeBroker/NativeMessageHandler.d.ts +62 -62
- package/dist/broker/nativeBroker/NativeMessageHandler.mjs +254 -254
- package/dist/broker/nativeBroker/NativeRequest.d.ts +45 -45
- package/dist/broker/nativeBroker/NativeResponse.d.ts +48 -48
- package/dist/broker/nativeBroker/NativeStatusCodes.d.ts +7 -7
- package/dist/broker/nativeBroker/NativeStatusCodes.mjs +11 -11
- package/dist/cache/AccountManager.d.ts +48 -48
- package/dist/cache/AccountManager.mjs +126 -126
- package/dist/cache/AsyncMemoryStorage.d.ts +50 -50
- package/dist/cache/AsyncMemoryStorage.mjs +131 -131
- package/dist/cache/BrowserCacheManager.d.ts +385 -385
- package/dist/cache/BrowserCacheManager.mjs +1294 -1294
- package/dist/cache/BrowserStorage.d.ts +11 -11
- package/dist/cache/BrowserStorage.mjs +32 -32
- package/dist/cache/DatabaseStorage.d.ts +56 -56
- package/dist/cache/DatabaseStorage.mjs +200 -200
- package/dist/cache/IAsyncStorage.d.ts +27 -27
- package/dist/cache/ITokenCache.d.ts +11 -11
- package/dist/cache/IWindowStorage.d.ts +27 -27
- package/dist/cache/MemoryStorage.d.ts +11 -11
- package/dist/cache/MemoryStorage.mjs +31 -31
- package/dist/cache/TokenCache.d.ts +77 -77
- package/dist/cache/TokenCache.mjs +195 -195
- package/dist/config/Configuration.d.ts +213 -208
- package/dist/config/Configuration.d.ts.map +1 -1
- package/dist/config/Configuration.mjs +128 -128
- package/dist/config/Configuration.mjs.map +1 -1
- package/dist/controllers/ControllerFactory.d.ts +5 -5
- package/dist/controllers/ControllerFactory.mjs +25 -25
- package/dist/controllers/IController.d.ts +60 -60
- package/dist/controllers/NestedAppAuthController.d.ts +202 -202
- package/dist/controllers/NestedAppAuthController.mjs +473 -473
- package/dist/controllers/StandardController.d.ts +405 -405
- package/dist/controllers/StandardController.d.ts.map +1 -1
- package/dist/controllers/StandardController.mjs +1334 -1316
- package/dist/controllers/StandardController.mjs.map +1 -1
- package/dist/controllers/UnknownOperatingContextController.d.ts +86 -86
- package/dist/controllers/UnknownOperatingContextController.mjs +256 -256
- package/dist/crypto/BrowserCrypto.d.ts +52 -52
- package/dist/crypto/BrowserCrypto.mjs +151 -151
- package/dist/crypto/CryptoOps.d.ts +74 -74
- package/dist/crypto/CryptoOps.mjs +176 -176
- package/dist/crypto/PkceGenerator.d.ts +8 -8
- package/dist/crypto/PkceGenerator.mjs +54 -54
- package/dist/crypto/SignedHttpRequest.d.ts +30 -30
- package/dist/crypto/SignedHttpRequest.mjs +39 -39
- package/dist/encode/Base64Decode.d.ts +9 -9
- package/dist/encode/Base64Decode.mjs +36 -36
- package/dist/encode/Base64Encode.d.ts +19 -19
- package/dist/encode/Base64Encode.mjs +43 -43
- package/dist/error/BrowserAuthError.d.ts +255 -255
- package/dist/error/BrowserAuthError.mjs +263 -263
- package/dist/error/BrowserAuthErrorCodes.d.ts +46 -46
- package/dist/error/BrowserAuthErrorCodes.mjs +50 -50
- package/dist/error/BrowserConfigurationAuthError.d.ts +33 -33
- package/dist/error/BrowserConfigurationAuthError.mjs +40 -40
- package/dist/error/BrowserConfigurationAuthError.mjs.map +1 -1
- package/dist/error/BrowserConfigurationAuthErrorCodes.d.ts +3 -3
- package/dist/error/BrowserConfigurationAuthErrorCodes.mjs +7 -7
- package/dist/error/NativeAuthError.d.ts +29 -29
- package/dist/error/NativeAuthError.mjs +60 -60
- package/dist/error/NativeAuthErrorCodes.d.ts +2 -2
- package/dist/error/NativeAuthErrorCodes.mjs +6 -6
- package/dist/error/NestedAppAuthError.d.ts +14 -14
- package/dist/error/NestedAppAuthError.mjs +23 -23
- package/dist/event/EventHandler.d.ts +41 -41
- package/dist/event/EventHandler.mjs +125 -125
- package/dist/event/EventMessage.d.ts +25 -25
- package/dist/event/EventMessage.mjs +68 -68
- package/dist/event/EventType.d.ts +29 -29
- package/dist/event/EventType.mjs +32 -32
- package/dist/index.d.ts +40 -40
- package/dist/index.mjs +1 -1
- package/dist/interaction_client/BaseInteractionClient.d.ts +50 -50
- package/dist/interaction_client/BaseInteractionClient.mjs +106 -106
- package/dist/interaction_client/HybridSpaAuthorizationCodeClient.d.ts +4 -4
- package/dist/interaction_client/HybridSpaAuthorizationCodeClient.mjs +10 -10
- package/dist/interaction_client/NativeInteractionClient.d.ts +151 -151
- package/dist/interaction_client/NativeInteractionClient.mjs +621 -621
- package/dist/interaction_client/PopupClient.d.ts +105 -105
- package/dist/interaction_client/PopupClient.d.ts.map +1 -1
- package/dist/interaction_client/PopupClient.mjs +433 -433
- package/dist/interaction_client/PopupClient.mjs.map +1 -1
- package/dist/interaction_client/RedirectClient.d.ts +50 -50
- package/dist/interaction_client/RedirectClient.d.ts.map +1 -1
- package/dist/interaction_client/RedirectClient.mjs +315 -314
- package/dist/interaction_client/RedirectClient.mjs.map +1 -1
- package/dist/interaction_client/SilentAuthCodeClient.d.ts +23 -23
- package/dist/interaction_client/SilentAuthCodeClient.mjs +57 -57
- package/dist/interaction_client/SilentCacheClient.d.ts +16 -16
- package/dist/interaction_client/SilentCacheClient.mjs +42 -42
- package/dist/interaction_client/SilentIframeClient.d.ts +32 -32
- package/dist/interaction_client/SilentIframeClient.d.ts.map +1 -1
- package/dist/interaction_client/SilentIframeClient.mjs +110 -100
- package/dist/interaction_client/SilentIframeClient.mjs.map +1 -1
- package/dist/interaction_client/SilentRefreshClient.d.ts +20 -20
- package/dist/interaction_client/SilentRefreshClient.mjs +47 -47
- package/dist/interaction_client/StandardInteractionClient.d.ts +48 -48
- package/dist/interaction_client/StandardInteractionClient.mjs +199 -199
- package/dist/interaction_handler/InteractionHandler.d.ts +33 -33
- package/dist/interaction_handler/InteractionHandler.mjs +93 -93
- package/dist/interaction_handler/RedirectHandler.d.ts +32 -32
- package/dist/interaction_handler/RedirectHandler.mjs +134 -134
- package/dist/interaction_handler/SilentHandler.d.ts +13 -13
- package/dist/interaction_handler/SilentHandler.mjs +134 -134
- package/dist/naa/AccountInfo.d.ts +11 -11
- package/dist/naa/AuthBridge.d.ts +8 -8
- package/dist/naa/AuthResult.d.ts +6 -6
- package/dist/naa/BridgeAccountContext.d.ts +12 -12
- package/dist/naa/BridgeCapabilities.d.ts +3 -3
- package/dist/naa/BridgeError.d.ts +9 -9
- package/dist/naa/BridgeError.mjs +7 -7
- package/dist/naa/BridgeProxy.d.ts +67 -67
- package/dist/naa/BridgeProxy.mjs +148 -148
- package/dist/naa/BridgeRequest.d.ts +7 -7
- package/dist/naa/BridgeRequestEnvelope.d.ts +12 -12
- package/dist/naa/BridgeResponseEnvelope.d.ts +13 -13
- package/dist/naa/BridgeStatusCode.d.ts +11 -11
- package/dist/naa/BridgeStatusCode.mjs +14 -14
- package/dist/naa/IBridgeProxy.d.ts +10 -10
- package/dist/naa/InitContext.d.ts +8 -8
- package/dist/naa/TokenRequest.d.ts +18 -18
- package/dist/naa/TokenResponse.d.ts +13 -13
- package/dist/naa/mapping/NestedAppAuthAdapter.d.ts +35 -35
- package/dist/naa/mapping/NestedAppAuthAdapter.mjs +179 -179
- package/dist/navigation/INavigationClient.d.ts +16 -16
- package/dist/navigation/NavigationClient.d.ts +22 -22
- package/dist/navigation/NavigationClient.mjs +40 -40
- package/dist/navigation/NavigationOptions.d.ts +12 -12
- package/dist/network/FetchClient.d.ts +26 -26
- package/dist/network/FetchClient.mjs +99 -99
- package/dist/operatingcontext/BaseOperatingContext.d.ts +41 -41
- package/dist/operatingcontext/BaseOperatingContext.mjs +94 -94
- package/dist/operatingcontext/NestedAppOperatingContext.d.ts +34 -34
- package/dist/operatingcontext/NestedAppOperatingContext.mjs +71 -71
- package/dist/operatingcontext/StandardOperatingContext.d.ts +25 -25
- package/dist/operatingcontext/StandardOperatingContext.mjs +43 -43
- package/dist/operatingcontext/UnknownOperatingContext.d.ts +25 -25
- package/dist/operatingcontext/UnknownOperatingContext.mjs +42 -42
- package/dist/packageMetadata.d.ts +2 -2
- package/dist/packageMetadata.mjs +4 -4
- package/dist/request/AuthorizationCodeRequest.d.ts +8 -8
- package/dist/request/AuthorizationUrlRequest.d.ts +8 -8
- package/dist/request/ClearCacheRequest.d.ts +10 -10
- package/dist/request/EndSessionPopupRequest.d.ts +18 -18
- package/dist/request/EndSessionRequest.d.ts +15 -15
- package/dist/request/InitializeApplicationRequest.d.ts +8 -8
- package/dist/request/PopupRequest.d.ts +34 -34
- package/dist/request/PopupWindowAttributes.d.ts +15 -15
- package/dist/request/RedirectRequest.d.ts +40 -35
- package/dist/request/RedirectRequest.d.ts.map +1 -1
- package/dist/request/RequestHelpers.d.ts +13 -13
- package/dist/request/RequestHelpers.mjs +53 -53
- package/dist/request/SilentRequest.d.ts +33 -33
- package/dist/request/SsoSilentRequest.d.ts +29 -29
- package/dist/response/AuthenticationResult.d.ts +4 -4
- package/dist/response/ResponseHandler.d.ts +7 -7
- package/dist/response/ResponseHandler.mjs +36 -36
- package/dist/telemetry/BrowserPerformanceClient.d.ts +34 -34
- package/dist/telemetry/BrowserPerformanceClient.mjs +162 -162
- package/dist/telemetry/BrowserPerformanceMeasurement.d.ts +21 -21
- package/dist/telemetry/BrowserPerformanceMeasurement.mjs +92 -92
- package/dist/utils/BrowserConstants.d.ts +180 -180
- package/dist/utils/BrowserConstants.mjs +212 -212
- package/dist/utils/BrowserProtocolUtils.d.ts +11 -11
- package/dist/utils/BrowserProtocolUtils.mjs +21 -21
- package/dist/utils/BrowserUtils.d.ts +75 -75
- package/dist/utils/BrowserUtils.mjs +157 -157
- package/lib/msal-browser.cjs +18884 -18855
- package/lib/msal-browser.cjs.map +1 -1
- package/lib/msal-browser.js +18884 -18855
- package/lib/msal-browser.js.map +1 -1
- package/lib/msal-browser.min.js +59 -59
- package/package.json +2 -2
- package/src/config/Configuration.ts +9 -1
- package/src/controllers/StandardController.ts +30 -12
- package/src/interaction_client/PopupClient.ts +1 -0
- package/src/interaction_client/RedirectClient.ts +4 -1
- package/src/interaction_client/SilentIframeClient.ts +40 -3
- package/src/packageMetadata.ts +1 -1
- package/src/request/RedirectRequest.ts +5 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @azure/msal-browser v3.
|
|
1
|
+
/*! @azure/msal-browser v3.22.0 2024-08-28 */
|
|
2
2
|
'use strict';
|
|
3
3
|
import { PerformanceEvents, JoseHeader } from '@azure/msal-common';
|
|
4
4
|
import { base64Encode, urlEncode, urlEncodeArr } from '../encode/Base64Encode.mjs';
|
|
@@ -8,181 +8,181 @@ import { createBrowserAuthError } from '../error/BrowserAuthError.mjs';
|
|
|
8
8
|
import { AsyncMemoryStorage } from '../cache/AsyncMemoryStorage.mjs';
|
|
9
9
|
import { cryptoKeyNotFound } from '../error/BrowserAuthErrorCodes.mjs';
|
|
10
10
|
|
|
11
|
-
/*
|
|
12
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
13
|
-
* Licensed under the MIT License.
|
|
14
|
-
*/
|
|
15
|
-
/**
|
|
16
|
-
* This class implements MSAL's crypto interface, which allows it to perform base64 encoding and decoding, generating cryptographically random GUIDs and
|
|
17
|
-
* implementing Proof Key for Code Exchange specs for the OAuth Authorization Code Flow using PKCE (rfc here: https://tools.ietf.org/html/rfc7636).
|
|
18
|
-
*/
|
|
19
|
-
class CryptoOps {
|
|
20
|
-
constructor(logger, performanceClient) {
|
|
21
|
-
this.logger = logger;
|
|
22
|
-
// Browser crypto needs to be validated first before any other classes can be set.
|
|
23
|
-
validateCryptoAvailable(logger);
|
|
24
|
-
this.cache = new AsyncMemoryStorage(this.logger);
|
|
25
|
-
this.performanceClient = performanceClient;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Creates a new random GUID - used to populate state and nonce.
|
|
29
|
-
* @returns string (GUID)
|
|
30
|
-
*/
|
|
31
|
-
createNewGuid() {
|
|
32
|
-
return createNewGuid();
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Encodes input string to base64.
|
|
36
|
-
* @param input
|
|
37
|
-
*/
|
|
38
|
-
base64Encode(input) {
|
|
39
|
-
return base64Encode(input);
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Decodes input string from base64.
|
|
43
|
-
* @param input
|
|
44
|
-
*/
|
|
45
|
-
base64Decode(input) {
|
|
46
|
-
return base64Decode(input);
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Encodes input string to base64 URL safe string.
|
|
50
|
-
* @param input
|
|
51
|
-
*/
|
|
52
|
-
base64UrlEncode(input) {
|
|
53
|
-
return urlEncode(input);
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Stringifies and base64Url encodes input public key
|
|
57
|
-
* @param inputKid
|
|
58
|
-
* @returns Base64Url encoded public key
|
|
59
|
-
*/
|
|
60
|
-
encodeKid(inputKid) {
|
|
61
|
-
return this.base64UrlEncode(JSON.stringify({ kid: inputKid }));
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Generates a keypair, stores it and returns a thumbprint
|
|
65
|
-
* @param request
|
|
66
|
-
*/
|
|
67
|
-
async getPublicKeyThumbprint(request) {
|
|
68
|
-
const publicKeyThumbMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.CryptoOptsGetPublicKeyThumbprint, request.correlationId);
|
|
69
|
-
// Generate Keypair
|
|
70
|
-
const keyPair = await generateKeyPair(CryptoOps.EXTRACTABLE, CryptoOps.POP_KEY_USAGES);
|
|
71
|
-
// Generate Thumbprint for Public Key
|
|
72
|
-
const publicKeyJwk = await exportJwk(keyPair.publicKey);
|
|
73
|
-
const pubKeyThumprintObj = {
|
|
74
|
-
e: publicKeyJwk.e,
|
|
75
|
-
kty: publicKeyJwk.kty,
|
|
76
|
-
n: publicKeyJwk.n,
|
|
77
|
-
};
|
|
78
|
-
const publicJwkString = getSortedObjectString(pubKeyThumprintObj);
|
|
79
|
-
const publicJwkHash = await this.hashString(publicJwkString);
|
|
80
|
-
// Generate Thumbprint for Private Key
|
|
81
|
-
const privateKeyJwk = await exportJwk(keyPair.privateKey);
|
|
82
|
-
// Re-import private key to make it unextractable
|
|
83
|
-
const unextractablePrivateKey = await importJwk(privateKeyJwk, false, ["sign"]);
|
|
84
|
-
// Store Keypair data in keystore
|
|
85
|
-
await this.cache.setItem(publicJwkHash, {
|
|
86
|
-
privateKey: unextractablePrivateKey,
|
|
87
|
-
publicKey: keyPair.publicKey,
|
|
88
|
-
requestMethod: request.resourceRequestMethod,
|
|
89
|
-
requestUri: request.resourceRequestUri,
|
|
90
|
-
});
|
|
91
|
-
if (publicKeyThumbMeasurement) {
|
|
92
|
-
publicKeyThumbMeasurement.end({
|
|
93
|
-
success: true,
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
return publicJwkHash;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Removes cryptographic keypair from key store matching the keyId passed in
|
|
100
|
-
* @param kid
|
|
101
|
-
*/
|
|
102
|
-
async removeTokenBindingKey(kid) {
|
|
103
|
-
await this.cache.removeItem(kid);
|
|
104
|
-
const keyFound = await this.cache.containsKey(kid);
|
|
105
|
-
return !keyFound;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Removes all cryptographic keys from IndexedDB storage
|
|
109
|
-
*/
|
|
110
|
-
async clearKeystore() {
|
|
111
|
-
// Delete in-memory keystores
|
|
112
|
-
this.cache.clearInMemory();
|
|
113
|
-
/**
|
|
114
|
-
* There is only one database, so calling clearPersistent on asymmetric keystore takes care of
|
|
115
|
-
* every persistent keystore
|
|
116
|
-
*/
|
|
117
|
-
try {
|
|
118
|
-
await this.cache.clearPersistent();
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
catch (e) {
|
|
122
|
-
if (e instanceof Error) {
|
|
123
|
-
this.logger.error(`Clearing keystore failed with error: ${e.message}`);
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
this.logger.error("Clearing keystore failed with unknown error");
|
|
127
|
-
}
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Signs the given object as a jwt payload with private key retrieved by given kid.
|
|
133
|
-
* @param payload
|
|
134
|
-
* @param kid
|
|
135
|
-
*/
|
|
136
|
-
async signJwt(payload, kid, shrOptions, correlationId) {
|
|
137
|
-
const signJwtMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.CryptoOptsSignJwt, correlationId);
|
|
138
|
-
const cachedKeyPair = await this.cache.getItem(kid);
|
|
139
|
-
if (!cachedKeyPair) {
|
|
140
|
-
throw createBrowserAuthError(cryptoKeyNotFound);
|
|
141
|
-
}
|
|
142
|
-
// Get public key as JWK
|
|
143
|
-
const publicKeyJwk = await exportJwk(cachedKeyPair.publicKey);
|
|
144
|
-
const publicKeyJwkString = getSortedObjectString(publicKeyJwk);
|
|
145
|
-
// Base64URL encode public key thumbprint with keyId only: BASE64URL({ kid: "FULL_PUBLIC_KEY_HASH" })
|
|
146
|
-
const encodedKeyIdThumbprint = urlEncode(JSON.stringify({ kid: kid }));
|
|
147
|
-
// Generate header
|
|
148
|
-
const shrHeader = JoseHeader.getShrHeaderString({
|
|
149
|
-
...shrOptions?.header,
|
|
150
|
-
alg: publicKeyJwk.alg,
|
|
151
|
-
kid: encodedKeyIdThumbprint,
|
|
152
|
-
});
|
|
153
|
-
const encodedShrHeader = urlEncode(shrHeader);
|
|
154
|
-
// Generate payload
|
|
155
|
-
payload.cnf = {
|
|
156
|
-
jwk: JSON.parse(publicKeyJwkString),
|
|
157
|
-
};
|
|
158
|
-
const encodedPayload = urlEncode(JSON.stringify(payload));
|
|
159
|
-
// Form token string
|
|
160
|
-
const tokenString = `${encodedShrHeader}.${encodedPayload}`;
|
|
161
|
-
// Sign token
|
|
162
|
-
const encoder = new TextEncoder();
|
|
163
|
-
const tokenBuffer = encoder.encode(tokenString);
|
|
164
|
-
const signatureBuffer = await sign(cachedKeyPair.privateKey, tokenBuffer);
|
|
165
|
-
const encodedSignature = urlEncodeArr(new Uint8Array(signatureBuffer));
|
|
166
|
-
const signedJwt = `${tokenString}.${encodedSignature}`;
|
|
167
|
-
if (signJwtMeasurement) {
|
|
168
|
-
signJwtMeasurement.end({
|
|
169
|
-
success: true,
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
return signedJwt;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Returns the SHA-256 hash of an input string
|
|
176
|
-
* @param plainText
|
|
177
|
-
*/
|
|
178
|
-
async hashString(plainText) {
|
|
179
|
-
return hashString(plainText);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
CryptoOps.POP_KEY_USAGES = ["sign", "verify"];
|
|
183
|
-
CryptoOps.EXTRACTABLE = true;
|
|
184
|
-
function getSortedObjectString(obj) {
|
|
185
|
-
return JSON.stringify(obj, Object.keys(obj).sort());
|
|
11
|
+
/*
|
|
12
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
13
|
+
* Licensed under the MIT License.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* This class implements MSAL's crypto interface, which allows it to perform base64 encoding and decoding, generating cryptographically random GUIDs and
|
|
17
|
+
* implementing Proof Key for Code Exchange specs for the OAuth Authorization Code Flow using PKCE (rfc here: https://tools.ietf.org/html/rfc7636).
|
|
18
|
+
*/
|
|
19
|
+
class CryptoOps {
|
|
20
|
+
constructor(logger, performanceClient) {
|
|
21
|
+
this.logger = logger;
|
|
22
|
+
// Browser crypto needs to be validated first before any other classes can be set.
|
|
23
|
+
validateCryptoAvailable(logger);
|
|
24
|
+
this.cache = new AsyncMemoryStorage(this.logger);
|
|
25
|
+
this.performanceClient = performanceClient;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Creates a new random GUID - used to populate state and nonce.
|
|
29
|
+
* @returns string (GUID)
|
|
30
|
+
*/
|
|
31
|
+
createNewGuid() {
|
|
32
|
+
return createNewGuid();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Encodes input string to base64.
|
|
36
|
+
* @param input
|
|
37
|
+
*/
|
|
38
|
+
base64Encode(input) {
|
|
39
|
+
return base64Encode(input);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Decodes input string from base64.
|
|
43
|
+
* @param input
|
|
44
|
+
*/
|
|
45
|
+
base64Decode(input) {
|
|
46
|
+
return base64Decode(input);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Encodes input string to base64 URL safe string.
|
|
50
|
+
* @param input
|
|
51
|
+
*/
|
|
52
|
+
base64UrlEncode(input) {
|
|
53
|
+
return urlEncode(input);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Stringifies and base64Url encodes input public key
|
|
57
|
+
* @param inputKid
|
|
58
|
+
* @returns Base64Url encoded public key
|
|
59
|
+
*/
|
|
60
|
+
encodeKid(inputKid) {
|
|
61
|
+
return this.base64UrlEncode(JSON.stringify({ kid: inputKid }));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Generates a keypair, stores it and returns a thumbprint
|
|
65
|
+
* @param request
|
|
66
|
+
*/
|
|
67
|
+
async getPublicKeyThumbprint(request) {
|
|
68
|
+
const publicKeyThumbMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.CryptoOptsGetPublicKeyThumbprint, request.correlationId);
|
|
69
|
+
// Generate Keypair
|
|
70
|
+
const keyPair = await generateKeyPair(CryptoOps.EXTRACTABLE, CryptoOps.POP_KEY_USAGES);
|
|
71
|
+
// Generate Thumbprint for Public Key
|
|
72
|
+
const publicKeyJwk = await exportJwk(keyPair.publicKey);
|
|
73
|
+
const pubKeyThumprintObj = {
|
|
74
|
+
e: publicKeyJwk.e,
|
|
75
|
+
kty: publicKeyJwk.kty,
|
|
76
|
+
n: publicKeyJwk.n,
|
|
77
|
+
};
|
|
78
|
+
const publicJwkString = getSortedObjectString(pubKeyThumprintObj);
|
|
79
|
+
const publicJwkHash = await this.hashString(publicJwkString);
|
|
80
|
+
// Generate Thumbprint for Private Key
|
|
81
|
+
const privateKeyJwk = await exportJwk(keyPair.privateKey);
|
|
82
|
+
// Re-import private key to make it unextractable
|
|
83
|
+
const unextractablePrivateKey = await importJwk(privateKeyJwk, false, ["sign"]);
|
|
84
|
+
// Store Keypair data in keystore
|
|
85
|
+
await this.cache.setItem(publicJwkHash, {
|
|
86
|
+
privateKey: unextractablePrivateKey,
|
|
87
|
+
publicKey: keyPair.publicKey,
|
|
88
|
+
requestMethod: request.resourceRequestMethod,
|
|
89
|
+
requestUri: request.resourceRequestUri,
|
|
90
|
+
});
|
|
91
|
+
if (publicKeyThumbMeasurement) {
|
|
92
|
+
publicKeyThumbMeasurement.end({
|
|
93
|
+
success: true,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return publicJwkHash;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Removes cryptographic keypair from key store matching the keyId passed in
|
|
100
|
+
* @param kid
|
|
101
|
+
*/
|
|
102
|
+
async removeTokenBindingKey(kid) {
|
|
103
|
+
await this.cache.removeItem(kid);
|
|
104
|
+
const keyFound = await this.cache.containsKey(kid);
|
|
105
|
+
return !keyFound;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Removes all cryptographic keys from IndexedDB storage
|
|
109
|
+
*/
|
|
110
|
+
async clearKeystore() {
|
|
111
|
+
// Delete in-memory keystores
|
|
112
|
+
this.cache.clearInMemory();
|
|
113
|
+
/**
|
|
114
|
+
* There is only one database, so calling clearPersistent on asymmetric keystore takes care of
|
|
115
|
+
* every persistent keystore
|
|
116
|
+
*/
|
|
117
|
+
try {
|
|
118
|
+
await this.cache.clearPersistent();
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
if (e instanceof Error) {
|
|
123
|
+
this.logger.error(`Clearing keystore failed with error: ${e.message}`);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
this.logger.error("Clearing keystore failed with unknown error");
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Signs the given object as a jwt payload with private key retrieved by given kid.
|
|
133
|
+
* @param payload
|
|
134
|
+
* @param kid
|
|
135
|
+
*/
|
|
136
|
+
async signJwt(payload, kid, shrOptions, correlationId) {
|
|
137
|
+
const signJwtMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.CryptoOptsSignJwt, correlationId);
|
|
138
|
+
const cachedKeyPair = await this.cache.getItem(kid);
|
|
139
|
+
if (!cachedKeyPair) {
|
|
140
|
+
throw createBrowserAuthError(cryptoKeyNotFound);
|
|
141
|
+
}
|
|
142
|
+
// Get public key as JWK
|
|
143
|
+
const publicKeyJwk = await exportJwk(cachedKeyPair.publicKey);
|
|
144
|
+
const publicKeyJwkString = getSortedObjectString(publicKeyJwk);
|
|
145
|
+
// Base64URL encode public key thumbprint with keyId only: BASE64URL({ kid: "FULL_PUBLIC_KEY_HASH" })
|
|
146
|
+
const encodedKeyIdThumbprint = urlEncode(JSON.stringify({ kid: kid }));
|
|
147
|
+
// Generate header
|
|
148
|
+
const shrHeader = JoseHeader.getShrHeaderString({
|
|
149
|
+
...shrOptions?.header,
|
|
150
|
+
alg: publicKeyJwk.alg,
|
|
151
|
+
kid: encodedKeyIdThumbprint,
|
|
152
|
+
});
|
|
153
|
+
const encodedShrHeader = urlEncode(shrHeader);
|
|
154
|
+
// Generate payload
|
|
155
|
+
payload.cnf = {
|
|
156
|
+
jwk: JSON.parse(publicKeyJwkString),
|
|
157
|
+
};
|
|
158
|
+
const encodedPayload = urlEncode(JSON.stringify(payload));
|
|
159
|
+
// Form token string
|
|
160
|
+
const tokenString = `${encodedShrHeader}.${encodedPayload}`;
|
|
161
|
+
// Sign token
|
|
162
|
+
const encoder = new TextEncoder();
|
|
163
|
+
const tokenBuffer = encoder.encode(tokenString);
|
|
164
|
+
const signatureBuffer = await sign(cachedKeyPair.privateKey, tokenBuffer);
|
|
165
|
+
const encodedSignature = urlEncodeArr(new Uint8Array(signatureBuffer));
|
|
166
|
+
const signedJwt = `${tokenString}.${encodedSignature}`;
|
|
167
|
+
if (signJwtMeasurement) {
|
|
168
|
+
signJwtMeasurement.end({
|
|
169
|
+
success: true,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
return signedJwt;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Returns the SHA-256 hash of an input string
|
|
176
|
+
* @param plainText
|
|
177
|
+
*/
|
|
178
|
+
async hashString(plainText) {
|
|
179
|
+
return hashString(plainText);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
CryptoOps.POP_KEY_USAGES = ["sign", "verify"];
|
|
183
|
+
CryptoOps.EXTRACTABLE = true;
|
|
184
|
+
function getSortedObjectString(obj) {
|
|
185
|
+
return JSON.stringify(obj, Object.keys(obj).sort());
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
export { CryptoOps };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { IPerformanceClient, Logger, PkceCodes } from "@azure/msal-common";
|
|
2
|
-
/**
|
|
3
|
-
* This file defines APIs to generate PKCE codes and code verifiers.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Generates PKCE Codes. See the RFC for more information: https://tools.ietf.org/html/rfc7636
|
|
7
|
-
*/
|
|
8
|
-
export declare function generatePkceCodes(performanceClient: IPerformanceClient, logger: Logger, correlationId: string): Promise<PkceCodes>;
|
|
1
|
+
import { IPerformanceClient, Logger, PkceCodes } from "@azure/msal-common";
|
|
2
|
+
/**
|
|
3
|
+
* This file defines APIs to generate PKCE codes and code verifiers.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Generates PKCE Codes. See the RFC for more information: https://tools.ietf.org/html/rfc7636
|
|
7
|
+
*/
|
|
8
|
+
export declare function generatePkceCodes(performanceClient: IPerformanceClient, logger: Logger, correlationId: string): Promise<PkceCodes>;
|
|
9
9
|
//# sourceMappingURL=PkceGenerator.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @azure/msal-browser v3.
|
|
1
|
+
/*! @azure/msal-browser v3.22.0 2024-08-28 */
|
|
2
2
|
'use strict';
|
|
3
3
|
import { PerformanceEvents, invoke, invokeAsync } from '@azure/msal-common';
|
|
4
4
|
import { createBrowserAuthError } from '../error/BrowserAuthError.mjs';
|
|
@@ -6,59 +6,59 @@ import { urlEncodeArr } from '../encode/Base64Encode.mjs';
|
|
|
6
6
|
import { getRandomValues, sha256Digest } from './BrowserCrypto.mjs';
|
|
7
7
|
import { pkceNotCreated } from '../error/BrowserAuthErrorCodes.mjs';
|
|
8
8
|
|
|
9
|
-
/*
|
|
10
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
11
|
-
* Licensed under the MIT License.
|
|
12
|
-
*/
|
|
13
|
-
// Constant byte array length
|
|
14
|
-
const RANDOM_BYTE_ARR_LENGTH = 32;
|
|
15
|
-
/**
|
|
16
|
-
* This file defines APIs to generate PKCE codes and code verifiers.
|
|
17
|
-
*/
|
|
18
|
-
/**
|
|
19
|
-
* Generates PKCE Codes. See the RFC for more information: https://tools.ietf.org/html/rfc7636
|
|
20
|
-
*/
|
|
21
|
-
async function generatePkceCodes(performanceClient, logger, correlationId) {
|
|
22
|
-
performanceClient.addQueueMeasurement(PerformanceEvents.GeneratePkceCodes, correlationId);
|
|
23
|
-
const codeVerifier = invoke(generateCodeVerifier, PerformanceEvents.GenerateCodeVerifier, logger, performanceClient, correlationId)(performanceClient, logger, correlationId);
|
|
24
|
-
const codeChallenge = await invokeAsync(generateCodeChallengeFromVerifier, PerformanceEvents.GenerateCodeChallengeFromVerifier, logger, performanceClient, correlationId)(codeVerifier, performanceClient, logger, correlationId);
|
|
25
|
-
return {
|
|
26
|
-
verifier: codeVerifier,
|
|
27
|
-
challenge: codeChallenge,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Generates a random 32 byte buffer and returns the base64
|
|
32
|
-
* encoded string to be used as a PKCE Code Verifier
|
|
33
|
-
*/
|
|
34
|
-
function generateCodeVerifier(performanceClient, logger, correlationId) {
|
|
35
|
-
try {
|
|
36
|
-
// Generate random values as utf-8
|
|
37
|
-
const buffer = new Uint8Array(RANDOM_BYTE_ARR_LENGTH);
|
|
38
|
-
invoke(getRandomValues, PerformanceEvents.GetRandomValues, logger, performanceClient, correlationId)(buffer);
|
|
39
|
-
// encode verifier as base64
|
|
40
|
-
const pkceCodeVerifierB64 = urlEncodeArr(buffer);
|
|
41
|
-
return pkceCodeVerifierB64;
|
|
42
|
-
}
|
|
43
|
-
catch (e) {
|
|
44
|
-
throw createBrowserAuthError(pkceNotCreated);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Creates a base64 encoded PKCE Code Challenge string from the
|
|
49
|
-
* hash created from the PKCE Code Verifier supplied
|
|
50
|
-
*/
|
|
51
|
-
async function generateCodeChallengeFromVerifier(pkceCodeVerifier, performanceClient, logger, correlationId) {
|
|
52
|
-
performanceClient.addQueueMeasurement(PerformanceEvents.GenerateCodeChallengeFromVerifier, correlationId);
|
|
53
|
-
try {
|
|
54
|
-
// hashed verifier
|
|
55
|
-
const pkceHashedCodeVerifier = await invokeAsync(sha256Digest, PerformanceEvents.Sha256Digest, logger, performanceClient, correlationId)(pkceCodeVerifier, performanceClient, correlationId);
|
|
56
|
-
// encode hash as base64
|
|
57
|
-
return urlEncodeArr(new Uint8Array(pkceHashedCodeVerifier));
|
|
58
|
-
}
|
|
59
|
-
catch (e) {
|
|
60
|
-
throw createBrowserAuthError(pkceNotCreated);
|
|
61
|
-
}
|
|
9
|
+
/*
|
|
10
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
11
|
+
* Licensed under the MIT License.
|
|
12
|
+
*/
|
|
13
|
+
// Constant byte array length
|
|
14
|
+
const RANDOM_BYTE_ARR_LENGTH = 32;
|
|
15
|
+
/**
|
|
16
|
+
* This file defines APIs to generate PKCE codes and code verifiers.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Generates PKCE Codes. See the RFC for more information: https://tools.ietf.org/html/rfc7636
|
|
20
|
+
*/
|
|
21
|
+
async function generatePkceCodes(performanceClient, logger, correlationId) {
|
|
22
|
+
performanceClient.addQueueMeasurement(PerformanceEvents.GeneratePkceCodes, correlationId);
|
|
23
|
+
const codeVerifier = invoke(generateCodeVerifier, PerformanceEvents.GenerateCodeVerifier, logger, performanceClient, correlationId)(performanceClient, logger, correlationId);
|
|
24
|
+
const codeChallenge = await invokeAsync(generateCodeChallengeFromVerifier, PerformanceEvents.GenerateCodeChallengeFromVerifier, logger, performanceClient, correlationId)(codeVerifier, performanceClient, logger, correlationId);
|
|
25
|
+
return {
|
|
26
|
+
verifier: codeVerifier,
|
|
27
|
+
challenge: codeChallenge,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generates a random 32 byte buffer and returns the base64
|
|
32
|
+
* encoded string to be used as a PKCE Code Verifier
|
|
33
|
+
*/
|
|
34
|
+
function generateCodeVerifier(performanceClient, logger, correlationId) {
|
|
35
|
+
try {
|
|
36
|
+
// Generate random values as utf-8
|
|
37
|
+
const buffer = new Uint8Array(RANDOM_BYTE_ARR_LENGTH);
|
|
38
|
+
invoke(getRandomValues, PerformanceEvents.GetRandomValues, logger, performanceClient, correlationId)(buffer);
|
|
39
|
+
// encode verifier as base64
|
|
40
|
+
const pkceCodeVerifierB64 = urlEncodeArr(buffer);
|
|
41
|
+
return pkceCodeVerifierB64;
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
throw createBrowserAuthError(pkceNotCreated);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Creates a base64 encoded PKCE Code Challenge string from the
|
|
49
|
+
* hash created from the PKCE Code Verifier supplied
|
|
50
|
+
*/
|
|
51
|
+
async function generateCodeChallengeFromVerifier(pkceCodeVerifier, performanceClient, logger, correlationId) {
|
|
52
|
+
performanceClient.addQueueMeasurement(PerformanceEvents.GenerateCodeChallengeFromVerifier, correlationId);
|
|
53
|
+
try {
|
|
54
|
+
// hashed verifier
|
|
55
|
+
const pkceHashedCodeVerifier = await invokeAsync(sha256Digest, PerformanceEvents.Sha256Digest, logger, performanceClient, correlationId)(pkceCodeVerifier, performanceClient, correlationId);
|
|
56
|
+
// encode hash as base64
|
|
57
|
+
return urlEncodeArr(new Uint8Array(pkceHashedCodeVerifier));
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
throw createBrowserAuthError(pkceNotCreated);
|
|
61
|
+
}
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
export { generatePkceCodes };
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import { LoggerOptions, SignedHttpRequestParameters } from "@azure/msal-common";
|
|
2
|
-
export type SignedHttpRequestOptions = {
|
|
3
|
-
loggerOptions: LoggerOptions;
|
|
4
|
-
};
|
|
5
|
-
export declare class SignedHttpRequest {
|
|
6
|
-
private popTokenGenerator;
|
|
7
|
-
private cryptoOps;
|
|
8
|
-
private shrParameters;
|
|
9
|
-
private logger;
|
|
10
|
-
constructor(shrParameters: SignedHttpRequestParameters, shrOptions?: SignedHttpRequestOptions);
|
|
11
|
-
/**
|
|
12
|
-
* Generates and caches a keypair for the given request options.
|
|
13
|
-
* @returns Public key digest, which should be sent to the token issuer.
|
|
14
|
-
*/
|
|
15
|
-
generatePublicKeyThumbprint(): Promise<string>;
|
|
16
|
-
/**
|
|
17
|
-
* Generates a signed http request for the given payload with the given key.
|
|
18
|
-
* @param payload Payload to sign (e.g. access token)
|
|
19
|
-
* @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
|
|
20
|
-
* @param claims Additional claims to include/override in the signed JWT
|
|
21
|
-
* @returns Pop token signed with the corresponding private key
|
|
22
|
-
*/
|
|
23
|
-
signRequest(payload: string, publicKeyThumbprint: string, claims?: object): Promise<string>;
|
|
24
|
-
/**
|
|
25
|
-
* Removes cached keys from browser for given public key thumbprint
|
|
26
|
-
* @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
|
|
27
|
-
* @returns If keys are properly deleted
|
|
28
|
-
*/
|
|
29
|
-
removeKeys(publicKeyThumbprint: string): Promise<boolean>;
|
|
30
|
-
}
|
|
1
|
+
import { LoggerOptions, SignedHttpRequestParameters } from "@azure/msal-common";
|
|
2
|
+
export type SignedHttpRequestOptions = {
|
|
3
|
+
loggerOptions: LoggerOptions;
|
|
4
|
+
};
|
|
5
|
+
export declare class SignedHttpRequest {
|
|
6
|
+
private popTokenGenerator;
|
|
7
|
+
private cryptoOps;
|
|
8
|
+
private shrParameters;
|
|
9
|
+
private logger;
|
|
10
|
+
constructor(shrParameters: SignedHttpRequestParameters, shrOptions?: SignedHttpRequestOptions);
|
|
11
|
+
/**
|
|
12
|
+
* Generates and caches a keypair for the given request options.
|
|
13
|
+
* @returns Public key digest, which should be sent to the token issuer.
|
|
14
|
+
*/
|
|
15
|
+
generatePublicKeyThumbprint(): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Generates a signed http request for the given payload with the given key.
|
|
18
|
+
* @param payload Payload to sign (e.g. access token)
|
|
19
|
+
* @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
|
|
20
|
+
* @param claims Additional claims to include/override in the signed JWT
|
|
21
|
+
* @returns Pop token signed with the corresponding private key
|
|
22
|
+
*/
|
|
23
|
+
signRequest(payload: string, publicKeyThumbprint: string, claims?: object): Promise<string>;
|
|
24
|
+
/**
|
|
25
|
+
* Removes cached keys from browser for given public key thumbprint
|
|
26
|
+
* @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
|
|
27
|
+
* @returns If keys are properly deleted
|
|
28
|
+
*/
|
|
29
|
+
removeKeys(publicKeyThumbprint: string): Promise<boolean>;
|
|
30
|
+
}
|
|
31
31
|
//# sourceMappingURL=SignedHttpRequest.d.ts.map
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
/*! @azure/msal-browser v3.
|
|
1
|
+
/*! @azure/msal-browser v3.22.0 2024-08-28 */
|
|
2
2
|
'use strict';
|
|
3
3
|
import { CryptoOps } from './CryptoOps.mjs';
|
|
4
4
|
import { Logger, PopTokenGenerator } from '@azure/msal-common';
|
|
5
5
|
import { name, version } from '../packageMetadata.mjs';
|
|
6
6
|
|
|
7
|
-
/*
|
|
8
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
9
|
-
* Licensed under the MIT License.
|
|
10
|
-
*/
|
|
11
|
-
class SignedHttpRequest {
|
|
12
|
-
constructor(shrParameters, shrOptions) {
|
|
13
|
-
const loggerOptions = (shrOptions && shrOptions.loggerOptions) || {};
|
|
14
|
-
this.logger = new Logger(loggerOptions, name, version);
|
|
15
|
-
this.cryptoOps = new CryptoOps(this.logger);
|
|
16
|
-
this.popTokenGenerator = new PopTokenGenerator(this.cryptoOps);
|
|
17
|
-
this.shrParameters = shrParameters;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Generates and caches a keypair for the given request options.
|
|
21
|
-
* @returns Public key digest, which should be sent to the token issuer.
|
|
22
|
-
*/
|
|
23
|
-
async generatePublicKeyThumbprint() {
|
|
24
|
-
const { kid } = await this.popTokenGenerator.generateKid(this.shrParameters);
|
|
25
|
-
return kid;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Generates a signed http request for the given payload with the given key.
|
|
29
|
-
* @param payload Payload to sign (e.g. access token)
|
|
30
|
-
* @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
|
|
31
|
-
* @param claims Additional claims to include/override in the signed JWT
|
|
32
|
-
* @returns Pop token signed with the corresponding private key
|
|
33
|
-
*/
|
|
34
|
-
async signRequest(payload, publicKeyThumbprint, claims) {
|
|
35
|
-
return this.popTokenGenerator.signPayload(payload, publicKeyThumbprint, this.shrParameters, claims);
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Removes cached keys from browser for given public key thumbprint
|
|
39
|
-
* @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
|
|
40
|
-
* @returns If keys are properly deleted
|
|
41
|
-
*/
|
|
42
|
-
async removeKeys(publicKeyThumbprint) {
|
|
43
|
-
return this.cryptoOps.removeTokenBindingKey(publicKeyThumbprint);
|
|
44
|
-
}
|
|
7
|
+
/*
|
|
8
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
9
|
+
* Licensed under the MIT License.
|
|
10
|
+
*/
|
|
11
|
+
class SignedHttpRequest {
|
|
12
|
+
constructor(shrParameters, shrOptions) {
|
|
13
|
+
const loggerOptions = (shrOptions && shrOptions.loggerOptions) || {};
|
|
14
|
+
this.logger = new Logger(loggerOptions, name, version);
|
|
15
|
+
this.cryptoOps = new CryptoOps(this.logger);
|
|
16
|
+
this.popTokenGenerator = new PopTokenGenerator(this.cryptoOps);
|
|
17
|
+
this.shrParameters = shrParameters;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Generates and caches a keypair for the given request options.
|
|
21
|
+
* @returns Public key digest, which should be sent to the token issuer.
|
|
22
|
+
*/
|
|
23
|
+
async generatePublicKeyThumbprint() {
|
|
24
|
+
const { kid } = await this.popTokenGenerator.generateKid(this.shrParameters);
|
|
25
|
+
return kid;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Generates a signed http request for the given payload with the given key.
|
|
29
|
+
* @param payload Payload to sign (e.g. access token)
|
|
30
|
+
* @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
|
|
31
|
+
* @param claims Additional claims to include/override in the signed JWT
|
|
32
|
+
* @returns Pop token signed with the corresponding private key
|
|
33
|
+
*/
|
|
34
|
+
async signRequest(payload, publicKeyThumbprint, claims) {
|
|
35
|
+
return this.popTokenGenerator.signPayload(payload, publicKeyThumbprint, this.shrParameters, claims);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Removes cached keys from browser for given public key thumbprint
|
|
39
|
+
* @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
|
|
40
|
+
* @returns If keys are properly deleted
|
|
41
|
+
*/
|
|
42
|
+
async removeKeys(publicKeyThumbprint) {
|
|
43
|
+
return this.cryptoOps.removeTokenBindingKey(publicKeyThumbprint);
|
|
44
|
+
}
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
export { SignedHttpRequest };
|