@osdk/oauth 1.1.0-beta.6 → 1.1.0-beta.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/CHANGELOG.md +14 -0
- package/build/browser/common.d.ts +9 -10
- package/build/browser/common.d.ts.map +1 -1
- package/build/browser/common.js +23 -6
- package/build/browser/common.js.map +1 -1
- package/build/browser/common.test.d.ts +2 -0
- package/build/browser/common.test.d.ts.map +1 -0
- package/build/browser/common.test.js +64 -0
- package/build/browser/common.test.js.map +1 -0
- package/build/browser/createConfidentialOauthClient.d.ts.map +1 -1
- package/build/browser/createConfidentialOauthClient.js +1 -1
- package/build/browser/createConfidentialOauthClient.js.map +1 -1
- package/build/browser/createPublicOauthClient.d.ts +4 -0
- package/build/browser/createPublicOauthClient.d.ts.map +1 -1
- package/build/browser/createPublicOauthClient.js +28 -16
- package/build/browser/createPublicOauthClient.js.map +1 -1
- package/build/browser/publicOauth.test.js +109 -34
- package/build/browser/publicOauth.test.js.map +1 -1
- package/build/browser/utils.d.ts +4 -2
- package/build/browser/utils.d.ts.map +1 -1
- package/build/browser/utils.js +2 -1
- package/build/browser/utils.js.map +1 -1
- package/build/esm/common.d.ts +9 -10
- package/build/esm/common.d.ts.map +1 -1
- package/build/esm/common.js +23 -6
- package/build/esm/common.js.map +1 -1
- package/build/esm/common.test.d.ts +2 -0
- package/build/esm/common.test.d.ts.map +1 -0
- package/build/esm/common.test.js +64 -0
- package/build/esm/common.test.js.map +1 -0
- package/build/esm/createConfidentialOauthClient.d.ts.map +1 -1
- package/build/esm/createConfidentialOauthClient.js +1 -1
- package/build/esm/createConfidentialOauthClient.js.map +1 -1
- package/build/esm/createPublicOauthClient.d.ts +4 -0
- package/build/esm/createPublicOauthClient.d.ts.map +1 -1
- package/build/esm/createPublicOauthClient.js +28 -16
- package/build/esm/createPublicOauthClient.js.map +1 -1
- package/build/esm/publicOauth.test.js +109 -34
- package/build/esm/publicOauth.test.js.map +1 -1
- package/build/esm/utils.d.ts +4 -2
- package/build/esm/utils.d.ts.map +1 -1
- package/build/esm/utils.js +2 -1
- package/build/esm/utils.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.test.js","names":["afterEach","beforeEach","describe","expect","it","vi","common","createAuthorizationServer","readLocal","removeLocal","saveLocal","stubGlobal","setItem","fn","removeItem","getItem","unstubAllGlobals","client","client_id","$refreshTokenMarker","undefined","oldLocalStorageKey","mocked","globalThis","localStorage","toBeCalledWith","anything","signIn","refresh","authServer","makeTokenAndSaveRefresh","refresh_token","access_token","token_type","expires_in","JSON","stringify","refreshTokenMarker"],"sources":["common.test.js"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { common, createAuthorizationServer, readLocal, removeLocal, saveLocal, } from \"./common.js\";\ndescribe(\"local functions\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"localStorage\", {\n setItem: vi.fn(),\n removeItem: vi.fn(),\n getItem: vi.fn(),\n });\n });\n afterEach(() => {\n vi.unstubAllGlobals();\n });\n it(\"should use the old style keys when there is no refresh token marker\", () => {\n const client = {\n client_id: \"hi_mom\",\n $refreshTokenMarker: undefined,\n };\n const oldLocalStorageKey = `@osdk/oauth : refresh : ${client.client_id}`;\n readLocal(client);\n removeLocal(client);\n saveLocal(client, {});\n expect(vi.mocked(globalThis.localStorage.getItem)).toBeCalledWith(oldLocalStorageKey);\n expect(vi.mocked(globalThis.localStorage.setItem)).toBeCalledWith(oldLocalStorageKey, expect.anything());\n expect(vi.mocked(globalThis.localStorage.removeItem)).toBeCalledWith(oldLocalStorageKey);\n });\n it(\"should save the refreshTokenMaker if it exists\", () => {\n const client = {\n client_id: \"hi_mom\",\n };\n const signIn = vi.fn();\n const refresh = vi.fn();\n const authServer = createAuthorizationServer(\"multipass\", \"https://stack.palantir.com\");\n const { makeTokenAndSaveRefresh } = common(client, authServer, signIn, {}, refresh, \"marker marker\");\n makeTokenAndSaveRefresh({\n refresh_token: \"refresh\",\n access_token: \"access\",\n token_type: \"idk\",\n expires_in: 10_000,\n }, \"signIn\");\n expect(globalThis.localStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${client.client_id}`, JSON.stringify({\n refresh_token: \"refresh\",\n refreshTokenMarker: \"marker marker\",\n }));\n });\n});\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,SAAS,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,QAAQ;AACxE,SAASC,MAAM,EAAEC,yBAAyB,EAAEC,SAAS,EAAEC,WAAW,EAAEC,SAAS,QAAS,aAAa;AACnGR,QAAQ,CAAC,iBAAiB,EAAE,MAAM;EAC9BD,UAAU,CAAC,MAAM;IACbI,EAAE,CAACM,UAAU,CAAC,cAAc,EAAE;MAC1BC,OAAO,EAAEP,EAAE,CAACQ,EAAE,CAAC,CAAC;MAChBC,UAAU,EAAET,EAAE,CAACQ,EAAE,CAAC,CAAC;MACnBE,OAAO,EAAEV,EAAE,CAACQ,EAAE,CAAC;IACnB,CAAC,CAAC;EACN,CAAC,CAAC;EACFb,SAAS,CAAC,MAAM;IACZK,EAAE,CAACW,gBAAgB,CAAC,CAAC;EACzB,CAAC,CAAC;EACFZ,EAAE,CAAC,qEAAqE,EAAE,MAAM;IAC5E,MAAMa,MAAM,GAAG;MACXC,SAAS,EAAE,QAAQ;MACnBC,mBAAmB,EAAEC;IACzB,CAAC;IACD,MAAMC,kBAAkB,GAAG,2BAA2BJ,MAAM,CAACC,SAAS,EAAE;IACxEV,SAAS,CAACS,MAAM,CAAC;IACjBR,WAAW,CAACQ,MAAM,CAAC;IACnBP,SAAS,CAACO,MAAM,EAAE,CAAC,CAAC,CAAC;IACrBd,MAAM,CAACE,EAAE,CAACiB,MAAM,CAACC,UAAU,CAACC,YAAY,CAACT,OAAO,CAAC,CAAC,CAACU,cAAc,CAACJ,kBAAkB,CAAC;IACrFlB,MAAM,CAACE,EAAE,CAACiB,MAAM,CAACC,UAAU,CAACC,YAAY,CAACZ,OAAO,CAAC,CAAC,CAACa,cAAc,CAACJ,kBAAkB,EAAElB,MAAM,CAACuB,QAAQ,CAAC,CAAC,CAAC;IACxGvB,MAAM,CAACE,EAAE,CAACiB,MAAM,CAACC,UAAU,CAACC,YAAY,CAACV,UAAU,CAAC,CAAC,CAACW,cAAc,CAACJ,kBAAkB,CAAC;EAC5F,CAAC,CAAC;EACFjB,EAAE,CAAC,gDAAgD,EAAE,MAAM;IACvD,MAAMa,MAAM,GAAG;MACXC,SAAS,EAAE;IACf,CAAC;IACD,MAAMS,MAAM,GAAGtB,EAAE,CAACQ,EAAE,CAAC,CAAC;IACtB,MAAMe,OAAO,GAAGvB,EAAE,CAACQ,EAAE,CAAC,CAAC;IACvB,MAAMgB,UAAU,GAAGtB,yBAAyB,CAAC,WAAW,EAAE,4BAA4B,CAAC;IACvF,MAAM;MAAEuB;IAAwB,CAAC,GAAGxB,MAAM,CAACW,MAAM,EAAEY,UAAU,EAAEF,MAAM,EAAE,CAAC,CAAC,EAAEC,OAAO,EAAE,eAAe,CAAC;IACpGE,uBAAuB,CAAC;MACpBC,aAAa,EAAE,SAAS;MACxBC,YAAY,EAAE,QAAQ;MACtBC,UAAU,EAAE,KAAK;MACjBC,UAAU,EAAE;IAChB,CAAC,EAAE,QAAQ,CAAC;IACZ/B,MAAM,CAACoB,UAAU,CAACC,YAAY,CAACZ,OAAO,CAAC,CAACa,cAAc,CAAC,2BAA2BR,MAAM,CAACC,SAAS,EAAE,EAAEiB,IAAI,CAACC,SAAS,CAAC;MACjHL,aAAa,EAAE,SAAS;MACxBM,kBAAkB,EAAE;IACxB,CAAC,CAAC,CAAC;EACP,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createConfidentialOauthClient.d.ts","sourceRoot":"","sources":["../../src/createConfidentialOauthClient.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAG5E;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAM,EAAwC,EACtD,OAAO,GAAE,OAAO,UAAU,CAAC,KAAwB,EACnD,OAAO,GAAE,MAAoB,GAC5B,uBAAuB,
|
|
1
|
+
{"version":3,"file":"createConfidentialOauthClient.d.ts","sourceRoot":"","sources":["../../src/createConfidentialOauthClient.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAG5E;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAM,EAAwC,EACtD,OAAO,GAAE,OAAO,UAAU,CAAC,KAAwB,EACnD,OAAO,GAAE,MAAoB,GAC5B,uBAAuB,CAiCzB"}
|
|
@@ -41,7 +41,7 @@ export function createConfidentialOauthClient(client_id, client_secret, url, sco
|
|
|
41
41
|
return makeTokenAndSaveRefresh(throwIfError(await processClientCredentialsResponse(authServer, client, await clientCredentialsGrantRequest(authServer, client, new URLSearchParams({
|
|
42
42
|
scope: scopes.join(" ")
|
|
43
43
|
}), oauthHttpOptions))), "signIn");
|
|
44
|
-
}, oauthHttpOptions, undefined);
|
|
44
|
+
}, oauthHttpOptions, undefined, undefined);
|
|
45
45
|
return getToken;
|
|
46
46
|
}
|
|
47
47
|
//# sourceMappingURL=createConfidentialOauthClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createConfidentialOauthClient.js","names":["clientCredentialsGrantRequest","customFetch","processClientCredentialsResponse","common","createAuthorizationServer","throwIfError","createConfidentialOauthClient","client_id","client_secret","url","scopes","fetchFn","globalThis","fetch","ctxPath","client","authServer","oauthHttpOptions","getToken","makeTokenAndSaveRefresh","URLSearchParams","scope","join","undefined"],"sources":["createConfidentialOauthClient.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { clientCredentialsGrantRequest, customFetch, processClientCredentialsResponse, } from \"oauth4webapi\";\nimport { common, createAuthorizationServer } from \"./common.js\";\nimport { throwIfError } from \"./throwIfError.js\";\n/**\n * @param client_id\n * @param client_secret\n * @param url the base url of your foundry server\n * @param scopes\n * @param fetchFn\n * @param ctxPath\n * @returns which can be used as a token provider\n */\nexport function createConfidentialOauthClient(client_id, client_secret, url, scopes = [\"api:read-data\", \"api:write-data\"], fetchFn = globalThis.fetch, ctxPath = \"multipass\") {\n const client = { client_id, client_secret };\n const authServer = createAuthorizationServer(ctxPath, url);\n const oauthHttpOptions = { [customFetch]: fetchFn };\n const { getToken, makeTokenAndSaveRefresh } = common(client, authServer, _signIn, oauthHttpOptions, undefined);\n async function _signIn() {\n return makeTokenAndSaveRefresh(throwIfError(await processClientCredentialsResponse(authServer, client, await clientCredentialsGrantRequest(authServer, client, new URLSearchParams({ scope: scopes.join(\" \") }), oauthHttpOptions))), \"signIn\");\n }\n return getToken;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,6BAA6B,EAAEC,WAAW,EAAEC,gCAAgC,QAAS,cAAc;AAC5G,SAASC,MAAM,EAAEC,yBAAyB,QAAQ,aAAa;AAC/D,SAASC,YAAY,QAAQ,mBAAmB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,6BAA6BA,CAACC,SAAS,EAAEC,aAAa,EAAEC,GAAG,EAAEC,MAAM,GAAG,CAAC,eAAe,EAAE,gBAAgB,CAAC,EAAEC,OAAO,GAAGC,UAAU,CAACC,KAAK,EAAEC,OAAO,GAAG,WAAW,EAAE;EAC1K,MAAMC,MAAM,GAAG;IAAER,SAAS;IAAEC;EAAc,CAAC;EAC3C,MAAMQ,UAAU,GAAGZ,yBAAyB,CAACU,OAAO,EAAEL,GAAG,CAAC;EAC1D,MAAMQ,gBAAgB,GAAG;IAAE,CAAChB,WAAW,GAAGU;EAAQ,CAAC;EACnD,MAAM;IAAEO,QAAQ;IAAEC;EAAwB,CAAC,GAAGhB,MAAM,CAACY,MAAM,EAAEC,UAAU,EACvE,kBAAyB;IACrB,OAAOG,uBAAuB,CAACd,YAAY,CAAC,MAAMH,gCAAgC,CAACc,UAAU,EAAED,MAAM,EAAE,MAAMf,6BAA6B,CAACgB,UAAU,EAAED,MAAM,EAAE,IAAIK,eAAe,CAAC;MAAEC,KAAK,EAAEX,MAAM,CAACY,IAAI,CAAC,GAAG;IAAE,CAAC,CAAC,EAAEL,gBAAgB,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;EACnP,CAAC,EAHiFA,gBAAgB,EAAEM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"createConfidentialOauthClient.js","names":["clientCredentialsGrantRequest","customFetch","processClientCredentialsResponse","common","createAuthorizationServer","throwIfError","createConfidentialOauthClient","client_id","client_secret","url","scopes","fetchFn","globalThis","fetch","ctxPath","client","authServer","oauthHttpOptions","getToken","makeTokenAndSaveRefresh","URLSearchParams","scope","join","undefined"],"sources":["createConfidentialOauthClient.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { clientCredentialsGrantRequest, customFetch, processClientCredentialsResponse, } from \"oauth4webapi\";\nimport { common, createAuthorizationServer } from \"./common.js\";\nimport { throwIfError } from \"./throwIfError.js\";\n/**\n * @param client_id\n * @param client_secret\n * @param url the base url of your foundry server\n * @param scopes\n * @param fetchFn\n * @param ctxPath\n * @returns which can be used as a token provider\n */\nexport function createConfidentialOauthClient(client_id, client_secret, url, scopes = [\"api:read-data\", \"api:write-data\"], fetchFn = globalThis.fetch, ctxPath = \"multipass\") {\n const client = { client_id, client_secret };\n const authServer = createAuthorizationServer(ctxPath, url);\n const oauthHttpOptions = { [customFetch]: fetchFn };\n const { getToken, makeTokenAndSaveRefresh } = common(client, authServer, _signIn, oauthHttpOptions, undefined, undefined);\n async function _signIn() {\n return makeTokenAndSaveRefresh(throwIfError(await processClientCredentialsResponse(authServer, client, await clientCredentialsGrantRequest(authServer, client, new URLSearchParams({ scope: scopes.join(\" \") }), oauthHttpOptions))), \"signIn\");\n }\n return getToken;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,6BAA6B,EAAEC,WAAW,EAAEC,gCAAgC,QAAS,cAAc;AAC5G,SAASC,MAAM,EAAEC,yBAAyB,QAAQ,aAAa;AAC/D,SAASC,YAAY,QAAQ,mBAAmB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,6BAA6BA,CAACC,SAAS,EAAEC,aAAa,EAAEC,GAAG,EAAEC,MAAM,GAAG,CAAC,eAAe,EAAE,gBAAgB,CAAC,EAAEC,OAAO,GAAGC,UAAU,CAACC,KAAK,EAAEC,OAAO,GAAG,WAAW,EAAE;EAC1K,MAAMC,MAAM,GAAG;IAAER,SAAS;IAAEC;EAAc,CAAC;EAC3C,MAAMQ,UAAU,GAAGZ,yBAAyB,CAACU,OAAO,EAAEL,GAAG,CAAC;EAC1D,MAAMQ,gBAAgB,GAAG;IAAE,CAAChB,WAAW,GAAGU;EAAQ,CAAC;EACnD,MAAM;IAAEO,QAAQ;IAAEC;EAAwB,CAAC,GAAGhB,MAAM,CAACY,MAAM,EAAEC,UAAU,EACvE,kBAAyB;IACrB,OAAOG,uBAAuB,CAACd,YAAY,CAAC,MAAMH,gCAAgC,CAACc,UAAU,EAAED,MAAM,EAAE,MAAMf,6BAA6B,CAACgB,UAAU,EAAED,MAAM,EAAE,IAAIK,eAAe,CAAC;MAAEC,KAAK,EAAEX,MAAM,CAACY,IAAI,CAAC,GAAG;IAAE,CAAC,CAAC,EAAEL,gBAAgB,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;EACnP,CAAC,EAHiFA,gBAAgB,EAAEM,SAAS,EAAEA,SAAS,CAAC;EAIzH,OAAOL,QAAQ;AACnB","ignoreList":[]}
|
|
@@ -24,6 +24,10 @@ export interface PublicOauthClientOptions {
|
|
|
24
24
|
* Context path for the authorization server (defaults to "multipass")
|
|
25
25
|
*/
|
|
26
26
|
ctxPath?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Allows for an additional value to be appended to the local storage key for the refresh token.
|
|
29
|
+
*/
|
|
30
|
+
refreshTokenMarker?: string;
|
|
27
31
|
}
|
|
28
32
|
/**
|
|
29
33
|
* Creates a PublicOauthClient for authentication.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPublicOauthClient.d.ts","sourceRoot":"","sources":["../../src/createPublicOauthClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"createPublicOauthClient.d.ts","sourceRoot":"","sources":["../../src/createPublicOauthClient.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAYhE,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAElC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,wBAAwB,GACjC,iBAAiB,CAAC;AAErB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,OAAO,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,EACjC,OAAO,CAAC,EAAE,MAAM,GACf,iBAAiB,CAAC"}
|
|
@@ -15,17 +15,19 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import delay from "delay";
|
|
17
17
|
import { authorizationCodeGrantRequest, calculatePKCECodeChallenge, customFetch, generateRandomCodeVerifier, generateRandomState, processAuthorizationCodeOAuth2Response, refreshTokenGrantRequest, validateAuthResponse } from "oauth4webapi";
|
|
18
|
-
import { common, createAuthorizationServer, readLocal, removeLocal, saveLocal } from "./common.js";
|
|
18
|
+
import { common, createAuthorizationServer, readLocal, readSession, removeLocal, removeSession, saveLocal, saveSession } from "./common.js";
|
|
19
19
|
import { throwIfError } from "./throwIfError.js";
|
|
20
20
|
import { processOptionsAndAssignDefaults } from "./utils.js";
|
|
21
21
|
export function createPublicOauthClient(client_id, url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath) {
|
|
22
|
+
let refreshTokenMarker;
|
|
22
23
|
({
|
|
23
24
|
useHistory,
|
|
24
25
|
loginPage,
|
|
25
26
|
postLoginPage,
|
|
26
27
|
scopes,
|
|
27
28
|
fetchFn,
|
|
28
|
-
ctxPath
|
|
29
|
+
ctxPath,
|
|
30
|
+
refreshTokenMarker
|
|
29
31
|
} = processOptionsAndAssignDefaults(url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath));
|
|
30
32
|
const client = {
|
|
31
33
|
client_id,
|
|
@@ -46,18 +48,22 @@ export function createPublicOauthClient(client_id, url, redirect_uri, useHistory
|
|
|
46
48
|
) ?? (await maybeHandleAuthReturn())
|
|
47
49
|
// 3. If we haven't been able to load the token from one of the two above ways, we need to make the initial auth request
|
|
48
50
|
?? (await initiateLoginRedirect());
|
|
49
|
-
}, oauthHttpOptions, maybeRefresh.bind(globalThis, true));
|
|
51
|
+
}, oauthHttpOptions, maybeRefresh.bind(globalThis, true), refreshTokenMarker);
|
|
50
52
|
// as an arrow function, `useHistory` is known to be a boolean
|
|
51
53
|
const go = async x => {
|
|
52
|
-
if (useHistory)
|
|
54
|
+
if (useHistory) {
|
|
55
|
+
window.history.replaceState({}, "", x);
|
|
56
|
+
return;
|
|
57
|
+
} else window.location.assign(x);
|
|
53
58
|
await delay(1000);
|
|
54
59
|
throw new Error("Unable to redirect");
|
|
55
60
|
};
|
|
56
61
|
async function maybeRefresh(expectRefreshToken) {
|
|
57
62
|
const {
|
|
58
|
-
refresh_token
|
|
63
|
+
refresh_token,
|
|
64
|
+
refreshTokenMarker: lastRefreshTokenMarker
|
|
59
65
|
} = readLocal(client);
|
|
60
|
-
if (!refresh_token) {
|
|
66
|
+
if (!refresh_token || lastRefreshTokenMarker !== refreshTokenMarker) {
|
|
61
67
|
if (expectRefreshToken) throw new Error("No refresh token found");
|
|
62
68
|
return;
|
|
63
69
|
}
|
|
@@ -68,8 +74,9 @@ export function createPublicOauthClient(client_id, url, redirect_uri, useHistory
|
|
|
68
74
|
if (result && window.location.pathname === new URL(redirect_uri).pathname) {
|
|
69
75
|
const {
|
|
70
76
|
oldUrl
|
|
71
|
-
} =
|
|
72
|
-
|
|
77
|
+
} = readSession(client);
|
|
78
|
+
// don't block on the redirect
|
|
79
|
+
void go(oldUrl ?? "/");
|
|
73
80
|
}
|
|
74
81
|
return result;
|
|
75
82
|
} catch (e) {
|
|
@@ -85,14 +92,14 @@ export function createPublicOauthClient(client_id, url, redirect_uri, useHistory
|
|
|
85
92
|
}
|
|
86
93
|
async function maybeHandleAuthReturn() {
|
|
87
94
|
const {
|
|
88
|
-
codeVerifier,
|
|
89
95
|
state,
|
|
90
|
-
oldUrl
|
|
91
|
-
|
|
96
|
+
oldUrl,
|
|
97
|
+
codeVerifier
|
|
98
|
+
} = readSession(client);
|
|
92
99
|
if (!codeVerifier) return;
|
|
93
100
|
try {
|
|
94
101
|
const ret = makeTokenAndSaveRefresh(throwIfError(await processAuthorizationCodeOAuth2Response(authServer, client, await authorizationCodeGrantRequest(authServer, client, throwIfError(validateAuthResponse(authServer, client, new URL(window.location.href), state)), redirect_uri, codeVerifier, oauthHttpOptions))), "signIn");
|
|
95
|
-
go(oldUrl);
|
|
102
|
+
void go(oldUrl);
|
|
96
103
|
return ret;
|
|
97
104
|
} catch (e) {
|
|
98
105
|
if (process.env.NODE_ENV !== "production") {
|
|
@@ -100,20 +107,25 @@ export function createPublicOauthClient(client_id, url, redirect_uri, useHistory
|
|
|
100
107
|
console.warn("Failed to get OAuth2 token using PKCE, removing PKCE and starting a new auth flow", e);
|
|
101
108
|
}
|
|
102
109
|
removeLocal(client);
|
|
110
|
+
removeSession(client);
|
|
111
|
+
throw e;
|
|
103
112
|
}
|
|
104
113
|
}
|
|
105
114
|
// As an arrow function, `scopes` and `postLoginPage` are known at compile time
|
|
106
115
|
const initiateLoginRedirect = async () => {
|
|
107
116
|
if (loginPage && window.location.href !== loginPage && window.location.pathname !== loginPage) {
|
|
108
|
-
saveLocal(client, {
|
|
117
|
+
saveLocal(client, {});
|
|
118
|
+
saveSession(client, {
|
|
109
119
|
oldUrl: postLoginPage
|
|
110
120
|
});
|
|
111
|
-
|
|
121
|
+
await go(loginPage);
|
|
122
|
+
return;
|
|
112
123
|
}
|
|
113
124
|
const state = generateRandomState();
|
|
114
125
|
const codeVerifier = generateRandomCodeVerifier();
|
|
115
|
-
const oldUrl =
|
|
116
|
-
saveLocal(client, {
|
|
126
|
+
const oldUrl = readSession(client).oldUrl ?? window.location.toString();
|
|
127
|
+
saveLocal(client, {});
|
|
128
|
+
saveSession(client, {
|
|
117
129
|
codeVerifier,
|
|
118
130
|
state,
|
|
119
131
|
oldUrl
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPublicOauthClient.js","names":["delay","authorizationCodeGrantRequest","calculatePKCECodeChallenge","customFetch","generateRandomCodeVerifier","generateRandomState","processAuthorizationCodeOAuth2Response","refreshTokenGrantRequest","validateAuthResponse","common","createAuthorizationServer","readLocal","removeLocal","saveLocal","throwIfError","processOptionsAndAssignDefaults","createPublicOauthClient","client_id","url","redirect_uri","useHistory","loginPage","postLoginPage","scopes","fetchFn","ctxPath","client","token_endpoint_auth_method","authServer","oauthHttpOptions","makeTokenAndSaveRefresh","getToken","_signIn","maybeRefresh","maybeHandleAuthReturn","initiateLoginRedirect","bind","globalThis","go","x","window","history","replaceState","location","assign","Error","expectRefreshToken","refresh_token","result","pathname","URL","oldUrl","e","process","env","NODE_ENV","console","warn","codeVerifier","state","ret","href","toString","authorization_endpoint","URLSearchParams","response_type","code_challenge","code_challenge_method","scope","join"],"sources":["createPublicOauthClient.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport delay from \"delay\";\nimport { authorizationCodeGrantRequest, calculatePKCECodeChallenge, customFetch, generateRandomCodeVerifier, generateRandomState, processAuthorizationCodeOAuth2Response, refreshTokenGrantRequest, validateAuthResponse, } from \"oauth4webapi\";\nimport { common, createAuthorizationServer, readLocal, removeLocal, saveLocal, } from \"./common.js\";\nimport { throwIfError } from \"./throwIfError.js\";\nimport { processOptionsAndAssignDefaults } from \"./utils.js\";\nexport function createPublicOauthClient(client_id, url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath) {\n ({\n useHistory,\n loginPage,\n postLoginPage,\n scopes,\n fetchFn,\n ctxPath,\n } = processOptionsAndAssignDefaults(url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath));\n const client = { client_id, token_endpoint_auth_method: \"none\" };\n const authServer = createAuthorizationServer(ctxPath, url);\n const oauthHttpOptions = { [customFetch]: fetchFn };\n const { makeTokenAndSaveRefresh, getToken } = common(client, authServer, _signIn, oauthHttpOptions, maybeRefresh.bind(globalThis, true));\n // as an arrow function, `useHistory` is known to be a boolean\n const go = async (x) => {\n if (useHistory)\n return window.history.replaceState({}, \"\", x);\n else\n window.location.assign(x);\n await delay(1000);\n throw new Error(\"Unable to redirect\");\n };\n async function maybeRefresh(expectRefreshToken) {\n const { refresh_token } = readLocal(client);\n if (!refresh_token) {\n if (expectRefreshToken)\n throw new Error(\"No refresh token found\");\n return;\n }\n try {\n // note, we don't use processRefreshTokenResponse because the mp oauth implementation\n // doesn't do refresh tokens quite right and this lets us skip the id check\n const result = makeTokenAndSaveRefresh(throwIfError(await processAuthorizationCodeOAuth2Response(authServer, client, await refreshTokenGrantRequest(authServer, client, refresh_token, oauthHttpOptions))), \"refresh\");\n if (result && window.location.pathname === new URL(redirect_uri).pathname) {\n const { oldUrl } = readLocal(client);\n go(oldUrl ?? \"/\");\n }\n return result;\n }\n catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to get OAuth2 refresh token. Removing refresh token\", e);\n }\n removeLocal(client);\n if (expectRefreshToken) {\n throw new Error(\"Could not refresh token\");\n }\n }\n }\n async function maybeHandleAuthReturn() {\n const { codeVerifier, state, oldUrl } = readLocal(client);\n if (!codeVerifier)\n return;\n try {\n const ret = makeTokenAndSaveRefresh(throwIfError(await processAuthorizationCodeOAuth2Response(authServer, client, await authorizationCodeGrantRequest(authServer, client, throwIfError(validateAuthResponse(authServer, client, new URL(window.location.href), state)), redirect_uri, codeVerifier, oauthHttpOptions))), \"signIn\");\n go(oldUrl);\n return ret;\n }\n catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to get OAuth2 token using PKCE, removing PKCE and starting a new auth flow\", e);\n }\n removeLocal(client);\n }\n }\n // As an arrow function, `scopes` and `postLoginPage` are known at compile time\n const initiateLoginRedirect = async () => {\n if (loginPage\n && window.location.href !== loginPage\n && window.location.pathname !== loginPage) {\n saveLocal(client, { oldUrl: postLoginPage });\n return await go(loginPage);\n }\n const state = generateRandomState();\n const codeVerifier = generateRandomCodeVerifier();\n const oldUrl = readLocal(client).oldUrl ?? window.location.toString();\n saveLocal(client, { codeVerifier, state, oldUrl });\n window.location.assign(`${authServer\n .authorization_endpoint}?${new URLSearchParams({\n client_id,\n response_type: \"code\",\n state,\n redirect_uri,\n code_challenge: await calculatePKCECodeChallenge(codeVerifier),\n code_challenge_method: \"S256\",\n scope: [\"offline_access\", ...scopes].join(\" \"),\n })}`);\n // Give time for redirect to happen\n await delay(1000);\n throw new Error(\"Unable to redirect\");\n };\n /** Will throw if there is no token! */\n async function _signIn() {\n // 1. Check if we have a refresh token in local storage\n return await maybeRefresh()\n // 2. If there is no refresh token we are likely trying to perform the callback\n ?? await maybeHandleAuthReturn()\n // 3. If we haven't been able to load the token from one of the two above ways, we need to make the initial auth request\n ?? await initiateLoginRedirect();\n }\n return getToken;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"createPublicOauthClient.js","names":["delay","authorizationCodeGrantRequest","calculatePKCECodeChallenge","customFetch","generateRandomCodeVerifier","generateRandomState","processAuthorizationCodeOAuth2Response","refreshTokenGrantRequest","validateAuthResponse","common","createAuthorizationServer","readLocal","readSession","removeLocal","removeSession","saveLocal","saveSession","throwIfError","processOptionsAndAssignDefaults","createPublicOauthClient","client_id","url","redirect_uri","useHistory","loginPage","postLoginPage","scopes","fetchFn","ctxPath","refreshTokenMarker","client","token_endpoint_auth_method","authServer","oauthHttpOptions","makeTokenAndSaveRefresh","getToken","_signIn","maybeRefresh","maybeHandleAuthReturn","initiateLoginRedirect","bind","globalThis","go","x","window","history","replaceState","location","assign","Error","expectRefreshToken","refresh_token","lastRefreshTokenMarker","result","pathname","URL","oldUrl","e","process","env","NODE_ENV","console","warn","state","codeVerifier","ret","href","toString","authorization_endpoint","URLSearchParams","response_type","code_challenge","code_challenge_method","scope","join"],"sources":["createPublicOauthClient.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport delay from \"delay\";\nimport { authorizationCodeGrantRequest, calculatePKCECodeChallenge, customFetch, generateRandomCodeVerifier, generateRandomState, processAuthorizationCodeOAuth2Response, refreshTokenGrantRequest, validateAuthResponse, } from \"oauth4webapi\";\nimport { common, createAuthorizationServer, readLocal, readSession, removeLocal, removeSession, saveLocal, saveSession, } from \"./common.js\";\nimport { throwIfError } from \"./throwIfError.js\";\nimport { processOptionsAndAssignDefaults } from \"./utils.js\";\nexport function createPublicOauthClient(client_id, url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath) {\n let refreshTokenMarker;\n ({\n useHistory,\n loginPage,\n postLoginPage,\n scopes,\n fetchFn,\n ctxPath,\n refreshTokenMarker,\n } = processOptionsAndAssignDefaults(url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath));\n const client = {\n client_id,\n token_endpoint_auth_method: \"none\",\n };\n const authServer = createAuthorizationServer(ctxPath, url);\n const oauthHttpOptions = { [customFetch]: fetchFn };\n const { makeTokenAndSaveRefresh, getToken } = common(client, authServer, _signIn, oauthHttpOptions, maybeRefresh.bind(globalThis, true), refreshTokenMarker);\n // as an arrow function, `useHistory` is known to be a boolean\n const go = async (x) => {\n if (useHistory) {\n window.history.replaceState({}, \"\", x);\n return;\n }\n else\n window.location.assign(x);\n await delay(1000);\n throw new Error(\"Unable to redirect\");\n };\n async function maybeRefresh(expectRefreshToken) {\n const { refresh_token, refreshTokenMarker: lastRefreshTokenMarker } = readLocal(client);\n if (!refresh_token || lastRefreshTokenMarker !== refreshTokenMarker) {\n if (expectRefreshToken)\n throw new Error(\"No refresh token found\");\n return;\n }\n try {\n // note, we don't use processRefreshTokenResponse because the mp oauth implementation\n // doesn't do refresh tokens quite right and this lets us skip the id check\n const result = makeTokenAndSaveRefresh(throwIfError(await processAuthorizationCodeOAuth2Response(authServer, client, await refreshTokenGrantRequest(authServer, client, refresh_token, oauthHttpOptions))), \"refresh\");\n if (result && window.location.pathname === new URL(redirect_uri).pathname) {\n const { oldUrl } = readSession(client);\n // don't block on the redirect\n void go(oldUrl ?? \"/\");\n }\n return result;\n }\n catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to get OAuth2 refresh token. Removing refresh token\", e);\n }\n removeLocal(client);\n if (expectRefreshToken) {\n throw new Error(\"Could not refresh token\");\n }\n }\n }\n async function maybeHandleAuthReturn() {\n const { state, oldUrl, codeVerifier } = readSession(client);\n if (!codeVerifier)\n return;\n try {\n const ret = makeTokenAndSaveRefresh(throwIfError(await processAuthorizationCodeOAuth2Response(authServer, client, await authorizationCodeGrantRequest(authServer, client, throwIfError(validateAuthResponse(authServer, client, new URL(window.location.href), state)), redirect_uri, codeVerifier, oauthHttpOptions))), \"signIn\");\n void go(oldUrl);\n return ret;\n }\n catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to get OAuth2 token using PKCE, removing PKCE and starting a new auth flow\", e);\n }\n removeLocal(client);\n removeSession(client);\n throw e;\n }\n }\n // As an arrow function, `scopes` and `postLoginPage` are known at compile time\n const initiateLoginRedirect = async () => {\n if (loginPage\n && window.location.href !== loginPage\n && window.location.pathname !== loginPage) {\n saveLocal(client, {});\n saveSession(client, { oldUrl: postLoginPage });\n await go(loginPage);\n return;\n }\n const state = generateRandomState();\n const codeVerifier = generateRandomCodeVerifier();\n const oldUrl = readSession(client).oldUrl ?? window.location.toString();\n saveLocal(client, {});\n saveSession(client, { codeVerifier, state, oldUrl });\n window.location.assign(`${authServer\n .authorization_endpoint}?${new URLSearchParams({\n client_id,\n response_type: \"code\",\n state,\n redirect_uri,\n code_challenge: await calculatePKCECodeChallenge(codeVerifier),\n code_challenge_method: \"S256\",\n scope: [\"offline_access\", ...scopes].join(\" \"),\n })}`);\n // Give time for redirect to happen\n await delay(1000);\n throw new Error(\"Unable to redirect\");\n };\n /** Will throw if there is no token! */\n async function _signIn() {\n // 1. Check if we have a refresh token in local storage\n return await maybeRefresh()\n // 2. If there is no refresh token we are likely trying to perform the callback\n ?? await maybeHandleAuthReturn()\n // 3. If we haven't been able to load the token from one of the two above ways, we need to make the initial auth request\n ?? await initiateLoginRedirect();\n }\n return getToken;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -42,7 +42,8 @@ vi.mock("./common.js", async importOriginal => {
|
|
|
42
42
|
makeTokenAndSaveRefresh: hoistedMocks.makeTokenAndSaveRefresh
|
|
43
43
|
};
|
|
44
44
|
}),
|
|
45
|
-
readLocal: vi.spyOn(original, "readLocal")
|
|
45
|
+
readLocal: vi.spyOn(original, "readLocal"),
|
|
46
|
+
readSession: vi.spyOn(original, "readSession")
|
|
46
47
|
// vi.fn(original.readLocal),
|
|
47
48
|
};
|
|
48
49
|
});
|
|
@@ -66,6 +67,11 @@ describe(createPublicOauthClient, () => {
|
|
|
66
67
|
getItem: vi.fn(),
|
|
67
68
|
removeItem: vi.fn()
|
|
68
69
|
};
|
|
70
|
+
const mockSessionStorage = {
|
|
71
|
+
setItem: vi.fn(),
|
|
72
|
+
getItem: vi.fn(),
|
|
73
|
+
removeItem: vi.fn()
|
|
74
|
+
};
|
|
69
75
|
beforeEach(() => {
|
|
70
76
|
vi.restoreAllMocks();
|
|
71
77
|
fetchFn.mockRestore();
|
|
@@ -77,6 +83,7 @@ describe(createPublicOauthClient, () => {
|
|
|
77
83
|
beforeAll(() => {
|
|
78
84
|
vi.stubGlobal("window", mockWindow);
|
|
79
85
|
vi.stubGlobal("localStorage", mockLocalStorage);
|
|
86
|
+
vi.stubGlobal("sessionStorage", mockSessionStorage);
|
|
80
87
|
});
|
|
81
88
|
afterAll(() => {
|
|
82
89
|
vi.unstubAllGlobals();
|
|
@@ -88,6 +95,81 @@ describe(createPublicOauthClient, () => {
|
|
|
88
95
|
fetchFn
|
|
89
96
|
};
|
|
90
97
|
const fullLoginUrl = new URL("/loginPage", DEFAULT_CUR_URL);
|
|
98
|
+
function setupWindowLocation(currentUrl) {
|
|
99
|
+
mockWindow.location.href = new URL(currentUrl).href;
|
|
100
|
+
mockWindow.location.pathname = new URL(currentUrl).pathname;
|
|
101
|
+
}
|
|
102
|
+
function setupLocalState(initialLocalState) {
|
|
103
|
+
vi.mocked(commonJs.readLocal).mockImplementation(() => initialLocalState);
|
|
104
|
+
}
|
|
105
|
+
let client;
|
|
106
|
+
let clientArgs;
|
|
107
|
+
function setupClient(clientArgs_) {
|
|
108
|
+
clientArgs = clientArgs_;
|
|
109
|
+
if (clientArgs.refreshTokenMarker) {
|
|
110
|
+
client = createPublicOauthClient(clientArgs.clientId, clientArgs.foundryUrl, clientArgs.redirectUrl, clientArgs);
|
|
111
|
+
} else {
|
|
112
|
+
client = createPublicOauthClient(clientArgs.clientId, clientArgs.foundryUrl, clientArgs.redirectUrl, clientArgs.useHistory, clientArgs.loginPage, clientArgs.postLoginPage, clientArgs.scopes, clientArgs.fetchFn, clientArgs.ctxPath);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
beforeEach(() => {
|
|
116
|
+
// prevents mistakes like forgetting to initialize the client with an
|
|
117
|
+
// old value around
|
|
118
|
+
client = undefined;
|
|
119
|
+
clientArgs = undefined;
|
|
120
|
+
});
|
|
121
|
+
async function expectRedirectToMultipass(tokenPromise) {
|
|
122
|
+
// we assume window.location.assign will take you away therefore we
|
|
123
|
+
// also have to expect in this scenario that the thrown error happens
|
|
124
|
+
await expect(tokenPromise).rejects.toThrowError(new Error("Unable to redirect"));
|
|
125
|
+
expect(mockWindow.location.assign).toHaveBeenCalledOnce();
|
|
126
|
+
const url = new URL(mockWindow.location.assign.mock.calls[0][0]);
|
|
127
|
+
expect(url.origin).toEqual(clientArgs.foundryUrl);
|
|
128
|
+
expect(url.pathname).toEqual("/multipass/api/oauth2/authorize");
|
|
129
|
+
expect(Object.fromEntries(url.searchParams.entries())).toEqual(expect.objectContaining({
|
|
130
|
+
client_id: clientArgs.clientId,
|
|
131
|
+
code_challenge: expect.any(String),
|
|
132
|
+
redirect_uri: clientArgs.redirectUrl,
|
|
133
|
+
response_type: "code",
|
|
134
|
+
code_challenge_method: "S256",
|
|
135
|
+
scope: "offline_access api:read-data api:write-data",
|
|
136
|
+
state: expect.any(String)
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
describe("refresh token marker", () => {
|
|
140
|
+
beforeEach(() => {
|
|
141
|
+
setupWindowLocation("https://foundry.local");
|
|
142
|
+
});
|
|
143
|
+
it("should not allow refresh if the refresh markers do not match", async () => {
|
|
144
|
+
setupLocalState({
|
|
145
|
+
refresh_token: "refreshToken",
|
|
146
|
+
refreshTokenMarker: "not-the-right-marker"
|
|
147
|
+
});
|
|
148
|
+
setupClient({
|
|
149
|
+
...BASE_CLIENT_ARGS,
|
|
150
|
+
refreshTokenMarker: "marker"
|
|
151
|
+
});
|
|
152
|
+
await expectRedirectToMultipass(client());
|
|
153
|
+
});
|
|
154
|
+
it("should try to refresh if refresh tokens do match", async () => {
|
|
155
|
+
setupLocalState({
|
|
156
|
+
refresh_token: "refreshToken",
|
|
157
|
+
refreshTokenMarker: "marker"
|
|
158
|
+
});
|
|
159
|
+
setupClient({
|
|
160
|
+
...BASE_CLIENT_ARGS,
|
|
161
|
+
refreshTokenMarker: "marker"
|
|
162
|
+
});
|
|
163
|
+
hoistedMocks.makeTokenAndSaveRefresh.mockImplementationOnce(() => ({
|
|
164
|
+
access_token: "some token",
|
|
165
|
+
expires_at: Date.now(),
|
|
166
|
+
expires_in: 10000
|
|
167
|
+
}));
|
|
168
|
+
const tokenPromise = client();
|
|
169
|
+
await expect(tokenPromise).resolves.toEqual("some token");
|
|
170
|
+
expect(hoistedMocks.makeTokenAndSaveRefresh).toBeCalledTimes(1);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
91
173
|
describe.each([{
|
|
92
174
|
name: "Basic Usage",
|
|
93
175
|
currentUrl: DEFAULT_CUR_URL,
|
|
@@ -142,35 +224,43 @@ describe(createPublicOauthClient, () => {
|
|
|
142
224
|
currentUrl,
|
|
143
225
|
should
|
|
144
226
|
}) => {
|
|
145
|
-
let client;
|
|
146
227
|
beforeEach(() => {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
mockWindow.location.pathname = new URL(currentUrl).pathname;
|
|
228
|
+
setupClient(clientArgs);
|
|
229
|
+
setupWindowLocation(currentUrl.toString());
|
|
150
230
|
});
|
|
151
231
|
it("calls common with expected values", () => {
|
|
152
232
|
expect(vi.mocked(commonJs.common)).toHaveBeenCalledWith(expect.objectContaining({
|
|
153
233
|
client_id: clientArgs.clientId,
|
|
154
234
|
token_endpoint_auth_method: "none"
|
|
155
|
-
}), commonJs.createAuthorizationServer(clientArgs.ctxPath ?? "/multipass", clientArgs.foundryUrl), expect.any(Function), expect.anything(), expect.any(Function));
|
|
235
|
+
}), commonJs.createAuthorizationServer(clientArgs.ctxPath ?? "/multipass", clientArgs.foundryUrl), expect.any(Function), expect.anything(), expect.any(Function), undefined);
|
|
156
236
|
});
|
|
157
237
|
describe.each([{
|
|
158
|
-
|
|
238
|
+
localStorage: {
|
|
239
|
+
refresh_token: "a-refresh-token"
|
|
240
|
+
},
|
|
241
|
+
sessionStorage: {}
|
|
242
|
+
}, {
|
|
243
|
+
localStorage: {},
|
|
244
|
+
sessionStorage: {
|
|
245
|
+
codeVerifier: "hi",
|
|
246
|
+
state: "mom",
|
|
247
|
+
oldUrl: "https://someoldurl.local"
|
|
248
|
+
}
|
|
159
249
|
}, {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}, {}])("Initial Local State: %s", initialLocalState => {
|
|
250
|
+
localStorage: {},
|
|
251
|
+
sessionStorage: {}
|
|
252
|
+
}])("Initial Local State: %s", initialState => {
|
|
164
253
|
const ACCESS_TOKEN = (Math.random() + 1).toString(36).substring(7);
|
|
165
254
|
beforeEach(() => {
|
|
166
|
-
vi.mocked(commonJs.readLocal).mockImplementation(() =>
|
|
255
|
+
vi.mocked(commonJs.readLocal).mockImplementation(() => initialState.localStorage);
|
|
256
|
+
vi.mocked(commonJs.readSession).mockImplementation(() => initialState.sessionStorage);
|
|
167
257
|
hoistedMocks.makeTokenAndSaveRefresh.mockImplementation(() => ({
|
|
168
258
|
access_token: ACCESS_TOKEN,
|
|
169
259
|
expires_at: Date.now(),
|
|
170
260
|
expires_in: 10000
|
|
171
261
|
}));
|
|
172
262
|
});
|
|
173
|
-
if (Object.keys(
|
|
263
|
+
if (Object.keys(initialState.localStorage).length === 0 && Object.keys(initialState.sessionStorage).length === 0) {
|
|
174
264
|
if (should.redirectToLoginPage) {
|
|
175
265
|
it("redirects to login page", async () => {
|
|
176
266
|
const tokenPromise = client();
|
|
@@ -178,7 +268,7 @@ describe(createPublicOauthClient, () => {
|
|
|
178
268
|
if (should.redirectToLoginPage) {
|
|
179
269
|
// expect save local
|
|
180
270
|
await expect(tokenPromise).resolves.toBeUndefined();
|
|
181
|
-
expect(
|
|
271
|
+
expect(mockSessionStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({
|
|
182
272
|
oldUrl: window.location.toString()
|
|
183
273
|
}));
|
|
184
274
|
expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, "", clientArgs.loginPage);
|
|
@@ -191,32 +281,17 @@ describe(createPublicOauthClient, () => {
|
|
|
191
281
|
if (should.redirectToLoginPage) {
|
|
192
282
|
// expect save local
|
|
193
283
|
await expect(tokenPromise).resolves.toBeUndefined();
|
|
194
|
-
expect(
|
|
284
|
+
expect(mockSessionStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({
|
|
195
285
|
oldUrl: window.location.toString()
|
|
196
286
|
}));
|
|
197
287
|
expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, "", clientArgs.loginPage);
|
|
198
288
|
return;
|
|
199
289
|
}
|
|
200
|
-
|
|
201
|
-
// also have to expect in this scenario that the thrown error happens
|
|
202
|
-
await expect(tokenPromise).rejects.toThrowError(new Error("Unable to redirect"));
|
|
203
|
-
expect(mockWindow.location.assign).toHaveBeenCalledOnce();
|
|
204
|
-
const url = new URL(mockWindow.location.assign.mock.calls[0][0]);
|
|
205
|
-
expect(url.origin).toEqual(clientArgs.foundryUrl);
|
|
206
|
-
expect(url.pathname).toEqual("/multipass/api/oauth2/authorize");
|
|
207
|
-
expect(Object.fromEntries(url.searchParams.entries())).toEqual(expect.objectContaining({
|
|
208
|
-
client_id: clientArgs.clientId,
|
|
209
|
-
code_challenge: expect.any(String),
|
|
210
|
-
redirect_uri: clientArgs.redirectUrl,
|
|
211
|
-
response_type: "code",
|
|
212
|
-
code_challenge_method: "S256",
|
|
213
|
-
scope: "offline_access api:read-data api:write-data",
|
|
214
|
-
state: expect.any(String)
|
|
215
|
-
}));
|
|
290
|
+
await expectRedirectToMultipass(tokenPromise);
|
|
216
291
|
});
|
|
217
292
|
}
|
|
218
293
|
}
|
|
219
|
-
if (
|
|
294
|
+
if (initialState.sessionStorage.codeVerifier) {
|
|
220
295
|
it("tries to auth with return results", async () => {
|
|
221
296
|
await expect(client()).resolves.toEqual(ACCESS_TOKEN);
|
|
222
297
|
expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(1);
|
|
@@ -224,10 +299,10 @@ describe(createPublicOauthClient, () => {
|
|
|
224
299
|
// this is only because we didn't mock out the internals
|
|
225
300
|
"signIn");
|
|
226
301
|
expect(mockWindow.history.replaceState).toHaveBeenCalledTimes(1);
|
|
227
|
-
expect(mockWindow.history.replaceState).toBeCalledWith(expect.anything(), expect.anything(),
|
|
302
|
+
expect(mockWindow.history.replaceState).toBeCalledWith(expect.anything(), expect.anything(), initialState.sessionStorage.oldUrl);
|
|
228
303
|
});
|
|
229
304
|
}
|
|
230
|
-
if (
|
|
305
|
+
if (initialState.localStorage.refresh_token) {
|
|
231
306
|
it("refreshes", async () => {
|
|
232
307
|
await expect(client()).resolves.toEqual(ACCESS_TOKEN);
|
|
233
308
|
expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publicOauth.test.js","names":["afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","commonJs","createPublicOauthClient","hoistedMocks","hoisted","makeTokenAndSaveRefresh","fn","mock","importOriginal","original","default","ms","opts","common","args","result","readLocal","spyOn","DEFAULT_CUR_URL","URL","fetchFn","mockWindow","location","toString","assign","href","pathname","history","replaceState","mockLocalStorage","setItem","getItem","removeItem","restoreAllMocks","mockRestore","clearAllMocks","mockReset","stubGlobal","unstubAllGlobals","BASE_CLIENT_ARGS","clientId","foundryUrl","redirectUrl","fullLoginUrl","each","name","currentUrl","clientArgs","should","redirectToLoginPage","loginPage","client","useHistory","postLoginPage","scopes","ctxPath","mocked","toHaveBeenCalledWith","objectContaining","client_id","token_endpoint_auth_method","createAuthorizationServer","any","Function","anything","refresh_token","codeVerifier","state","oldUrl","initialLocalState","ACCESS_TOKEN","Math","random","substring","mockImplementation","access_token","expires_at","Date","now","expires_in","Object","keys","length","tokenPromise","toBeCalledTimes","resolves","toBeUndefined","toBeCalledWith","JSON","stringify","window","rejects","toThrowError","Error","toHaveBeenCalledOnce","url","calls","origin","toEqual","fromEntries","searchParams","entries","code_challenge","String","redirect_uri","response_type","code_challenge_method","scope","toHaveBeenCalledTimes","undefined"],"sources":["publicOauth.test.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable @typescript-eslint/consistent-type-imports */\nimport { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi, } from \"vitest\";\nimport * as commonJs from \"./common.js\";\nimport { createPublicOauthClient } from \"./createPublicOauthClient.js\";\nconst hoistedMocks = vi.hoisted(() => {\n return {\n makeTokenAndSaveRefresh: vi.fn(),\n };\n});\nvi.mock(\"delay\", async (importOriginal) => {\n const original = await importOriginal();\n return {\n default: vi.fn((ms, opts) => {\n // speed up the tests\n return original.default(ms / 100, opts);\n }),\n };\n});\nvi.mock(\"./common.js\", async (importOriginal) => {\n const original = await importOriginal();\n return {\n ...original,\n common: vi.fn((...args) => {\n const result = original.common(...args);\n return {\n ...result,\n makeTokenAndSaveRefresh: hoistedMocks.makeTokenAndSaveRefresh,\n };\n }),\n readLocal: vi.spyOn(original, \"readLocal\"),\n // vi.fn(original.readLocal),\n };\n});\nvi.mock(\"oauth4webapi\");\ndescribe(createPublicOauthClient, () => {\n const DEFAULT_CUR_URL = new URL(\"https://fauxurl\");\n const fetchFn = vi.fn();\n const mockWindow = {\n location: {\n toString: vi.fn(() => DEFAULT_CUR_URL),\n assign: vi.fn(),\n href: DEFAULT_CUR_URL.href,\n pathname: DEFAULT_CUR_URL.pathname,\n },\n history: {\n replaceState: vi.fn(),\n },\n };\n const mockLocalStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n beforeEach((context) => {\n vi.restoreAllMocks();\n fetchFn.mockRestore();\n });\n afterEach((context) => {\n vi.clearAllMocks();\n fetchFn.mockReset();\n });\n beforeAll(() => {\n vi.stubGlobal(\"window\", mockWindow);\n vi.stubGlobal(\"localStorage\", mockLocalStorage);\n });\n afterAll(() => {\n vi.unstubAllGlobals();\n });\n const BASE_CLIENT_ARGS = {\n clientId: \"this-would-be-client-id\",\n foundryUrl: \"https://a.foundry.url.local\",\n redirectUrl: \"https://my.redirect.url.local\",\n fetchFn,\n };\n const fullLoginUrl = new URL(\"/loginPage\", DEFAULT_CUR_URL);\n describe.each([\n {\n name: \"Basic Usage\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n {\n name: \"Base w/ full loginPage and curUrl is root\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: fullLoginUrl.toString(),\n },\n should: {\n redirectToLoginPage: true,\n },\n },\n {\n name: \"Base w/ full loginPage and curUrl is login page\",\n currentUrl: fullLoginUrl,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: fullLoginUrl.toString(),\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n {\n name: \"Base w/ short loginPage and curUrl is root\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: \"/loginPage\",\n },\n should: {\n redirectToLoginPage: true,\n },\n },\n {\n name: \"Base w/ short loginPage and curUrl is loginPage\",\n currentUrl: new URL(\"/loginPage\", DEFAULT_CUR_URL),\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: \"/loginPage\",\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n ])(\"$name\", ({ clientArgs, currentUrl, should }) => {\n let client;\n beforeEach(() => {\n client = createPublicOauthClient(clientArgs.clientId, clientArgs.foundryUrl, clientArgs.redirectUrl, clientArgs.useHistory, clientArgs.loginPage, clientArgs.postLoginPage, clientArgs.scopes, clientArgs.fetchFn, clientArgs.ctxPath);\n mockWindow.location.href = new URL(currentUrl).href;\n mockWindow.location.pathname = new URL(currentUrl).pathname;\n });\n it(\"calls common with expected values\", () => {\n expect(vi.mocked(commonJs.common)).toHaveBeenCalledWith(expect.objectContaining({\n client_id: clientArgs.clientId,\n token_endpoint_auth_method: \"none\",\n }), commonJs.createAuthorizationServer(clientArgs.ctxPath ?? \"/multipass\", clientArgs.foundryUrl), expect.any(Function), expect.anything(), expect.any(Function));\n });\n describe.each([\n {\n refresh_token: \"a-refresh-token\",\n },\n {\n codeVerifier: \"hi\",\n state: \"mom\",\n oldUrl: \"https://someoldurl.local\",\n },\n {},\n ])(\"Initial Local State: %s\", (initialLocalState) => {\n const ACCESS_TOKEN = (Math.random() + 1).toString(36).substring(7);\n beforeEach(() => {\n vi.mocked(commonJs.readLocal).mockImplementation(() => initialLocalState);\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementation(() => ({\n access_token: ACCESS_TOKEN,\n expires_at: Date.now(),\n expires_in: 10000,\n }));\n });\n if (Object.keys(initialLocalState).length === 0) {\n if (should.redirectToLoginPage) {\n it(\"redirects to login page\", async () => {\n const tokenPromise = client();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockLocalStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({ oldUrl: window.location.toString() }));\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, \"\", clientArgs.loginPage);\n return;\n }\n });\n }\n else {\n it(\"redirects to multipass\", async () => {\n const tokenPromise = client();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockLocalStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({ oldUrl: window.location.toString() }));\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, \"\", clientArgs.loginPage);\n return;\n }\n // we assume window.location.assign will take you away therefore we\n // also have to expect in this scenario that the thrown error happens\n await expect(tokenPromise)\n .rejects.toThrowError(new Error(\"Unable to redirect\"));\n expect(mockWindow.location.assign).toHaveBeenCalledOnce();\n const url = new URL(mockWindow.location.assign.mock.calls[0][0]);\n expect(url.origin).toEqual(clientArgs.foundryUrl);\n expect(url.pathname).toEqual(\"/multipass/api/oauth2/authorize\");\n expect(Object.fromEntries(url.searchParams.entries())).toEqual(expect.objectContaining({\n client_id: clientArgs.clientId,\n code_challenge: expect.any(String),\n redirect_uri: clientArgs.redirectUrl,\n response_type: \"code\",\n code_challenge_method: \"S256\",\n scope: \"offline_access api:read-data api:write-data\",\n state: expect.any(String),\n }));\n });\n }\n }\n if (initialLocalState.codeVerifier) {\n it(\"tries to auth with return results\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(1);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(undefined, // this is only because we didn't mock out the internals\n \"signIn\");\n expect(mockWindow.history.replaceState).toHaveBeenCalledTimes(1);\n expect(mockWindow.history.replaceState).toBeCalledWith(expect.anything(), expect.anything(), initialLocalState.oldUrl);\n });\n }\n if (initialLocalState.refresh_token) {\n it(\"refreshes\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(1);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(undefined, // this is only because we didn't mock out the internals\n \"refresh\");\n });\n }\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"publicOauth.test.js","names":["afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","commonJs","createPublicOauthClient","hoistedMocks","hoisted","makeTokenAndSaveRefresh","fn","mock","importOriginal","original","default","ms","opts","common","args","result","readLocal","spyOn","readSession","DEFAULT_CUR_URL","URL","fetchFn","mockWindow","location","toString","assign","href","pathname","history","replaceState","mockLocalStorage","setItem","getItem","removeItem","mockSessionStorage","restoreAllMocks","mockRestore","clearAllMocks","mockReset","stubGlobal","unstubAllGlobals","BASE_CLIENT_ARGS","clientId","foundryUrl","redirectUrl","fullLoginUrl","setupWindowLocation","currentUrl","setupLocalState","initialLocalState","mocked","mockImplementation","client","clientArgs","setupClient","clientArgs_","refreshTokenMarker","useHistory","loginPage","postLoginPage","scopes","ctxPath","undefined","expectRedirectToMultipass","tokenPromise","rejects","toThrowError","Error","toHaveBeenCalledOnce","url","calls","origin","toEqual","Object","fromEntries","searchParams","entries","objectContaining","client_id","code_challenge","any","String","redirect_uri","response_type","code_challenge_method","scope","state","refresh_token","mockImplementationOnce","access_token","expires_at","Date","now","expires_in","resolves","toBeCalledTimes","each","name","should","redirectToLoginPage","toHaveBeenCalledWith","token_endpoint_auth_method","createAuthorizationServer","Function","anything","localStorage","sessionStorage","codeVerifier","oldUrl","initialState","ACCESS_TOKEN","Math","random","substring","keys","length","toBeUndefined","toBeCalledWith","JSON","stringify","window","toHaveBeenCalledTimes"],"sources":["publicOauth.test.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable @typescript-eslint/consistent-type-imports */\nimport { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi, } from \"vitest\";\nimport * as commonJs from \"./common.js\";\nimport { createPublicOauthClient } from \"./createPublicOauthClient.js\";\nconst hoistedMocks = vi.hoisted(() => {\n return {\n makeTokenAndSaveRefresh: vi.fn(),\n };\n});\nvi.mock(\"delay\", async (importOriginal) => {\n const original = await importOriginal();\n return {\n default: vi.fn((ms, opts) => {\n // speed up the tests\n return original.default(ms / 100, opts);\n }),\n };\n});\nvi.mock(\"./common.js\", async (importOriginal) => {\n const original = await importOriginal();\n return {\n ...original,\n common: vi.fn((...args) => {\n const result = original.common(...args);\n return {\n ...result,\n makeTokenAndSaveRefresh: hoistedMocks.makeTokenAndSaveRefresh,\n };\n }),\n readLocal: vi.spyOn(original, \"readLocal\"),\n readSession: vi.spyOn(original, \"readSession\"),\n // vi.fn(original.readLocal),\n };\n});\nvi.mock(\"oauth4webapi\");\ndescribe(createPublicOauthClient, () => {\n const DEFAULT_CUR_URL = new URL(\"https://fauxurl\");\n const fetchFn = vi.fn();\n const mockWindow = {\n location: {\n toString: vi.fn(() => DEFAULT_CUR_URL),\n assign: vi.fn(),\n href: DEFAULT_CUR_URL.href,\n pathname: DEFAULT_CUR_URL.pathname,\n },\n history: {\n replaceState: vi.fn(),\n },\n };\n const mockLocalStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n const mockSessionStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n beforeEach((context) => {\n vi.restoreAllMocks();\n fetchFn.mockRestore();\n });\n afterEach((context) => {\n vi.clearAllMocks();\n fetchFn.mockReset();\n });\n beforeAll(() => {\n vi.stubGlobal(\"window\", mockWindow);\n vi.stubGlobal(\"localStorage\", mockLocalStorage);\n vi.stubGlobal(\"sessionStorage\", mockSessionStorage);\n });\n afterAll(() => {\n vi.unstubAllGlobals();\n });\n const BASE_CLIENT_ARGS = {\n clientId: \"this-would-be-client-id\",\n foundryUrl: \"https://a.foundry.url.local\",\n redirectUrl: \"https://my.redirect.url.local\",\n fetchFn,\n };\n const fullLoginUrl = new URL(\"/loginPage\", DEFAULT_CUR_URL);\n function setupWindowLocation(currentUrl) {\n mockWindow.location.href = new URL(currentUrl).href;\n mockWindow.location.pathname = new URL(currentUrl).pathname;\n }\n function setupLocalState(initialLocalState) {\n vi.mocked(commonJs.readLocal).mockImplementation(() => initialLocalState);\n }\n let client;\n let clientArgs;\n function setupClient(clientArgs_) {\n clientArgs = clientArgs_;\n if (clientArgs.refreshTokenMarker) {\n client = createPublicOauthClient(clientArgs.clientId, clientArgs.foundryUrl, clientArgs.redirectUrl, clientArgs);\n }\n else {\n client = createPublicOauthClient(clientArgs.clientId, clientArgs.foundryUrl, clientArgs.redirectUrl, clientArgs.useHistory, clientArgs.loginPage, clientArgs.postLoginPage, clientArgs.scopes, clientArgs.fetchFn, clientArgs.ctxPath);\n }\n }\n beforeEach((context) => {\n // prevents mistakes like forgetting to initialize the client with an\n // old value around\n client = undefined;\n clientArgs = undefined;\n });\n async function expectRedirectToMultipass(tokenPromise) {\n // we assume window.location.assign will take you away therefore we\n // also have to expect in this scenario that the thrown error happens\n await expect(tokenPromise)\n .rejects.toThrowError(new Error(\"Unable to redirect\"));\n expect(mockWindow.location.assign).toHaveBeenCalledOnce();\n const url = new URL(mockWindow.location.assign.mock.calls[0][0]);\n expect(url.origin).toEqual(clientArgs.foundryUrl);\n expect(url.pathname).toEqual(\"/multipass/api/oauth2/authorize\");\n expect(Object.fromEntries(url.searchParams.entries())).toEqual(expect.objectContaining({\n client_id: clientArgs.clientId,\n code_challenge: expect.any(String),\n redirect_uri: clientArgs.redirectUrl,\n response_type: \"code\",\n code_challenge_method: \"S256\",\n scope: \"offline_access api:read-data api:write-data\",\n state: expect.any(String),\n }));\n }\n describe(\"refresh token marker\", () => {\n beforeEach(() => {\n setupWindowLocation(\"https://foundry.local\");\n });\n it(\"should not allow refresh if the refresh markers do not match\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n refreshTokenMarker: \"not-the-right-marker\",\n });\n setupClient({\n ...BASE_CLIENT_ARGS,\n refreshTokenMarker: \"marker\",\n });\n await expectRedirectToMultipass(client());\n });\n it(\"should try to refresh if refresh tokens do match\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n refreshTokenMarker: \"marker\",\n });\n setupClient({\n ...BASE_CLIENT_ARGS,\n refreshTokenMarker: \"marker\",\n });\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementationOnce(() => ({\n access_token: \"some token\",\n expires_at: Date.now(),\n expires_in: 10000,\n }));\n const tokenPromise = client();\n await expect(tokenPromise).resolves.toEqual(\"some token\");\n expect(hoistedMocks.makeTokenAndSaveRefresh).toBeCalledTimes(1);\n });\n });\n describe.each([\n {\n name: \"Basic Usage\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n {\n name: \"Base w/ full loginPage and curUrl is root\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: fullLoginUrl.toString(),\n },\n should: {\n redirectToLoginPage: true,\n },\n },\n {\n name: \"Base w/ full loginPage and curUrl is login page\",\n currentUrl: fullLoginUrl,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: fullLoginUrl.toString(),\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n {\n name: \"Base w/ short loginPage and curUrl is root\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: \"/loginPage\",\n },\n should: {\n redirectToLoginPage: true,\n },\n },\n {\n name: \"Base w/ short loginPage and curUrl is loginPage\",\n currentUrl: new URL(\"/loginPage\", DEFAULT_CUR_URL),\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: \"/loginPage\",\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n ])(\"$name\", ({ clientArgs, currentUrl, should }) => {\n beforeEach(() => {\n setupClient(clientArgs);\n setupWindowLocation(currentUrl.toString());\n });\n it(\"calls common with expected values\", () => {\n expect(vi.mocked(commonJs.common)).toHaveBeenCalledWith(expect.objectContaining({\n client_id: clientArgs.clientId,\n token_endpoint_auth_method: \"none\",\n }), commonJs.createAuthorizationServer(clientArgs.ctxPath ?? \"/multipass\", clientArgs.foundryUrl), expect.any(Function), expect.anything(), expect.any(Function), undefined);\n });\n describe.each([\n {\n localStorage: {\n refresh_token: \"a-refresh-token\",\n },\n sessionStorage: {},\n },\n {\n localStorage: {},\n sessionStorage: {\n codeVerifier: \"hi\",\n state: \"mom\",\n oldUrl: \"https://someoldurl.local\",\n },\n },\n { localStorage: {}, sessionStorage: {} },\n ])(\"Initial Local State: %s\", (initialState) => {\n const ACCESS_TOKEN = (Math.random() + 1).toString(36).substring(7);\n beforeEach(() => {\n vi.mocked(commonJs.readLocal).mockImplementation(() => initialState.localStorage);\n vi.mocked(commonJs.readSession).mockImplementation(() => initialState.sessionStorage);\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementation(() => ({\n access_token: ACCESS_TOKEN,\n expires_at: Date.now(),\n expires_in: 10000,\n }));\n });\n if (Object.keys(initialState.localStorage).length === 0\n && Object.keys(initialState.sessionStorage).length === 0) {\n if (should.redirectToLoginPage) {\n it(\"redirects to login page\", async () => {\n const tokenPromise = client();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockSessionStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({ oldUrl: window.location.toString() }));\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, \"\", clientArgs.loginPage);\n return;\n }\n });\n }\n else {\n it(\"redirects to multipass\", async () => {\n const tokenPromise = client();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockSessionStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({ oldUrl: window.location.toString() }));\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, \"\", clientArgs.loginPage);\n return;\n }\n await expectRedirectToMultipass(tokenPromise);\n });\n }\n }\n if (initialState.sessionStorage.codeVerifier) {\n it(\"tries to auth with return results\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(1);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(undefined, // this is only because we didn't mock out the internals\n \"signIn\");\n expect(mockWindow.history.replaceState).toHaveBeenCalledTimes(1);\n expect(mockWindow.history.replaceState).toBeCalledWith(expect.anything(), expect.anything(), initialState.sessionStorage.oldUrl);\n });\n }\n if (initialState.localStorage.refresh_token) {\n it(\"refreshes\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(1);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(undefined, // this is only because we didn't mock out the internals\n \"refresh\");\n });\n }\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
package/build/esm/utils.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { PublicOauthClientOptions } from "./createPublicOauthClient.js";
|
|
2
|
-
|
|
2
|
+
interface ProcessedPublicOauthClientOptions extends Omit<Required<PublicOauthClientOptions>, "loginPage" | "refreshTokenMarker"> {
|
|
3
3
|
loginPage?: string;
|
|
4
|
-
|
|
4
|
+
refreshTokenMarker?: string;
|
|
5
|
+
}
|
|
5
6
|
export declare function processOptionsAndAssignDefaults(url: string, redirect_uri: string, useHistory?: boolean | PublicOauthClientOptions, loginPage?: string, postLoginPage?: string, scopes?: string[], fetchFn?: typeof globalThis.fetch, ctxPath?: string): ProcessedPublicOauthClientOptions;
|
|
7
|
+
export {};
|
|
6
8
|
//# sourceMappingURL=utils.d.ts.map
|
package/build/esm/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAE7E,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAE7E,UAAU,iCACR,SACE,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,WAAW,GAAG,oBAAoB,CAAC;IAE9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,OAAO,GAAG,wBAAwB,EAC/C,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,EACjC,OAAO,CAAC,EAAE,MAAM,GACf,iCAAiC,CAiCnC"}
|
package/build/esm/utils.js
CHANGED
|
@@ -38,7 +38,8 @@ export function processOptionsAndAssignDefaults(url, redirect_uri, useHistory, l
|
|
|
38
38
|
postLoginPage: options.postLoginPage || window.location.toString(),
|
|
39
39
|
scopes: options.scopes ?? ["api:read-data", "api:write-data"],
|
|
40
40
|
fetchFn: options.fetchFn ?? globalThis.fetch,
|
|
41
|
-
ctxPath: options.ctxPath ?? "multipass"
|
|
41
|
+
ctxPath: options.ctxPath ?? "multipass",
|
|
42
|
+
refreshTokenMarker: options.refreshTokenMarker
|
|
42
43
|
};
|
|
43
44
|
}
|
|
44
45
|
//# sourceMappingURL=utils.js.map
|