@globus/sdk 6.0.0-rc.7 → 6.0.0-rc.8
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/cjs/core/authorization/index.js +139 -15
- package/dist/cjs/core/authorization/index.js.map +3 -3
- package/dist/cjs/index.js +322 -142
- package/dist/cjs/index.js.map +4 -4
- package/dist/esm/core/authorization/AuthorizationManager.d.ts +14 -8
- package/dist/esm/core/authorization/AuthorizationManager.d.ts.map +1 -1
- package/dist/esm/core/authorization/AuthorizationManager.js +13 -5
- package/dist/esm/core/authorization/AuthorizationManager.js.map +1 -1
- package/dist/esm/core/authorization/PopupTransport.d.ts +25 -0
- package/dist/esm/core/authorization/PopupTransport.d.ts.map +1 -0
- package/dist/esm/core/authorization/PopupTransport.js +161 -0
- package/dist/esm/core/authorization/PopupTransport.js.map +1 -0
- package/dist/esm/core/authorization/RedirectTransport.d.ts +3 -9
- package/dist/esm/core/authorization/RedirectTransport.d.ts.map +1 -1
- package/dist/esm/core/authorization/RedirectTransport.js +6 -17
- package/dist/esm/core/authorization/RedirectTransport.js.map +1 -1
- package/dist/esm/core/authorization/pkce.d.ts +15 -0
- package/dist/esm/core/authorization/pkce.d.ts.map +1 -1
- package/dist/esm/core/authorization/pkce.js +18 -0
- package/dist/esm/core/authorization/pkce.js.map +1 -1
- package/dist/esm/package.json +1 -1
- package/dist/esm/services/transfer/index.d.ts +1 -0
- package/dist/esm/services/transfer/index.d.ts.map +1 -1
- package/dist/esm/services/transfer/index.js +1 -0
- package/dist/esm/services/transfer/index.js.map +1 -1
- package/dist/esm/services/transfer/service/roles.d.ts +75 -0
- package/dist/esm/services/transfer/service/roles.d.ts.map +1 -0
- package/dist/esm/services/transfer/service/roles.js +49 -0
- package/dist/esm/services/transfer/service/roles.js.map +1 -0
- package/dist/umd/globus.production.js +2 -2
- package/dist/umd/globus.production.js.map +4 -4
- package/package.json +1 -1
|
@@ -647,16 +647,23 @@ async function generateCodeChallenge(verifier) {
|
|
|
647
647
|
function generateState() {
|
|
648
648
|
return Array.from(getCrypto().getRandomValues(new Uint8Array(16))).map((v) => CHARSET[v % CHARSET.length]).join("");
|
|
649
649
|
}
|
|
650
|
-
|
|
651
|
-
// src/core/authorization/RedirectTransport.ts
|
|
652
650
|
var KEYS = {
|
|
653
651
|
PKCE_STATE: "pkce_state",
|
|
654
652
|
PKCE_CODE_VERIFIER: "pkce_code_verifier"
|
|
655
653
|
};
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
}
|
|
654
|
+
var store = {
|
|
655
|
+
getKey(key) {
|
|
656
|
+
return key === "state" ? KEYS.PKCE_STATE : KEYS.PKCE_CODE_VERIFIER;
|
|
657
|
+
},
|
|
658
|
+
get: (entry) => sessionStorage.getItem(store.getKey(entry)),
|
|
659
|
+
set: (entry, value) => sessionStorage.setItem(store.getKey(entry), value),
|
|
660
|
+
reset: () => {
|
|
661
|
+
sessionStorage.removeItem(KEYS.PKCE_STATE);
|
|
662
|
+
sessionStorage.removeItem(KEYS.PKCE_CODE_VERIFIER);
|
|
663
|
+
}
|
|
664
|
+
};
|
|
665
|
+
|
|
666
|
+
// src/core/authorization/RedirectTransport.ts
|
|
660
667
|
var RedirectTransport = class _RedirectTransport {
|
|
661
668
|
#options;
|
|
662
669
|
constructor(options) {
|
|
@@ -673,8 +680,8 @@ var RedirectTransport = class _RedirectTransport {
|
|
|
673
680
|
const verifier = generateCodeVerifier();
|
|
674
681
|
const challenge = await generateCodeChallenge(verifier);
|
|
675
682
|
const state = this.#options.params?.["state"] ?? generateState();
|
|
676
|
-
|
|
677
|
-
|
|
683
|
+
store.set("code_verifier", verifier);
|
|
684
|
+
store.set("state", state);
|
|
678
685
|
const params = {
|
|
679
686
|
response_type: "code",
|
|
680
687
|
client_id: this.#options.client,
|
|
@@ -703,9 +710,9 @@ var RedirectTransport = class _RedirectTransport {
|
|
|
703
710
|
}
|
|
704
711
|
const code = params.get("code");
|
|
705
712
|
if (!code) return void 0;
|
|
706
|
-
const state =
|
|
707
|
-
const verifier =
|
|
708
|
-
|
|
713
|
+
const state = store.get("state");
|
|
714
|
+
const verifier = store.get("code_verifier");
|
|
715
|
+
store.reset();
|
|
709
716
|
if (params.get("state") !== state) {
|
|
710
717
|
throw new Error(
|
|
711
718
|
'Invalid State. The received "state" parameter does not match the expected state.'
|
|
@@ -870,10 +877,119 @@ var MemoryStorage = class {
|
|
|
870
877
|
}
|
|
871
878
|
};
|
|
872
879
|
|
|
880
|
+
// src/core/authorization/PopupTransport.ts
|
|
881
|
+
var MESSAGE_SOURCE = "globus-sdk";
|
|
882
|
+
var PopupTransport = class _PopupTransport {
|
|
883
|
+
#options;
|
|
884
|
+
#window = null;
|
|
885
|
+
constructor(options) {
|
|
886
|
+
this.#options = options;
|
|
887
|
+
if (_PopupTransport.supported === false) {
|
|
888
|
+
throw new Error("PopupTransport is not supported in this environment.");
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
/**
|
|
892
|
+
* The `PopupTransport` is supported in environments where the `window` object is available.
|
|
893
|
+
*/
|
|
894
|
+
static supported = isSupported() && "window" in globalThis && typeof globalThis.window.open === "function";
|
|
895
|
+
/**
|
|
896
|
+
* For the redirect transport, sending the request will redirect the user to the authorization endpoint, initiating the OAuth flow.
|
|
897
|
+
*/
|
|
898
|
+
async send() {
|
|
899
|
+
const verifier = generateCodeVerifier();
|
|
900
|
+
const challenge = await generateCodeChallenge(verifier);
|
|
901
|
+
const state = this.#options.params?.["state"] ?? generateState();
|
|
902
|
+
store.set("code_verifier", verifier);
|
|
903
|
+
store.set("state", state);
|
|
904
|
+
const params = {
|
|
905
|
+
response_type: "code",
|
|
906
|
+
client_id: this.#options.client,
|
|
907
|
+
scope: this.#options.scopes || "",
|
|
908
|
+
redirect_uri: this.#options.redirect,
|
|
909
|
+
state,
|
|
910
|
+
code_challenge: challenge,
|
|
911
|
+
code_challenge_method: "S256",
|
|
912
|
+
...this.#options.params || {}
|
|
913
|
+
};
|
|
914
|
+
const url = new URL(getAuthorizationEndpoint());
|
|
915
|
+
url.search = new URLSearchParams(params).toString();
|
|
916
|
+
const promise = new Promise((resolve) => {
|
|
917
|
+
window.addEventListener(
|
|
918
|
+
"message",
|
|
919
|
+
async (e) => {
|
|
920
|
+
const { data } = e;
|
|
921
|
+
if (e.origin !== window.location.origin || data?.source !== MESSAGE_SOURCE) {
|
|
922
|
+
return;
|
|
923
|
+
}
|
|
924
|
+
this.#window?.close();
|
|
925
|
+
const response = await this.#getToken(data.url);
|
|
926
|
+
resolve(response);
|
|
927
|
+
},
|
|
928
|
+
false
|
|
929
|
+
);
|
|
930
|
+
});
|
|
931
|
+
this.#window = window.open(url.toString(), "_blank", "width=800,height=600");
|
|
932
|
+
if (!this.#window) {
|
|
933
|
+
throw new Error("Unable to open window for PopupTransport.");
|
|
934
|
+
}
|
|
935
|
+
this.#window.focus();
|
|
936
|
+
return promise;
|
|
937
|
+
}
|
|
938
|
+
async #getToken(href) {
|
|
939
|
+
const url = new URL(href);
|
|
940
|
+
const params = new URLSearchParams(url.search);
|
|
941
|
+
if (params.get("error")) {
|
|
942
|
+
throw new Error(
|
|
943
|
+
params.get("error_description") || "An error occurred during the authorization process."
|
|
944
|
+
);
|
|
945
|
+
}
|
|
946
|
+
const code = params.get("code");
|
|
947
|
+
if (!code) return void 0;
|
|
948
|
+
const state = store.get("state");
|
|
949
|
+
const verifier = store.get("code_verifier");
|
|
950
|
+
store.reset();
|
|
951
|
+
if (params.get("state") !== state) {
|
|
952
|
+
throw new Error(
|
|
953
|
+
'Invalid State. The received "state" parameter does not match the expected state.'
|
|
954
|
+
);
|
|
955
|
+
}
|
|
956
|
+
if (!verifier) {
|
|
957
|
+
throw new Error("Invalid Code Verifier");
|
|
958
|
+
}
|
|
959
|
+
const payload = {
|
|
960
|
+
code,
|
|
961
|
+
client_id: this.#options.client,
|
|
962
|
+
/**
|
|
963
|
+
* Retrieve the code verifier from session storage.
|
|
964
|
+
*/
|
|
965
|
+
code_verifier: verifier,
|
|
966
|
+
redirect_uri: this.#options.redirect,
|
|
967
|
+
grant_type: "authorization_code"
|
|
968
|
+
};
|
|
969
|
+
const response = await (await oauth2_exports.token.exchange({
|
|
970
|
+
payload
|
|
971
|
+
})).json();
|
|
972
|
+
return response;
|
|
973
|
+
}
|
|
974
|
+
// eslint-disable-next-line class-methods-use-this
|
|
975
|
+
getToken() {
|
|
976
|
+
if (!window.opener) {
|
|
977
|
+
return;
|
|
978
|
+
}
|
|
979
|
+
window.opener.postMessage(
|
|
980
|
+
{
|
|
981
|
+
source: MESSAGE_SOURCE,
|
|
982
|
+
url: window.location.href
|
|
983
|
+
},
|
|
984
|
+
window.location.origin
|
|
985
|
+
);
|
|
986
|
+
}
|
|
987
|
+
};
|
|
988
|
+
|
|
873
989
|
// src/core/authorization/AuthorizationManager.ts
|
|
874
990
|
var TRANSPORTS = {
|
|
875
|
-
redirect: RedirectTransport
|
|
876
|
-
|
|
991
|
+
redirect: RedirectTransport,
|
|
992
|
+
popup: PopupTransport
|
|
877
993
|
};
|
|
878
994
|
var DEFAULT_CONFIGURATION = {
|
|
879
995
|
useRefreshTokens: false,
|
|
@@ -1085,7 +1201,11 @@ var AuthorizationManager = class {
|
|
|
1085
1201
|
log("debug", "AuthorizationManager.login");
|
|
1086
1202
|
this.reset();
|
|
1087
1203
|
const transport = this.#buildTransport({ params: options?.additionalParams });
|
|
1088
|
-
await transport.send();
|
|
1204
|
+
const result = await transport.send();
|
|
1205
|
+
if (isGlobusAuthTokenResponse(result)) {
|
|
1206
|
+
this.addTokenResponse(result);
|
|
1207
|
+
}
|
|
1208
|
+
return result;
|
|
1089
1209
|
}
|
|
1090
1210
|
/**
|
|
1091
1211
|
* Prompt the user to authenticate with Globus Auth.
|
|
@@ -1093,7 +1213,11 @@ var AuthorizationManager = class {
|
|
|
1093
1213
|
async prompt(options) {
|
|
1094
1214
|
log("debug", "AuthorizationManager.prompt");
|
|
1095
1215
|
const transport = this.#buildTransport(options);
|
|
1096
|
-
await transport.send();
|
|
1216
|
+
const result = await transport.send();
|
|
1217
|
+
if (isGlobusAuthTokenResponse(result)) {
|
|
1218
|
+
this.addTokenResponse(result);
|
|
1219
|
+
}
|
|
1220
|
+
return result;
|
|
1097
1221
|
}
|
|
1098
1222
|
/**
|
|
1099
1223
|
* This method will attempt to complete the PKCE protocol flow.
|