@osdk/oauth 1.8.0-beta.1 → 1.8.0-beta.3
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 +12 -0
- package/build/browser/common.js +33 -13
- package/build/browser/common.js.map +1 -1
- package/build/browser/common.test.js +6 -4
- package/build/browser/common.test.js.map +1 -1
- package/build/browser/createConfidentialOauthClient.js +1 -1
- package/build/browser/createConfidentialOauthClient.js.map +1 -1
- package/build/browser/createPublicOauthClient.js +20 -10
- package/build/browser/createPublicOauthClient.js.map +1 -1
- package/build/browser/delay.js +20 -0
- package/build/browser/delay.js.map +1 -0
- package/build/browser/index.js.map +1 -1
- package/build/browser/publicOauth.test.js +94 -10
- package/build/browser/publicOauth.test.js.map +1 -1
- package/build/browser/utils.js +2 -1
- package/build/browser/utils.js.map +1 -1
- package/build/cjs/index.cjs +39 -77
- package/build/cjs/index.cjs.map +1 -1
- package/build/cjs/index.d.cts +25 -1
- package/build/esm/common.js +32 -13
- package/build/esm/common.js.map +1 -1
- package/build/esm/common.test.js +6 -4
- package/build/esm/common.test.js.map +1 -1
- package/build/esm/createConfidentialOauthClient.js +1 -1
- package/build/esm/createConfidentialOauthClient.js.map +1 -1
- package/build/esm/createPublicOauthClient.js +20 -10
- package/build/esm/createPublicOauthClient.js.map +1 -1
- package/build/esm/delay.js +20 -0
- package/build/esm/delay.js.map +1 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/publicOauth.test.js +94 -10
- package/build/esm/publicOauth.test.js.map +1 -1
- package/build/esm/utils.js +2 -1
- package/build/esm/utils.js.map +1 -1
- package/build/types/common.d.ts +19 -4
- package/build/types/common.d.ts.map +1 -1
- package/build/types/createPublicOauthClient.d.ts +16 -0
- package/build/types/createPublicOauthClient.d.ts.map +1 -1
- package/build/types/delay.d.ts +1 -0
- package/build/types/delay.d.ts.map +1 -0
- package/build/types/index.d.ts +2 -1
- package/build/types/index.d.ts.map +1 -1
- package/build/types/utils.d.ts +3 -1
- package/build/types/utils.d.ts.map +1 -1
- package/package.json +3 -4
|
@@ -23,15 +23,9 @@ const hoistedMocks = vi.hoisted(() => {
|
|
|
23
23
|
makeTokenAndSaveRefresh: vi.fn()
|
|
24
24
|
};
|
|
25
25
|
});
|
|
26
|
-
vi.mock("delay",
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
default: vi.fn((ms, opts) => {
|
|
30
|
-
// speed up the tests
|
|
31
|
-
return original.default(ms / 100, opts);
|
|
32
|
-
})
|
|
33
|
-
};
|
|
34
|
-
});
|
|
26
|
+
vi.mock("./delay.js", () => ({
|
|
27
|
+
delay: vi.fn(ms => new Promise(resolve => setTimeout(resolve, ms / 100)))
|
|
28
|
+
}));
|
|
35
29
|
vi.mock("./common.js", async importOriginal => {
|
|
36
30
|
const original = await importOriginal();
|
|
37
31
|
return {
|
|
@@ -260,7 +254,7 @@ describe(createPublicOauthClient, () => {
|
|
|
260
254
|
expect(vi.mocked(commonJs.common)).toHaveBeenCalledWith(expect.objectContaining({
|
|
261
255
|
client_id: clientArgs.clientId,
|
|
262
256
|
token_endpoint_auth_method: "none"
|
|
263
|
-
}), commonJs.createAuthorizationServer(clientArgs.ctxPath ?? "/multipass", clientArgs.foundryUrl), expect.any(Function), expect.anything(), expect.any(Function), undefined, (clientArgs.scopes ?? ["api:read-data", "api:write-data", "api:use-ontologies-read", "api:use-ontologies-write"]).sort().join(" "));
|
|
257
|
+
}), commonJs.createAuthorizationServer(clientArgs.ctxPath ?? "/multipass", clientArgs.foundryUrl), expect.any(Function), expect.anything(), expect.any(Function), undefined, (clientArgs.scopes ?? ["api:read-data", "api:write-data", "api:use-ontologies-read", "api:use-ontologies-write"]).sort().join(" "), undefined);
|
|
264
258
|
});
|
|
265
259
|
describe.each([{
|
|
266
260
|
localStorage: {
|
|
@@ -342,5 +336,95 @@ describe(createPublicOauthClient, () => {
|
|
|
342
336
|
}
|
|
343
337
|
});
|
|
344
338
|
});
|
|
339
|
+
describe("tokenStorage option", () => {
|
|
340
|
+
beforeEach(() => {
|
|
341
|
+
setupWindowLocation("https://foundry.local");
|
|
342
|
+
setupLocalState({});
|
|
343
|
+
vi.mocked(commonJs.readSession).mockImplementation(() => ({}));
|
|
344
|
+
// getStorage() checks process.env.TARGET to determine if we're in a browser
|
|
345
|
+
vi.stubGlobal("process", {
|
|
346
|
+
env: {
|
|
347
|
+
TARGET: "browser"
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
afterEach(() => {
|
|
352
|
+
vi.unstubAllGlobals();
|
|
353
|
+
// Re-stub the globals that the outer describe needs
|
|
354
|
+
vi.stubGlobal("window", mockWindow);
|
|
355
|
+
vi.stubGlobal("localStorage", mockLocalStorage);
|
|
356
|
+
vi.stubGlobal("sessionStorage", mockSessionStorage);
|
|
357
|
+
});
|
|
358
|
+
it("should pass localStorage to common when tokenStorage is 'localStorage'", () => {
|
|
359
|
+
createPublicOauthClient(BASE_CLIENT_ARGS.clientId, BASE_CLIENT_ARGS.foundryUrl, BASE_CLIENT_ARGS.redirectUrl, {
|
|
360
|
+
tokenStorage: "localStorage"
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
// common() is called with 8 args, the last one being the storage
|
|
364
|
+
const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];
|
|
365
|
+
expect(lastArg).toBe(mockLocalStorage);
|
|
366
|
+
});
|
|
367
|
+
it("should pass sessionStorage to common when tokenStorage is 'sessionStorage'", () => {
|
|
368
|
+
createPublicOauthClient(BASE_CLIENT_ARGS.clientId, BASE_CLIENT_ARGS.foundryUrl, BASE_CLIENT_ARGS.redirectUrl, {
|
|
369
|
+
tokenStorage: "sessionStorage"
|
|
370
|
+
});
|
|
371
|
+
const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];
|
|
372
|
+
expect(lastArg).toBe(mockSessionStorage);
|
|
373
|
+
});
|
|
374
|
+
it("should pass undefined to common when tokenStorage is 'none'", () => {
|
|
375
|
+
createPublicOauthClient(BASE_CLIENT_ARGS.clientId, BASE_CLIENT_ARGS.foundryUrl, BASE_CLIENT_ARGS.redirectUrl, {
|
|
376
|
+
tokenStorage: "none"
|
|
377
|
+
});
|
|
378
|
+
const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];
|
|
379
|
+
expect(lastArg).toBeUndefined();
|
|
380
|
+
});
|
|
381
|
+
it("should not include offline_access scope when tokenStorage is 'none'", async () => {
|
|
382
|
+
const client = createPublicOauthClient(BASE_CLIENT_ARGS.clientId, BASE_CLIENT_ARGS.foundryUrl, BASE_CLIENT_ARGS.redirectUrl, {
|
|
383
|
+
tokenStorage: "none"
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
// Trigger the auth flow - this should redirect to multipass
|
|
387
|
+
await expect(client()).rejects.toThrowError("Unable to redirect");
|
|
388
|
+
expect(mockWindow.location.assign).toHaveBeenCalledOnce();
|
|
389
|
+
const url = new URL(mockWindow.location.assign.mock.calls[0][0]);
|
|
390
|
+
const scope = url.searchParams.get("scope");
|
|
391
|
+
|
|
392
|
+
// Should NOT include offline_access
|
|
393
|
+
expect(scope).not.toContain("offline_access");
|
|
394
|
+
// Should still include the regular scopes
|
|
395
|
+
expect(scope).toContain("api:read-data");
|
|
396
|
+
});
|
|
397
|
+
it("should pass localStorage to common when tokenStorage is not provided", () => {
|
|
398
|
+
createPublicOauthClient(BASE_CLIENT_ARGS.clientId, BASE_CLIENT_ARGS.foundryUrl, BASE_CLIENT_ARGS.redirectUrl);
|
|
399
|
+
const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];
|
|
400
|
+
expect(lastArg).toBe(mockLocalStorage);
|
|
401
|
+
});
|
|
402
|
+
it("should include offline_access scope when tokenStorage is 'localStorage'", async () => {
|
|
403
|
+
const client = createPublicOauthClient(BASE_CLIENT_ARGS.clientId, BASE_CLIENT_ARGS.foundryUrl, BASE_CLIENT_ARGS.redirectUrl, {
|
|
404
|
+
tokenStorage: "localStorage"
|
|
405
|
+
});
|
|
406
|
+
await expect(client()).rejects.toThrowError("Unable to redirect");
|
|
407
|
+
const url = new URL(mockWindow.location.assign.mock.calls[0][0]);
|
|
408
|
+
const scope = url.searchParams.get("scope");
|
|
409
|
+
expect(scope).toContain("offline_access");
|
|
410
|
+
});
|
|
411
|
+
it("should include offline_access scope when tokenStorage is 'sessionStorage'", async () => {
|
|
412
|
+
const client = createPublicOauthClient(BASE_CLIENT_ARGS.clientId, BASE_CLIENT_ARGS.foundryUrl, BASE_CLIENT_ARGS.redirectUrl, {
|
|
413
|
+
tokenStorage: "sessionStorage"
|
|
414
|
+
});
|
|
415
|
+
await expect(client()).rejects.toThrowError("Unable to redirect");
|
|
416
|
+
const url = new URL(mockWindow.location.assign.mock.calls[0][0]);
|
|
417
|
+
const scope = url.searchParams.get("scope");
|
|
418
|
+
expect(scope).toContain("offline_access");
|
|
419
|
+
});
|
|
420
|
+
it("should not attempt to read from storage when tokenStorage is 'none'", async () => {
|
|
421
|
+
vi.mocked(commonJs.readLocal).mockClear();
|
|
422
|
+
const client = createPublicOauthClient(BASE_CLIENT_ARGS.clientId, BASE_CLIENT_ARGS.foundryUrl, BASE_CLIENT_ARGS.redirectUrl, {
|
|
423
|
+
tokenStorage: "none"
|
|
424
|
+
});
|
|
425
|
+
await expect(client()).rejects.toThrowError("Unable to redirect");
|
|
426
|
+
expect(vi.mocked(commonJs.readLocal)).not.toHaveBeenCalled();
|
|
427
|
+
});
|
|
428
|
+
});
|
|
345
429
|
});
|
|
346
430
|
//# sourceMappingURL=publicOauth.test.js.map
|
|
@@ -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","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","sort","join","state","refresh_token","requestedScopes","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.ts"],"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\n/* eslint-disable @typescript-eslint/consistent-type-imports */\nimport {\n afterAll,\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n} from \"vitest\";\n\nimport * as commonJs from \"./common.js\";\nimport { LocalStorageState, SessionStorageState } from \"./common.js\";\nimport { createPublicOauthClient } from \"./createPublicOauthClient.js\";\nimport { PublicOauthClient } from \"./PublicOauthClient.js\";\n\nconst hoistedMocks = vi.hoisted(() => {\n return {\n makeTokenAndSaveRefresh: vi.fn(),\n };\n});\n\nvi.mock(\"delay\", async (importOriginal) => {\n const original = await importOriginal<typeof import(\"delay\")>();\n return {\n default: vi.fn<typeof original.default>((ms, opts) => {\n // speed up the tests\n return original.default(ms / 100, opts);\n }),\n };\n});\n\nvi.mock(\"./common.js\", async (importOriginal) => {\n const original = await importOriginal<typeof import(\"./common.js\")>();\n return {\n ...original,\n common: vi.fn<typeof commonJs.common>((...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});\n\nvi.mock(\"oauth4webapi\");\n\ninterface BaseClientArgs {\n clientId: string;\n foundryUrl: string;\n redirectUrl: string;\n fetchFn?: typeof globalThis.fetch;\n}\n\ninterface ClientArgs extends BaseClientArgs {\n useHistory?: boolean;\n loginPage?: string;\n postLoginPage?: string;\n scopes?: string[];\n ctxPath?: string;\n refreshTokenMarker?: string;\n}\n\ndescribe(createPublicOauthClient, () => {\n const DEFAULT_CUR_URL = new URL(\"https://fauxurl\");\n const fetchFn = vi.fn<typeof fetch>();\n\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<typeof window.history.replaceState>(),\n },\n };\n\n const mockLocalStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n\n const mockSessionStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n\n beforeEach((context) => {\n vi.restoreAllMocks();\n fetchFn.mockRestore();\n });\n\n afterEach((context) => {\n vi.clearAllMocks();\n fetchFn.mockReset();\n });\n\n beforeAll(() => {\n vi.stubGlobal(\"window\", mockWindow);\n vi.stubGlobal(\"localStorage\", mockLocalStorage);\n vi.stubGlobal(\"sessionStorage\", mockSessionStorage);\n });\n\n afterAll(() => {\n vi.unstubAllGlobals();\n });\n\n const BASE_CLIENT_ARGS: BaseClientArgs = {\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\n const fullLoginUrl = new URL(\"/loginPage\", DEFAULT_CUR_URL);\n\n function setupWindowLocation(currentUrl: string) {\n mockWindow.location.href = new URL(currentUrl).href;\n mockWindow.location.pathname = new URL(currentUrl).pathname;\n }\n\n function setupLocalState(initialLocalState: LocalStorageState) {\n vi.mocked(commonJs.readLocal).mockImplementation(() => initialLocalState);\n }\n\n let client: PublicOauthClient;\n let clientArgs: ClientArgs;\n function setupClient(clientArgs_: ClientArgs) {\n clientArgs = clientArgs_;\n if (clientArgs.refreshTokenMarker) {\n client = createPublicOauthClient(\n clientArgs.clientId,\n clientArgs.foundryUrl,\n clientArgs.redirectUrl,\n clientArgs,\n );\n } else {\n client = createPublicOauthClient(\n clientArgs.clientId,\n clientArgs.foundryUrl,\n clientArgs.redirectUrl,\n clientArgs.useHistory,\n clientArgs.loginPage,\n clientArgs.postLoginPage,\n clientArgs.scopes,\n clientArgs.fetchFn,\n clientArgs.ctxPath,\n );\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\n async function expectRedirectToMultipass(\n tokenPromise: Promise<string>,\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\n expect(mockWindow.location.assign).toHaveBeenCalledOnce();\n\n const url = new URL(\n mockWindow.location.assign.mock.calls[0][0],\n );\n expect(url.origin).toEqual(clientArgs.foundryUrl);\n expect(url.pathname).toEqual(\"/multipass/api/oauth2/authorize\");\n expect(Object.fromEntries(url.searchParams.entries())).toEqual(\n 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: [\n \"offline_access\",\n ...(clientArgs.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ].sort()),\n ].join(\" \"),\n state: expect.any(String),\n }),\n );\n }\n\n describe(\"refresh token marker and scopes\", () => {\n beforeEach(() => {\n setupWindowLocation(\"https://foundry.local\");\n });\n\n // Backwards compatibility from when we didn't store scopes\n it(\"should not allow refresh if scopes in local storage is undefined\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n // Testing with default scopes\n });\n\n await expectRedirectToMultipass(\n client(),\n );\n });\n\n it(\"should not allow refresh if requested scopes are different\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n requestedScopes: \"api:read-data\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n scopes: [\"api:write-data\"],\n });\n\n await expectRedirectToMultipass(\n client(),\n );\n });\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 requestedScopes: \"api:read-data\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n refreshTokenMarker: \"marker\",\n scopes: [\"api:read-data\"],\n });\n\n await expectRedirectToMultipass(\n client(),\n );\n });\n\n it(\"should try to refresh if refresh markers match and requested scopes are equal\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n refreshTokenMarker: \"marker\",\n requestedScopes: \"api:admin-read api:datasets-read\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n refreshTokenMarker: \"marker\",\n scopes: [\"api:datasets-read\", \"api:admin-read\"],\n });\n\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementationOnce(\n () => ({\n access_token: \"some token\",\n expires_at: Date.now(),\n expires_in: 10000,\n }),\n );\n\n const tokenPromise = client();\n\n await expect(tokenPromise).resolves.toEqual(\"some token\");\n\n expect(hoistedMocks.makeTokenAndSaveRefresh).toBeCalledTimes(1);\n });\n });\n\n describe.each<{\n name: string;\n currentUrl: URL;\n clientArgs: BaseClientArgs & {\n useHistory?: boolean;\n loginPage?: string;\n postLoginPage?: string;\n scopes?: string[];\n ctxPath?: string;\n };\n should: {\n redirectToLoginPage: boolean;\n };\n }>([\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\n it(\"calls common with expected values\", () => {\n expect(vi.mocked(commonJs.common)).toHaveBeenCalledWith(\n expect.objectContaining({\n client_id: clientArgs.clientId,\n token_endpoint_auth_method: \"none\",\n }),\n commonJs.createAuthorizationServer(\n clientArgs.ctxPath ?? \"/multipass\",\n clientArgs.foundryUrl,\n ),\n expect.any(Function),\n expect.anything(),\n expect.any(Function),\n undefined,\n (clientArgs.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ]).sort().join(\" \"),\n );\n });\n\n describe.each<\n { localStorage: LocalStorageState; sessionStorage: SessionStorageState }\n >([\n {\n localStorage: {\n refresh_token: \"a-refresh-token\",\n requestedScopes: (clientArgs.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ]).sort().join(\" \"),\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\n beforeEach(() => {\n vi.mocked(commonJs.readLocal).mockImplementation(() =>\n initialState.localStorage\n );\n\n vi.mocked(commonJs.readSession).mockImplementation(() =>\n initialState.sessionStorage\n );\n\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementation(\n () => ({\n access_token: ACCESS_TOKEN,\n expires_at: Date.now(),\n expires_in: 10000,\n }),\n );\n });\n\n if (\n Object.keys(initialState.localStorage).length === 0\n && Object.keys(initialState.sessionStorage).length === 0\n ) {\n if (should.redirectToLoginPage) {\n it(\"redirects to login page\", async () => {\n const tokenPromise = client!();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockSessionStorage.setItem).toBeCalledWith(\n `@osdk/oauth : refresh : ${clientArgs.clientId}`,\n JSON.stringify({ oldUrl: window.location.toString() }),\n );\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith(\n {},\n \"\",\n clientArgs.loginPage,\n );\n return;\n }\n });\n } else {\n it(\"redirects to multipass\", async () => {\n const tokenPromise = client!();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockSessionStorage.setItem).toBeCalledWith(\n `@osdk/oauth : refresh : ${clientArgs.clientId}`,\n JSON.stringify({ oldUrl: window.location.toString() }),\n );\n\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith(\n {},\n \"\",\n clientArgs.loginPage,\n );\n return;\n }\n\n await expectRedirectToMultipass(\n tokenPromise,\n );\n });\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(\n 1,\n );\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(\n undefined, // this is only because we didn't mock out the internals\n \"signIn\",\n );\n\n expect(mockWindow.history.replaceState).toHaveBeenCalledTimes(1);\n expect(mockWindow.history.replaceState).toBeCalledWith(\n expect.anything(),\n expect.anything(),\n initialState.sessionStorage.oldUrl,\n );\n });\n }\n\n if (initialState.localStorage.refresh_token) {\n it(\"refreshes\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(\n 1,\n );\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(\n undefined, // this is only because we didn't mock out the internals\n \"refresh\",\n );\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","delay","ms","Promise","resolve","setTimeout","importOriginal","original","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","sort","join","state","refresh_token","requestedScopes","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","env","TARGET","tokenStorage","lastArg","toBe","get","not","toContain","mockClear","toHaveBeenCalled"],"sources":["publicOauth.test.ts"],"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\n/* eslint-disable @typescript-eslint/consistent-type-imports */\nimport {\n afterAll,\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n} from \"vitest\";\n\nimport * as commonJs from \"./common.js\";\nimport { LocalStorageState, SessionStorageState } from \"./common.js\";\nimport { createPublicOauthClient } from \"./createPublicOauthClient.js\";\nimport { PublicOauthClient } from \"./PublicOauthClient.js\";\n\nconst hoistedMocks = vi.hoisted(() => {\n return {\n makeTokenAndSaveRefresh: vi.fn(),\n };\n});\n\nvi.mock(\"./delay.js\", () => ({\n delay: vi.fn((ms: number) =>\n new Promise<void>(resolve => setTimeout(resolve, ms / 100))\n ),\n}));\n\nvi.mock(\"./common.js\", async (importOriginal) => {\n const original = await importOriginal<typeof import(\"./common.js\")>();\n return {\n ...original,\n common: vi.fn<typeof commonJs.common>((...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});\n\nvi.mock(\"oauth4webapi\");\n\ninterface BaseClientArgs {\n clientId: string;\n foundryUrl: string;\n redirectUrl: string;\n fetchFn?: typeof globalThis.fetch;\n}\n\ninterface ClientArgs extends BaseClientArgs {\n useHistory?: boolean;\n loginPage?: string;\n postLoginPage?: string;\n scopes?: string[];\n ctxPath?: string;\n refreshTokenMarker?: string;\n}\n\ndescribe(createPublicOauthClient, () => {\n const DEFAULT_CUR_URL = new URL(\"https://fauxurl\");\n const fetchFn = vi.fn<typeof fetch>();\n\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<typeof window.history.replaceState>(),\n },\n };\n\n const mockLocalStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n\n const mockSessionStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n\n beforeEach((context) => {\n vi.restoreAllMocks();\n fetchFn.mockRestore();\n });\n\n afterEach((context) => {\n vi.clearAllMocks();\n fetchFn.mockReset();\n });\n\n beforeAll(() => {\n vi.stubGlobal(\"window\", mockWindow);\n vi.stubGlobal(\"localStorage\", mockLocalStorage);\n vi.stubGlobal(\"sessionStorage\", mockSessionStorage);\n });\n\n afterAll(() => {\n vi.unstubAllGlobals();\n });\n\n const BASE_CLIENT_ARGS: BaseClientArgs = {\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\n const fullLoginUrl = new URL(\"/loginPage\", DEFAULT_CUR_URL);\n\n function setupWindowLocation(currentUrl: string) {\n mockWindow.location.href = new URL(currentUrl).href;\n mockWindow.location.pathname = new URL(currentUrl).pathname;\n }\n\n function setupLocalState(initialLocalState: LocalStorageState) {\n vi.mocked(commonJs.readLocal).mockImplementation(() => initialLocalState);\n }\n\n let client: PublicOauthClient;\n let clientArgs: ClientArgs;\n function setupClient(clientArgs_: ClientArgs) {\n clientArgs = clientArgs_;\n if (clientArgs.refreshTokenMarker) {\n client = createPublicOauthClient(\n clientArgs.clientId,\n clientArgs.foundryUrl,\n clientArgs.redirectUrl,\n clientArgs,\n );\n } else {\n client = createPublicOauthClient(\n clientArgs.clientId,\n clientArgs.foundryUrl,\n clientArgs.redirectUrl,\n clientArgs.useHistory,\n clientArgs.loginPage,\n clientArgs.postLoginPage,\n clientArgs.scopes,\n clientArgs.fetchFn,\n clientArgs.ctxPath,\n );\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\n async function expectRedirectToMultipass(\n tokenPromise: Promise<string>,\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\n expect(mockWindow.location.assign).toHaveBeenCalledOnce();\n\n const url = new URL(\n mockWindow.location.assign.mock.calls[0][0],\n );\n expect(url.origin).toEqual(clientArgs.foundryUrl);\n expect(url.pathname).toEqual(\"/multipass/api/oauth2/authorize\");\n expect(Object.fromEntries(url.searchParams.entries())).toEqual(\n 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: [\n \"offline_access\",\n ...(clientArgs.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ].sort()),\n ].join(\" \"),\n state: expect.any(String),\n }),\n );\n }\n\n describe(\"refresh token marker and scopes\", () => {\n beforeEach(() => {\n setupWindowLocation(\"https://foundry.local\");\n });\n\n // Backwards compatibility from when we didn't store scopes\n it(\"should not allow refresh if scopes in local storage is undefined\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n // Testing with default scopes\n });\n\n await expectRedirectToMultipass(\n client(),\n );\n });\n\n it(\"should not allow refresh if requested scopes are different\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n requestedScopes: \"api:read-data\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n scopes: [\"api:write-data\"],\n });\n\n await expectRedirectToMultipass(\n client(),\n );\n });\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 requestedScopes: \"api:read-data\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n refreshTokenMarker: \"marker\",\n scopes: [\"api:read-data\"],\n });\n\n await expectRedirectToMultipass(\n client(),\n );\n });\n\n it(\"should try to refresh if refresh markers match and requested scopes are equal\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n refreshTokenMarker: \"marker\",\n requestedScopes: \"api:admin-read api:datasets-read\",\n });\n\n setupClient({\n ...BASE_CLIENT_ARGS,\n refreshTokenMarker: \"marker\",\n scopes: [\"api:datasets-read\", \"api:admin-read\"],\n });\n\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementationOnce(\n () => ({\n access_token: \"some token\",\n expires_at: Date.now(),\n expires_in: 10000,\n }),\n );\n\n const tokenPromise = client();\n\n await expect(tokenPromise).resolves.toEqual(\"some token\");\n\n expect(hoistedMocks.makeTokenAndSaveRefresh).toBeCalledTimes(1);\n });\n });\n\n describe.each<{\n name: string;\n currentUrl: URL;\n clientArgs: BaseClientArgs & {\n useHistory?: boolean;\n loginPage?: string;\n postLoginPage?: string;\n scopes?: string[];\n ctxPath?: string;\n };\n should: {\n redirectToLoginPage: boolean;\n };\n }>([\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\n it(\"calls common with expected values\", () => {\n expect(vi.mocked(commonJs.common)).toHaveBeenCalledWith(\n expect.objectContaining({\n client_id: clientArgs.clientId,\n token_endpoint_auth_method: \"none\",\n }),\n commonJs.createAuthorizationServer(\n clientArgs.ctxPath ?? \"/multipass\",\n clientArgs.foundryUrl,\n ),\n expect.any(Function),\n expect.anything(),\n expect.any(Function),\n undefined,\n (clientArgs.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ]).sort().join(\" \"),\n undefined,\n );\n });\n\n describe.each<\n { localStorage: LocalStorageState; sessionStorage: SessionStorageState }\n >([\n {\n localStorage: {\n refresh_token: \"a-refresh-token\",\n requestedScopes: (clientArgs.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ]).sort().join(\" \"),\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\n beforeEach(() => {\n vi.mocked(commonJs.readLocal).mockImplementation(() =>\n initialState.localStorage\n );\n\n vi.mocked(commonJs.readSession).mockImplementation(() =>\n initialState.sessionStorage\n );\n\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementation(\n () => ({\n access_token: ACCESS_TOKEN,\n expires_at: Date.now(),\n expires_in: 10000,\n }),\n );\n });\n\n if (\n Object.keys(initialState.localStorage).length === 0\n && Object.keys(initialState.sessionStorage).length === 0\n ) {\n if (should.redirectToLoginPage) {\n it(\"redirects to login page\", async () => {\n const tokenPromise = client!();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockSessionStorage.setItem).toBeCalledWith(\n `@osdk/oauth : refresh : ${clientArgs.clientId}`,\n JSON.stringify({ oldUrl: window.location.toString() }),\n );\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith(\n {},\n \"\",\n clientArgs.loginPage,\n );\n return;\n }\n });\n } else {\n it(\"redirects to multipass\", async () => {\n const tokenPromise = client!();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockSessionStorage.setItem).toBeCalledWith(\n `@osdk/oauth : refresh : ${clientArgs.clientId}`,\n JSON.stringify({ oldUrl: window.location.toString() }),\n );\n\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith(\n {},\n \"\",\n clientArgs.loginPage,\n );\n return;\n }\n\n await expectRedirectToMultipass(\n tokenPromise,\n );\n });\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(\n 1,\n );\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(\n undefined, // this is only because we didn't mock out the internals\n \"signIn\",\n );\n\n expect(mockWindow.history.replaceState).toHaveBeenCalledTimes(1);\n expect(mockWindow.history.replaceState).toBeCalledWith(\n expect.anything(),\n expect.anything(),\n initialState.sessionStorage.oldUrl,\n );\n });\n }\n\n if (initialState.localStorage.refresh_token) {\n it(\"refreshes\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(\n 1,\n );\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(\n undefined, // this is only because we didn't mock out the internals\n \"refresh\",\n );\n });\n }\n });\n });\n\n describe(\"tokenStorage option\", () => {\n beforeEach(() => {\n setupWindowLocation(\"https://foundry.local\");\n setupLocalState({});\n vi.mocked(commonJs.readSession).mockImplementation(() => ({}));\n // getStorage() checks process.env.TARGET to determine if we're in a browser\n vi.stubGlobal(\"process\", { env: { TARGET: \"browser\" } });\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n // Re-stub the globals that the outer describe needs\n vi.stubGlobal(\"window\", mockWindow);\n vi.stubGlobal(\"localStorage\", mockLocalStorage);\n vi.stubGlobal(\"sessionStorage\", mockSessionStorage);\n });\n\n it(\"should pass localStorage to common when tokenStorage is 'localStorage'\", () => {\n createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"localStorage\" },\n );\n\n // common() is called with 8 args, the last one being the storage\n const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];\n expect(lastArg).toBe(mockLocalStorage);\n });\n\n it(\"should pass sessionStorage to common when tokenStorage is 'sessionStorage'\", () => {\n createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"sessionStorage\" },\n );\n\n const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];\n expect(lastArg).toBe(mockSessionStorage);\n });\n\n it(\"should pass undefined to common when tokenStorage is 'none'\", () => {\n createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"none\" },\n );\n\n const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];\n expect(lastArg).toBeUndefined();\n });\n\n it(\"should not include offline_access scope when tokenStorage is 'none'\", async () => {\n const client = createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"none\" },\n );\n\n // Trigger the auth flow - this should redirect to multipass\n await expect(client()).rejects.toThrowError(\"Unable to redirect\");\n\n expect(mockWindow.location.assign).toHaveBeenCalledOnce();\n\n const url = new URL(mockWindow.location.assign.mock.calls[0][0]);\n const scope = url.searchParams.get(\"scope\");\n\n // Should NOT include offline_access\n expect(scope).not.toContain(\"offline_access\");\n // Should still include the regular scopes\n expect(scope).toContain(\"api:read-data\");\n });\n\n it(\"should pass localStorage to common when tokenStorage is not provided\", () => {\n createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n );\n const lastArg = vi.mocked(commonJs.common).mock.calls[0][7];\n expect(lastArg).toBe(mockLocalStorage);\n });\n\n it(\"should include offline_access scope when tokenStorage is 'localStorage'\", async () => {\n const client = createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"localStorage\" },\n );\n\n await expect(client()).rejects.toThrowError(\"Unable to redirect\");\n\n const url = new URL(mockWindow.location.assign.mock.calls[0][0]);\n const scope = url.searchParams.get(\"scope\");\n\n expect(scope).toContain(\"offline_access\");\n });\n\n it(\"should include offline_access scope when tokenStorage is 'sessionStorage'\", async () => {\n const client = createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"sessionStorage\" },\n );\n\n await expect(client()).rejects.toThrowError(\"Unable to redirect\");\n\n const url = new URL(mockWindow.location.assign.mock.calls[0][0]);\n const scope = url.searchParams.get(\"scope\");\n\n expect(scope).toContain(\"offline_access\");\n });\n\n it(\"should not attempt to read from storage when tokenStorage is 'none'\", async () => {\n vi.mocked(commonJs.readLocal).mockClear();\n\n const client = createPublicOauthClient(\n BASE_CLIENT_ARGS.clientId,\n BASE_CLIENT_ARGS.foundryUrl,\n BASE_CLIENT_ARGS.redirectUrl,\n { tokenStorage: \"none\" },\n );\n\n await expect(client()).rejects.toThrowError(\"Unable to redirect\");\n\n expect(vi.mocked(commonJs.readLocal)).not.toHaveBeenCalled();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
package/build/browser/utils.js
CHANGED
|
@@ -41,7 +41,8 @@ export function processOptionsAndAssignDefaults(url, redirect_uri, useHistory, l
|
|
|
41
41
|
joinedScopes: [...(options.scopes ?? ["api:read-data", "api:write-data", "api:use-ontologies-read", "api:use-ontologies-write"])].sort().join(" "),
|
|
42
42
|
fetchFn: options.fetchFn ?? globalThis.fetch,
|
|
43
43
|
ctxPath: options.ctxPath ?? "multipass",
|
|
44
|
-
refreshTokenMarker: options.refreshTokenMarker
|
|
44
|
+
refreshTokenMarker: options.refreshTokenMarker,
|
|
45
|
+
tokenStorage: options.tokenStorage ?? "localStorage"
|
|
45
46
|
};
|
|
46
47
|
}
|
|
47
48
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["invariant","processOptionsAndAssignDefaults","url","redirect_uri","useHistory","loginPage","postLoginPage","scopes","fetchFn","ctxPath","options","process","env","NODE_ENV","window","location","toString","joinedScopes","sort","join","globalThis","fetch","refreshTokenMarker"],"sources":["utils.ts"],"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\nimport invariant from \"tiny-invariant\";\nimport type { PublicOauthClientOptions } from \"./createPublicOauthClient.js\";\n\ninterface ProcessedPublicOauthClientOptions extends\n Omit<\n Required<PublicOauthClientOptions>,\n \"loginPage\" | \"refreshTokenMarker\" | \"scopes\"\n >\n{\n loginPage?: string;\n refreshTokenMarker?: string;\n joinedScopes: string;\n}\n\nexport function processOptionsAndAssignDefaults(\n url: string,\n redirect_uri: string,\n useHistory?: boolean | PublicOauthClientOptions,\n loginPage?: string,\n postLoginPage?: string,\n scopes?: string[],\n fetchFn?: typeof globalThis.fetch,\n ctxPath?: string,\n): ProcessedPublicOauthClientOptions {\n let options: PublicOauthClientOptions = {};\n\n if (typeof useHistory === \"object\") {\n invariant(\n !loginPage && !postLoginPage && !scopes && !fetchFn && !ctxPath,\n \"If useHistory is an object, other options should not be provided\",\n );\n options = useHistory;\n } else {\n options = {\n useHistory,\n loginPage,\n postLoginPage,\n scopes,\n fetchFn,\n ctxPath,\n };\n }\n\n invariant(url, \"url is required\");\n invariant(redirect_uri, \"redirectUrl is required\");\n\n // Assign defaults\n return {\n useHistory: options.useHistory ?? true,\n loginPage: options.loginPage,\n postLoginPage: options.postLoginPage || window.location.toString(),\n joinedScopes: [\n ...options.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ],\n ]\n .sort().join(\" \"),\n fetchFn: options.fetchFn ?? globalThis.fetch,\n ctxPath: options.ctxPath ?? \"multipass\",\n refreshTokenMarker: options.refreshTokenMarker,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,SAAS,MAAM,gBAAgB;
|
|
1
|
+
{"version":3,"file":"utils.js","names":["invariant","processOptionsAndAssignDefaults","url","redirect_uri","useHistory","loginPage","postLoginPage","scopes","fetchFn","ctxPath","options","process","env","NODE_ENV","window","location","toString","joinedScopes","sort","join","globalThis","fetch","refreshTokenMarker","tokenStorage"],"sources":["utils.ts"],"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\nimport invariant from \"tiny-invariant\";\nimport type { TokenStorageType } from \"./common.js\";\nimport type { PublicOauthClientOptions } from \"./createPublicOauthClient.js\";\n\ninterface ProcessedPublicOauthClientOptions extends\n Omit<\n Required<PublicOauthClientOptions>,\n \"loginPage\" | \"refreshTokenMarker\" | \"scopes\" | \"tokenStorage\"\n >\n{\n loginPage?: string;\n refreshTokenMarker?: string;\n joinedScopes: string;\n tokenStorage: TokenStorageType;\n}\n\nexport function processOptionsAndAssignDefaults(\n url: string,\n redirect_uri: string,\n useHistory?: boolean | PublicOauthClientOptions,\n loginPage?: string,\n postLoginPage?: string,\n scopes?: string[],\n fetchFn?: typeof globalThis.fetch,\n ctxPath?: string,\n): ProcessedPublicOauthClientOptions {\n let options: PublicOauthClientOptions = {};\n\n if (typeof useHistory === \"object\") {\n invariant(\n !loginPage && !postLoginPage && !scopes && !fetchFn && !ctxPath,\n \"If useHistory is an object, other options should not be provided\",\n );\n options = useHistory;\n } else {\n options = {\n useHistory,\n loginPage,\n postLoginPage,\n scopes,\n fetchFn,\n ctxPath,\n };\n }\n\n invariant(url, \"url is required\");\n invariant(redirect_uri, \"redirectUrl is required\");\n\n // Assign defaults\n return {\n useHistory: options.useHistory ?? true,\n loginPage: options.loginPage,\n postLoginPage: options.postLoginPage || window.location.toString(),\n joinedScopes: [\n ...options.scopes\n ?? [\n \"api:read-data\",\n \"api:write-data\",\n \"api:use-ontologies-read\",\n \"api:use-ontologies-write\",\n ],\n ]\n .sort().join(\" \"),\n fetchFn: options.fetchFn ?? globalThis.fetch,\n ctxPath: options.ctxPath ?? \"multipass\",\n refreshTokenMarker: options.refreshTokenMarker,\n tokenStorage: options.tokenStorage ?? \"localStorage\",\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,SAAS,MAAM,gBAAgB;AAgBtC,OAAO,SAASC,+BAA+BA,CAC7CC,GAAW,EACXC,YAAoB,EACpBC,UAA+C,EAC/CC,SAAkB,EAClBC,aAAsB,EACtBC,MAAiB,EACjBC,OAAiC,EACjCC,OAAgB,EACmB;EACnC,IAAIC,OAAiC,GAAG,CAAC,CAAC;EAE1C,IAAI,OAAON,UAAU,KAAK,QAAQ,EAAE;IAClC,EACE,CAACC,SAAS,IAAI,CAACC,aAAa,IAAI,CAACC,MAAM,IAAI,CAACC,OAAO,IAAI,CAACC,OAAO,IAAAE,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBADjEb,SAAS,QAEP,kEAAkE,IAFpEA,SAAS;IAITU,OAAO,GAAGN,UAAU;EACtB,CAAC,MAAM;IACLM,OAAO,GAAG;MACRN,UAAU;MACVC,SAAS;MACTC,aAAa;MACbC,MAAM;MACNC,OAAO;MACPC;IACF,CAAC;EACH;EAEA,CAAUP,GAAG,GAAAS,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAbb,SAAS,QAAM,iBAAiB,IAAhCA,SAAS;EACT,CAAUG,YAAY,GAAAQ,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAtBb,SAAS,QAAe,yBAAyB,IAAjDA,SAAS;;EAET;EACA,OAAO;IACLI,UAAU,EAAEM,OAAO,CAACN,UAAU,IAAI,IAAI;IACtCC,SAAS,EAAEK,OAAO,CAACL,SAAS;IAC5BC,aAAa,EAAEI,OAAO,CAACJ,aAAa,IAAIQ,MAAM,CAACC,QAAQ,CAACC,QAAQ,CAAC,CAAC;IAClEC,YAAY,EAAE,CACZ,IAAGP,OAAO,CAACH,MAAM,IACZ,CACD,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,CAC3B,EACJ,CACEW,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;IACnBX,OAAO,EAAEE,OAAO,CAACF,OAAO,IAAIY,UAAU,CAACC,KAAK;IAC5CZ,OAAO,EAAEC,OAAO,CAACD,OAAO,IAAI,WAAW;IACvCa,kBAAkB,EAAEZ,OAAO,CAACY,kBAAkB;IAC9CC,YAAY,EAAEb,OAAO,CAACa,YAAY,IAAI;EACxC,CAAC;AACH","ignoreList":[]}
|
package/build/cjs/index.cjs
CHANGED
|
@@ -991,17 +991,20 @@ var CustomEvent = globalThis.CustomEvent ?? class CustomEvent2 extends Event {
|
|
|
991
991
|
function localStorageKey(client) {
|
|
992
992
|
return `@osdk/oauth : refresh : ${client.client_id}`;
|
|
993
993
|
}
|
|
994
|
-
function
|
|
995
|
-
|
|
994
|
+
function getStorage(storageType) {
|
|
995
|
+
if (storageType === "none") return void 0;
|
|
996
|
+
{
|
|
997
|
+
return void 0;
|
|
998
|
+
}
|
|
996
999
|
}
|
|
997
|
-
function
|
|
998
|
-
|
|
1000
|
+
function saveLocal(client, x, storage) {
|
|
1001
|
+
storage?.setItem(localStorageKey(client), JSON.stringify(x));
|
|
999
1002
|
}
|
|
1000
|
-
function
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
);
|
|
1003
|
+
function removeLocal(client, storage) {
|
|
1004
|
+
storage?.removeItem(localStorageKey(client));
|
|
1005
|
+
}
|
|
1006
|
+
function readLocal(client, storage) {
|
|
1007
|
+
return JSON.parse(storage?.getItem(localStorageKey(client)) ?? "{}");
|
|
1005
1008
|
}
|
|
1006
1009
|
function saveSession(client, x) {
|
|
1007
1010
|
globalThis.sessionStorage?.setItem(localStorageKey(client), JSON.stringify(x));
|
|
@@ -1015,7 +1018,7 @@ function readSession(client) {
|
|
|
1015
1018
|
globalThis.sessionStorage?.getItem(localStorageKey(client)) ?? "{}"
|
|
1016
1019
|
);
|
|
1017
1020
|
}
|
|
1018
|
-
function common(client, as, _signIn, oauthHttpOptions, refresh, refreshTokenMarker, scopes) {
|
|
1021
|
+
function common(client, as, _signIn, oauthHttpOptions, refresh, refreshTokenMarker, scopes, storage) {
|
|
1019
1022
|
let token;
|
|
1020
1023
|
const eventTarget = new typescriptEventTarget.TypedEventTarget();
|
|
1021
1024
|
function makeTokenAndSaveRefresh(resp, type) {
|
|
@@ -1029,7 +1032,7 @@ function common(client, as, _signIn, oauthHttpOptions, refresh, refreshTokenMark
|
|
|
1029
1032
|
refresh_token,
|
|
1030
1033
|
refreshTokenMarker,
|
|
1031
1034
|
requestedScopes: scopes
|
|
1032
|
-
});
|
|
1035
|
+
}, storage);
|
|
1033
1036
|
token = {
|
|
1034
1037
|
refresh_token,
|
|
1035
1038
|
expires_in,
|
|
@@ -1055,7 +1058,7 @@ function common(client, as, _signIn, oauthHttpOptions, refresh, refreshTokenMark
|
|
|
1055
1058
|
!token ? process.env.NODE_ENV !== "production" ? invariant2__default.default(false, "not signed in") : invariant2__default.default(false) : void 0;
|
|
1056
1059
|
const result = await processRevocationResponse(await revocationRequest(as, client, token.access_token, oauthHttpOptions));
|
|
1057
1060
|
rmTimeout();
|
|
1058
|
-
removeLocal(client);
|
|
1061
|
+
removeLocal(client, storage);
|
|
1059
1062
|
token = void 0;
|
|
1060
1063
|
throwIfError(result);
|
|
1061
1064
|
eventTarget.dispatchTypedEvent("signOut", new Event("signOut"));
|
|
@@ -1123,7 +1126,7 @@ function createConfidentialOauthClient(client_id, client_secret, url, scopes = [
|
|
|
1123
1126
|
const {
|
|
1124
1127
|
getToken,
|
|
1125
1128
|
makeTokenAndSaveRefresh
|
|
1126
|
-
} = common(client, authServer, _signIn, oauthHttpOptions, void 0, void 0, joinedScopes);
|
|
1129
|
+
} = common(client, authServer, _signIn, oauthHttpOptions, void 0, void 0, joinedScopes, void 0);
|
|
1127
1130
|
async function _signIn() {
|
|
1128
1131
|
return makeTokenAndSaveRefresh(throwIfError(await processClientCredentialsResponse(authServer, client, await clientCredentialsGrantRequest(authServer, client, new URLSearchParams({
|
|
1129
1132
|
scope: joinedScopes
|
|
@@ -1132,60 +1135,10 @@ function createConfidentialOauthClient(client_id, client_secret, url, scopes = [
|
|
|
1132
1135
|
return getToken;
|
|
1133
1136
|
}
|
|
1134
1137
|
|
|
1135
|
-
//
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
error.name = "AbortError";
|
|
1139
|
-
return error;
|
|
1140
|
-
};
|
|
1141
|
-
var clearMethods = /* @__PURE__ */ new WeakMap();
|
|
1142
|
-
function createDelay({
|
|
1143
|
-
clearTimeout: defaultClear,
|
|
1144
|
-
setTimeout: defaultSet
|
|
1145
|
-
} = {}) {
|
|
1146
|
-
return (milliseconds, {
|
|
1147
|
-
value,
|
|
1148
|
-
signal: signal2
|
|
1149
|
-
} = {}) => {
|
|
1150
|
-
if (signal2?.aborted) {
|
|
1151
|
-
return Promise.reject(createAbortError());
|
|
1152
|
-
}
|
|
1153
|
-
let timeoutId;
|
|
1154
|
-
let settle;
|
|
1155
|
-
let rejectFunction;
|
|
1156
|
-
const clear = defaultClear ?? clearTimeout;
|
|
1157
|
-
const signalListener = () => {
|
|
1158
|
-
clear(timeoutId);
|
|
1159
|
-
rejectFunction(createAbortError());
|
|
1160
|
-
};
|
|
1161
|
-
const cleanup = () => {
|
|
1162
|
-
if (signal2) {
|
|
1163
|
-
signal2.removeEventListener("abort", signalListener);
|
|
1164
|
-
}
|
|
1165
|
-
};
|
|
1166
|
-
const delayPromise = new Promise((resolve, reject) => {
|
|
1167
|
-
settle = () => {
|
|
1168
|
-
cleanup();
|
|
1169
|
-
resolve(value);
|
|
1170
|
-
};
|
|
1171
|
-
rejectFunction = reject;
|
|
1172
|
-
timeoutId = (defaultSet ?? setTimeout)(settle, milliseconds);
|
|
1173
|
-
});
|
|
1174
|
-
if (signal2) {
|
|
1175
|
-
signal2.addEventListener("abort", signalListener, {
|
|
1176
|
-
once: true
|
|
1177
|
-
});
|
|
1178
|
-
}
|
|
1179
|
-
clearMethods.set(delayPromise, () => {
|
|
1180
|
-
clear(timeoutId);
|
|
1181
|
-
timeoutId = null;
|
|
1182
|
-
settle();
|
|
1183
|
-
});
|
|
1184
|
-
return delayPromise;
|
|
1185
|
-
};
|
|
1138
|
+
// src/delay.ts
|
|
1139
|
+
function delay(ms) {
|
|
1140
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
1186
1141
|
}
|
|
1187
|
-
var delay = createDelay();
|
|
1188
|
-
var delay_default = delay;
|
|
1189
1142
|
function processOptionsAndAssignDefaults(url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath) {
|
|
1190
1143
|
let options = {};
|
|
1191
1144
|
if (typeof useHistory === "object") {
|
|
@@ -1210,7 +1163,8 @@ function processOptionsAndAssignDefaults(url, redirect_uri, useHistory, loginPag
|
|
|
1210
1163
|
joinedScopes: [...options.scopes ?? ["api:read-data", "api:write-data", "api:use-ontologies-read", "api:use-ontologies-write"]].sort().join(" "),
|
|
1211
1164
|
fetchFn: options.fetchFn ?? globalThis.fetch,
|
|
1212
1165
|
ctxPath: options.ctxPath ?? "multipass",
|
|
1213
|
-
refreshTokenMarker: options.refreshTokenMarker
|
|
1166
|
+
refreshTokenMarker: options.refreshTokenMarker,
|
|
1167
|
+
tokenStorage: options.tokenStorage ?? "localStorage"
|
|
1214
1168
|
};
|
|
1215
1169
|
}
|
|
1216
1170
|
|
|
@@ -1218,6 +1172,7 @@ function processOptionsAndAssignDefaults(url, redirect_uri, useHistory, loginPag
|
|
|
1218
1172
|
function createPublicOauthClient(client_id, url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath) {
|
|
1219
1173
|
let refreshTokenMarker;
|
|
1220
1174
|
let joinedScopes;
|
|
1175
|
+
let tokenStorage;
|
|
1221
1176
|
({
|
|
1222
1177
|
useHistory,
|
|
1223
1178
|
loginPage,
|
|
@@ -1225,7 +1180,8 @@ function createPublicOauthClient(client_id, url, redirect_uri, useHistory, login
|
|
|
1225
1180
|
joinedScopes,
|
|
1226
1181
|
fetchFn,
|
|
1227
1182
|
ctxPath,
|
|
1228
|
-
refreshTokenMarker
|
|
1183
|
+
refreshTokenMarker,
|
|
1184
|
+
tokenStorage
|
|
1229
1185
|
} = processOptionsAndAssignDefaults(url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath));
|
|
1230
1186
|
const client = {
|
|
1231
1187
|
client_id,
|
|
@@ -1235,24 +1191,29 @@ function createPublicOauthClient(client_id, url, redirect_uri, useHistory, login
|
|
|
1235
1191
|
const oauthHttpOptions = {
|
|
1236
1192
|
[customFetch]: fetchFn
|
|
1237
1193
|
};
|
|
1194
|
+
const storage = getStorage(tokenStorage);
|
|
1238
1195
|
const {
|
|
1239
1196
|
makeTokenAndSaveRefresh,
|
|
1240
1197
|
getToken
|
|
1241
|
-
} = common(client, authServer, _signIn, oauthHttpOptions, maybeRefresh.bind(globalThis, true), refreshTokenMarker, joinedScopes);
|
|
1198
|
+
} = common(client, authServer, _signIn, oauthHttpOptions, maybeRefresh.bind(globalThis, true), refreshTokenMarker, joinedScopes, storage);
|
|
1242
1199
|
const go = async (x) => {
|
|
1243
1200
|
if (useHistory) {
|
|
1244
1201
|
window.history.replaceState({}, "", x);
|
|
1245
1202
|
return;
|
|
1246
1203
|
} else window.location.assign(x);
|
|
1247
|
-
await
|
|
1204
|
+
await delay(1e3);
|
|
1248
1205
|
throw new Error("Unable to redirect");
|
|
1249
1206
|
};
|
|
1250
1207
|
async function maybeRefresh(expectRefreshToken) {
|
|
1208
|
+
if (tokenStorage === "none") {
|
|
1209
|
+
if (expectRefreshToken) throw new Error("No refresh token found");
|
|
1210
|
+
return;
|
|
1211
|
+
}
|
|
1251
1212
|
const {
|
|
1252
1213
|
refresh_token,
|
|
1253
1214
|
refreshTokenMarker: lastRefreshTokenMarker,
|
|
1254
1215
|
requestedScopes: initialRequestedScopes
|
|
1255
|
-
} = readLocal(client);
|
|
1216
|
+
} = readLocal(client, storage);
|
|
1256
1217
|
const areScopesEqual = initialRequestedScopes != null && joinedScopes === initialRequestedScopes;
|
|
1257
1218
|
if (!refresh_token || lastRefreshTokenMarker !== refreshTokenMarker || !areScopesEqual) {
|
|
1258
1219
|
if (expectRefreshToken) throw new Error("No refresh token found");
|
|
@@ -1271,7 +1232,7 @@ function createPublicOauthClient(client_id, url, redirect_uri, useHistory, login
|
|
|
1271
1232
|
if (process.env.NODE_ENV !== "production") {
|
|
1272
1233
|
console.warn("Failed to get OAuth2 refresh token. Removing refresh token", e);
|
|
1273
1234
|
}
|
|
1274
|
-
removeLocal(client);
|
|
1235
|
+
removeLocal(client, storage);
|
|
1275
1236
|
if (expectRefreshToken) {
|
|
1276
1237
|
throw new Error("Could not refresh token");
|
|
1277
1238
|
}
|
|
@@ -1292,14 +1253,14 @@ function createPublicOauthClient(client_id, url, redirect_uri, useHistory, login
|
|
|
1292
1253
|
if (process.env.NODE_ENV !== "production") {
|
|
1293
1254
|
console.warn("Failed to get OAuth2 token using PKCE, removing PKCE and starting a new auth flow", e);
|
|
1294
1255
|
}
|
|
1295
|
-
removeLocal(client);
|
|
1256
|
+
removeLocal(client, storage);
|
|
1296
1257
|
removeSession(client);
|
|
1297
1258
|
throw e;
|
|
1298
1259
|
}
|
|
1299
1260
|
}
|
|
1300
1261
|
const initiateLoginRedirect = async () => {
|
|
1301
1262
|
if (loginPage && window.location.href !== loginPage && window.location.pathname !== loginPage) {
|
|
1302
|
-
saveLocal(client, {});
|
|
1263
|
+
saveLocal(client, {}, storage);
|
|
1303
1264
|
saveSession(client, {
|
|
1304
1265
|
oldUrl: postLoginPage
|
|
1305
1266
|
});
|
|
@@ -1309,12 +1270,13 @@ function createPublicOauthClient(client_id, url, redirect_uri, useHistory, login
|
|
|
1309
1270
|
const state = generateRandomState();
|
|
1310
1271
|
const codeVerifier = generateRandomCodeVerifier();
|
|
1311
1272
|
const oldUrl = readSession(client).oldUrl ?? window.location.toString();
|
|
1312
|
-
saveLocal(client, {});
|
|
1273
|
+
saveLocal(client, {}, storage);
|
|
1313
1274
|
saveSession(client, {
|
|
1314
1275
|
codeVerifier,
|
|
1315
1276
|
state,
|
|
1316
1277
|
oldUrl
|
|
1317
1278
|
});
|
|
1279
|
+
const scopeString = tokenStorage === "none" ? joinedScopes : `offline_access ${joinedScopes}`;
|
|
1318
1280
|
window.location.assign(`${authServer.authorization_endpoint}?${new URLSearchParams({
|
|
1319
1281
|
client_id,
|
|
1320
1282
|
response_type: "code",
|
|
@@ -1322,9 +1284,9 @@ function createPublicOauthClient(client_id, url, redirect_uri, useHistory, login
|
|
|
1322
1284
|
redirect_uri,
|
|
1323
1285
|
code_challenge: await calculatePKCECodeChallenge(codeVerifier),
|
|
1324
1286
|
code_challenge_method: "S256",
|
|
1325
|
-
scope:
|
|
1287
|
+
scope: scopeString
|
|
1326
1288
|
})}`);
|
|
1327
|
-
await
|
|
1289
|
+
await delay(1e3);
|
|
1328
1290
|
throw new Error("Unable to redirect");
|
|
1329
1291
|
};
|
|
1330
1292
|
async function _signIn() {
|