@osdk/oauth 1.1.0-beta.5 → 1.1.0-beta.7
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 +13 -0
- package/build/browser/common.d.ts +6 -8
- package/build/browser/common.d.ts.map +1 -1
- package/build/browser/common.js +13 -0
- package/build/browser/common.js.map +1 -1
- 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 +2 -2
- package/build/browser/createPublicOauthClient.d.ts.map +1 -1
- package/build/browser/createPublicOauthClient.js +21 -12
- package/build/browser/createPublicOauthClient.js.map +1 -1
- package/build/browser/publicOauth.test.js +31 -14
- package/build/browser/publicOauth.test.js.map +1 -1
- package/build/browser/utils.js +1 -1
- package/build/browser/utils.js.map +1 -1
- package/build/esm/common.d.ts +6 -8
- package/build/esm/common.d.ts.map +1 -1
- package/build/esm/common.js +13 -0
- package/build/esm/common.js.map +1 -1
- 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 +2 -2
- package/build/esm/createPublicOauthClient.d.ts.map +1 -1
- package/build/esm/createPublicOauthClient.js +21 -12
- package/build/esm/createPublicOauthClient.js.map +1 -1
- package/build/esm/publicOauth.test.js +31 -14
- package/build/esm/publicOauth.test.js.map +1 -1
- package/build/esm/utils.js +1 -1
- package/build/esm/utils.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @osdk/oauth
|
|
2
2
|
|
|
3
|
+
## 1.1.0-beta.7
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 0166d14: Fixes an infinite redirect issue on some errors in the OAuth flow
|
|
8
|
+
- c9da74c: Improves code quality by fixing linting errors
|
|
9
|
+
|
|
10
|
+
## 1.1.0-beta.6
|
|
11
|
+
|
|
12
|
+
### Minor Changes
|
|
13
|
+
|
|
14
|
+
- 3d2ba6f: Revert api:x-read/write back to api:read/write-x
|
|
15
|
+
|
|
3
16
|
## 1.1.0-beta.5
|
|
4
17
|
|
|
5
18
|
### Minor Changes
|
|
@@ -2,22 +2,17 @@ import type { AuthorizationServer, Client, HttpRequestOptions, OAuth2TokenEndpoi
|
|
|
2
2
|
import type { BaseOauthClient, Events } from "./BaseOauthClient.js";
|
|
3
3
|
import type { Token } from "./Token.js";
|
|
4
4
|
export type LocalStorageState = {
|
|
5
|
-
refresh_token?:
|
|
5
|
+
refresh_token?: string;
|
|
6
|
+
};
|
|
7
|
+
export type SessionStorageState = {
|
|
6
8
|
codeVerifier?: never;
|
|
7
9
|
state?: never;
|
|
8
10
|
oldUrl: string;
|
|
9
11
|
} | {
|
|
10
|
-
refresh_token?: never;
|
|
11
12
|
codeVerifier: string;
|
|
12
13
|
state: string;
|
|
13
14
|
oldUrl: string;
|
|
14
15
|
} | {
|
|
15
|
-
refresh_token?: string;
|
|
16
|
-
codeVerifier?: never;
|
|
17
|
-
state?: never;
|
|
18
|
-
oldUrl?: never;
|
|
19
|
-
} | {
|
|
20
|
-
refresh_token?: never;
|
|
21
16
|
codeVerifier?: never;
|
|
22
17
|
state?: never;
|
|
23
18
|
oldUrl?: never;
|
|
@@ -25,6 +20,9 @@ export type LocalStorageState = {
|
|
|
25
20
|
export declare function saveLocal(client: Client, x: LocalStorageState): void;
|
|
26
21
|
export declare function removeLocal(client: Client): void;
|
|
27
22
|
export declare function readLocal(client: Client): LocalStorageState;
|
|
23
|
+
export declare function saveSession(client: Client, x: SessionStorageState): void;
|
|
24
|
+
export declare function removeSession(client: Client): void;
|
|
25
|
+
export declare function readSession(client: Client): SessionStorageState;
|
|
28
26
|
export declare function common<R extends undefined | (() => Promise<Token | undefined>)>(client: Client, as: AuthorizationServer, _signIn: () => Promise<Token>, oauthHttpOptions: HttpRequestOptions, refresh: R): {
|
|
29
27
|
getToken: BaseOauthClient<keyof Events & string> & {
|
|
30
28
|
refresh: R;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/common.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,mBAAmB,EACnB,MAAM,EACN,kBAAkB,EAClB,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAwBxC,MAAM,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/common.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,mBAAmB,EACnB,MAAM,EACN,kBAAkB,EAClB,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAwBxC,MAAM,MAAM,iBAAiB,GAAG;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,MAAM,mBAAmB,GAE3B;IACA,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAEC;IACA,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAEC;IACA,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB,CAAC;AAEJ,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAMpE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKhD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAQ3D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,mBAAmB,QAMjE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,QAK3C;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAQ/D;AAED,wBAAgB,MAAM,CACpB,CAAC,SAAS,SAAS,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,EAExD,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,mBAAmB,EACvB,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAC7B,gBAAgB,EAAE,kBAAkB,EACpC,OAAO,EAAE,CAAC,GACT;IACD,QAAQ,EAAE,eAAe,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC,CAAA;KAAE,CAAC;IAClE,uBAAuB,EAAE,CACvB,IAAI,EAAE,2BAA2B,EACjC,IAAI,EAAE,QAAQ,GAAG,SAAS,KACvB,KAAK,CAAC;CACZ,CA0GA;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,QAAQ,CACT,IAAI,CACF,mBAAmB,EACjB,QAAQ,GACR,gBAAgB,GAChB,wBAAwB,GACxB,qBAAqB,CACxB,CACF,CAQA"}
|
package/build/browser/common.js
CHANGED
|
@@ -33,6 +33,19 @@ export function readLocal(client) {
|
|
|
33
33
|
// MUST `localStorage?` as nodejs does not have localStorage
|
|
34
34
|
globalThis.localStorage?.getItem(`@osdk/oauth : refresh : ${client.client_id}`) ?? "{}");
|
|
35
35
|
}
|
|
36
|
+
export function saveSession(client, x) {
|
|
37
|
+
// MUST `sessionStorage?` as nodejs does not have sessionStorage
|
|
38
|
+
globalThis.sessionStorage?.setItem(`@osdk/oauth : refresh : ${client.client_id}`, JSON.stringify(x));
|
|
39
|
+
}
|
|
40
|
+
export function removeSession(client) {
|
|
41
|
+
// MUST `sessionStorage?` as nodejs does not have sessionStorage
|
|
42
|
+
globalThis.sessionStorage?.removeItem(`@osdk/oauth : refresh : ${client.client_id}`);
|
|
43
|
+
}
|
|
44
|
+
export function readSession(client) {
|
|
45
|
+
return JSON.parse(
|
|
46
|
+
// MUST `sessionStorage?` as nodejs does not have sessionStorage
|
|
47
|
+
globalThis.sessionStorage?.getItem(`@osdk/oauth : refresh : ${client.client_id}`) ?? "{}");
|
|
48
|
+
}
|
|
36
49
|
export function common(client, as, _signIn, oauthHttpOptions, refresh) {
|
|
37
50
|
let token;
|
|
38
51
|
const eventTarget = new TypedEventTarget();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":["processRevocationResponse","revocationRequest","invariant","TypedEventTarget","throwIfError","CustomEvent","globalThis","saveLocal","client","x","localStorage","setItem","client_id","JSON","stringify","removeLocal","removeItem","readLocal","parse","getItem","common","as","_signIn","oauthHttpOptions","refresh","token","eventTarget","makeTokenAndSaveRefresh","resp","type","refresh_token","expires_in","access_token","process","env","NODE_ENV","expires_at","Date","now","dispatchTypedEvent","detail","refreshTimeout","rmTimeout","clearTimeout","restartRefreshTimer","evt","setTimeout","pendingSignIn","signIn","undefined","addEventListener","getTokenOrUndefined","getToken","Object","assign","signOut","result","Event","bind","removeEventListener","createAuthorizationServer","ctxPath","url","issuer","URL","token_endpoint","authorization_endpoint","revocation_endpoint"],"sources":["common.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 { processRevocationResponse, revocationRequest } from \"oauth4webapi\";\nimport invariant from \"tiny-invariant\";\nimport { TypedEventTarget } from \"typescript-event-target\";\nimport { throwIfError } from \"./throwIfError.js\";\n// Node 18 is supposed to have a `CustomEvent` but it is not exposed on `globalThis`\n// which creates a problem for making a single codebase for node and browser. This polyfill works around it\nconst CustomEvent = process.env.TARGET === \"browser\"\n ? globalThis.CustomEvent\n : globalThis.CustomEvent\n ?? class CustomEvent extends Event {\n #detail;\n constructor(type, options) {\n super(type, options);\n this.#detail = options?.detail ?? null;\n }\n get detail() {\n return this.#detail;\n }\n };\nexport function saveLocal(client, x) {\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.setItem(`@osdk/oauth : refresh : ${client.client_id}`, JSON.stringify(x));\n}\nexport function removeLocal(client) {\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.removeItem(`@osdk/oauth : refresh : ${client.client_id}`);\n}\nexport function readLocal(client) {\n return JSON.parse(\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.getItem(`@osdk/oauth : refresh : ${client.client_id}`)\n ?? \"{}\");\n}\nexport function common(client, as, _signIn, oauthHttpOptions, refresh) {\n let token;\n const eventTarget = new TypedEventTarget();\n function makeTokenAndSaveRefresh(resp, type) {\n const { refresh_token, expires_in, access_token } = resp;\n invariant(expires_in != null);\n saveLocal(client, { refresh_token });\n token = {\n refresh_token,\n expires_in,\n access_token,\n expires_at: Date.now() + expires_in * 1000,\n };\n eventTarget.dispatchTypedEvent(type, new CustomEvent(type, { detail: token }));\n return token;\n }\n let refreshTimeout;\n function rmTimeout() {\n if (refreshTimeout)\n clearTimeout(refreshTimeout);\n }\n function restartRefreshTimer(evt) {\n if (refresh) {\n rmTimeout();\n refreshTimeout = setTimeout(refresh, evt.detail.expires_in * 1000 - 60 * 1000);\n }\n }\n async function signOut() {\n invariant(token, \"not signed in\");\n const result = await processRevocationResponse(await revocationRequest(as, client, token.access_token, oauthHttpOptions));\n rmTimeout();\n // Clean up\n removeLocal(client);\n token = undefined;\n throwIfError(result);\n eventTarget.dispatchTypedEvent(\"signOut\", new Event(\"signOut\"));\n }\n let pendingSignIn;\n async function signIn() {\n if (pendingSignIn) {\n return pendingSignIn;\n }\n try {\n pendingSignIn = _signIn();\n return await pendingSignIn;\n }\n finally {\n pendingSignIn = undefined;\n }\n }\n eventTarget.addEventListener(\"signIn\", restartRefreshTimer);\n eventTarget.addEventListener(\"refresh\", restartRefreshTimer);\n function getTokenOrUndefined() {\n if (!token || Date.now() >= token.expires_at) {\n return undefined;\n }\n return token?.access_token;\n }\n const getToken = Object.assign(async function getToken() {\n if (!token || Date.now() >= token.expires_at) {\n token = await signIn();\n }\n return token?.access_token;\n }, {\n signIn,\n refresh,\n signOut,\n rmTimeout,\n getTokenOrUndefined,\n addEventListener: eventTarget.addEventListener.bind(eventTarget),\n removeEventListener: eventTarget.removeEventListener.bind(eventTarget),\n });\n return { getToken, makeTokenAndSaveRefresh };\n}\nexport function createAuthorizationServer(ctxPath, url) {\n const issuer = `${new URL(ctxPath, url)}`;\n return {\n token_endpoint: `${issuer}/api/oauth2/token`,\n authorization_endpoint: `${issuer}/api/oauth2/authorize`,\n revocation_endpoint: `${issuer}/api/oauth2/revoke_token`,\n issuer,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"common.js","names":["processRevocationResponse","revocationRequest","invariant","TypedEventTarget","throwIfError","CustomEvent","globalThis","saveLocal","client","x","localStorage","setItem","client_id","JSON","stringify","removeLocal","removeItem","readLocal","parse","getItem","saveSession","sessionStorage","removeSession","readSession","common","as","_signIn","oauthHttpOptions","refresh","token","eventTarget","makeTokenAndSaveRefresh","resp","type","refresh_token","expires_in","access_token","process","env","NODE_ENV","expires_at","Date","now","dispatchTypedEvent","detail","refreshTimeout","rmTimeout","clearTimeout","restartRefreshTimer","evt","setTimeout","pendingSignIn","signIn","undefined","addEventListener","getTokenOrUndefined","getToken","Object","assign","signOut","result","Event","bind","removeEventListener","createAuthorizationServer","ctxPath","url","issuer","URL","token_endpoint","authorization_endpoint","revocation_endpoint"],"sources":["common.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 { processRevocationResponse, revocationRequest } from \"oauth4webapi\";\nimport invariant from \"tiny-invariant\";\nimport { TypedEventTarget } from \"typescript-event-target\";\nimport { throwIfError } from \"./throwIfError.js\";\n// Node 18 is supposed to have a `CustomEvent` but it is not exposed on `globalThis`\n// which creates a problem for making a single codebase for node and browser. This polyfill works around it\nconst CustomEvent = process.env.TARGET === \"browser\"\n ? globalThis.CustomEvent\n : globalThis.CustomEvent\n ?? class CustomEvent extends Event {\n #detail;\n constructor(type, options) {\n super(type, options);\n this.#detail = options?.detail ?? null;\n }\n get detail() {\n return this.#detail;\n }\n };\nexport function saveLocal(client, x) {\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.setItem(`@osdk/oauth : refresh : ${client.client_id}`, JSON.stringify(x));\n}\nexport function removeLocal(client) {\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.removeItem(`@osdk/oauth : refresh : ${client.client_id}`);\n}\nexport function readLocal(client) {\n return JSON.parse(\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.getItem(`@osdk/oauth : refresh : ${client.client_id}`)\n ?? \"{}\");\n}\nexport function saveSession(client, x) {\n // MUST `sessionStorage?` as nodejs does not have sessionStorage\n globalThis.sessionStorage?.setItem(`@osdk/oauth : refresh : ${client.client_id}`, JSON.stringify(x));\n}\nexport function removeSession(client) {\n // MUST `sessionStorage?` as nodejs does not have sessionStorage\n globalThis.sessionStorage?.removeItem(`@osdk/oauth : refresh : ${client.client_id}`);\n}\nexport function readSession(client) {\n return JSON.parse(\n // MUST `sessionStorage?` as nodejs does not have sessionStorage\n globalThis.sessionStorage?.getItem(`@osdk/oauth : refresh : ${client.client_id}`)\n ?? \"{}\");\n}\nexport function common(client, as, _signIn, oauthHttpOptions, refresh) {\n let token;\n const eventTarget = new TypedEventTarget();\n function makeTokenAndSaveRefresh(resp, type) {\n const { refresh_token, expires_in, access_token } = resp;\n invariant(expires_in != null);\n saveLocal(client, { refresh_token });\n token = {\n refresh_token,\n expires_in,\n access_token,\n expires_at: Date.now() + expires_in * 1000,\n };\n eventTarget.dispatchTypedEvent(type, new CustomEvent(type, { detail: token }));\n return token;\n }\n let refreshTimeout;\n function rmTimeout() {\n if (refreshTimeout)\n clearTimeout(refreshTimeout);\n }\n function restartRefreshTimer(evt) {\n if (refresh) {\n rmTimeout();\n refreshTimeout = setTimeout(refresh, evt.detail.expires_in * 1000 - 60 * 1000);\n }\n }\n async function signOut() {\n invariant(token, \"not signed in\");\n const result = await processRevocationResponse(await revocationRequest(as, client, token.access_token, oauthHttpOptions));\n rmTimeout();\n // Clean up\n removeLocal(client);\n token = undefined;\n throwIfError(result);\n eventTarget.dispatchTypedEvent(\"signOut\", new Event(\"signOut\"));\n }\n let pendingSignIn;\n async function signIn() {\n if (pendingSignIn) {\n return pendingSignIn;\n }\n try {\n pendingSignIn = _signIn();\n return await pendingSignIn;\n }\n finally {\n pendingSignIn = undefined;\n }\n }\n eventTarget.addEventListener(\"signIn\", restartRefreshTimer);\n eventTarget.addEventListener(\"refresh\", restartRefreshTimer);\n function getTokenOrUndefined() {\n if (!token || Date.now() >= token.expires_at) {\n return undefined;\n }\n return token?.access_token;\n }\n const getToken = Object.assign(async function getToken() {\n if (!token || Date.now() >= token.expires_at) {\n token = await signIn();\n }\n return token?.access_token;\n }, {\n signIn,\n refresh,\n signOut,\n rmTimeout,\n getTokenOrUndefined,\n addEventListener: eventTarget.addEventListener.bind(eventTarget),\n removeEventListener: eventTarget.removeEventListener.bind(eventTarget),\n });\n return { getToken, makeTokenAndSaveRefresh };\n}\nexport function createAuthorizationServer(ctxPath, url) {\n const issuer = `${new URL(ctxPath, url)}`;\n return {\n token_endpoint: `${issuer}/api/oauth2/token`,\n authorization_endpoint: `${issuer}/api/oauth2/authorize`,\n revocation_endpoint: `${issuer}/api/oauth2/revoke_token`,\n issuer,\n };\n}\n"],"mappings":"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","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,
|
|
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,CAgCzB"}
|
|
@@ -25,7 +25,7 @@ import { throwIfError } from "./throwIfError.js";
|
|
|
25
25
|
* @param ctxPath
|
|
26
26
|
* @returns which can be used as a token provider
|
|
27
27
|
*/
|
|
28
|
-
export function createConfidentialOauthClient(client_id, client_secret, url, scopes = ["api:
|
|
28
|
+
export function createConfidentialOauthClient(client_id, client_secret, url, scopes = ["api:read-data", "api:write-data"], fetchFn = globalThis.fetch, ctxPath = "multipass") {
|
|
29
29
|
const client = {
|
|
30
30
|
client_id,
|
|
31
31
|
client_secret
|
|
@@ -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:
|
|
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;EAI9G,OAAOL,QAAQ;AACnB","ignoreList":[]}
|
|
@@ -13,7 +13,7 @@ export interface PublicOauthClientOptions {
|
|
|
13
13
|
*/
|
|
14
14
|
postLoginPage?: string;
|
|
15
15
|
/**
|
|
16
|
-
* * @param {string[]} [scopes=[]] - OAuth scopes to request. If not provided, defaults to `["api:
|
|
16
|
+
* * @param {string[]} [scopes=[]] - OAuth scopes to request. If not provided, defaults to `["api:read-data", "api:write-data"]`
|
|
17
17
|
*/
|
|
18
18
|
scopes?: string[];
|
|
19
19
|
/**
|
|
@@ -44,7 +44,7 @@ export declare function createPublicOauthClient(clientId: string, url: string, r
|
|
|
44
44
|
* @param {boolean} useHistory - If true, uses `history.replaceState()`, otherwise uses `window.location.assign()` (defaults to true)
|
|
45
45
|
* @param {string} loginPage - Custom landing page URL prior to logging in
|
|
46
46
|
* @param {string} postLoginPage - URL to return to after completed authentication cycle (defaults to `window.location.toString()`)
|
|
47
|
-
* @param {string[]} scopes - OAuth scopes to request. If not provided, defaults to `["api:
|
|
47
|
+
* @param {string[]} scopes - OAuth scopes to request. If not provided, defaults to `["api:read-data", "api:write-data"]`
|
|
48
48
|
* @param {typeof globalThis.fetch} fetchFn - Custom fetch function to use for requests (defaults to `globalThis.fetch`)
|
|
49
49
|
* @param {string} ctxPath - Context path for the authorization server (defaults to "multipass")
|
|
50
50
|
* @returns {PublicOauthClient} A client that can be used as a token provider
|
|
@@ -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;CAClB;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,7 +15,7 @@
|
|
|
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) {
|
|
@@ -49,7 +49,10 @@ export function createPublicOauthClient(client_id, url, redirect_uri, useHistory
|
|
|
49
49
|
}, oauthHttpOptions, maybeRefresh.bind(globalThis, true));
|
|
50
50
|
// as an arrow function, `useHistory` is known to be a boolean
|
|
51
51
|
const go = async x => {
|
|
52
|
-
if (useHistory)
|
|
52
|
+
if (useHistory) {
|
|
53
|
+
window.history.replaceState({}, "", x);
|
|
54
|
+
return;
|
|
55
|
+
} else window.location.assign(x);
|
|
53
56
|
await delay(1000);
|
|
54
57
|
throw new Error("Unable to redirect");
|
|
55
58
|
};
|
|
@@ -68,8 +71,9 @@ export function createPublicOauthClient(client_id, url, redirect_uri, useHistory
|
|
|
68
71
|
if (result && window.location.pathname === new URL(redirect_uri).pathname) {
|
|
69
72
|
const {
|
|
70
73
|
oldUrl
|
|
71
|
-
} =
|
|
72
|
-
|
|
74
|
+
} = readSession(client);
|
|
75
|
+
// don't block on the redirect
|
|
76
|
+
void go(oldUrl ?? "/");
|
|
73
77
|
}
|
|
74
78
|
return result;
|
|
75
79
|
} catch (e) {
|
|
@@ -85,14 +89,14 @@ export function createPublicOauthClient(client_id, url, redirect_uri, useHistory
|
|
|
85
89
|
}
|
|
86
90
|
async function maybeHandleAuthReturn() {
|
|
87
91
|
const {
|
|
88
|
-
codeVerifier,
|
|
89
92
|
state,
|
|
90
|
-
oldUrl
|
|
91
|
-
|
|
93
|
+
oldUrl,
|
|
94
|
+
codeVerifier
|
|
95
|
+
} = readSession(client);
|
|
92
96
|
if (!codeVerifier) return;
|
|
93
97
|
try {
|
|
94
98
|
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);
|
|
99
|
+
void go(oldUrl);
|
|
96
100
|
return ret;
|
|
97
101
|
} catch (e) {
|
|
98
102
|
if (process.env.NODE_ENV !== "production") {
|
|
@@ -100,20 +104,25 @@ export function createPublicOauthClient(client_id, url, redirect_uri, useHistory
|
|
|
100
104
|
console.warn("Failed to get OAuth2 token using PKCE, removing PKCE and starting a new auth flow", e);
|
|
101
105
|
}
|
|
102
106
|
removeLocal(client);
|
|
107
|
+
removeSession(client);
|
|
108
|
+
throw e;
|
|
103
109
|
}
|
|
104
110
|
}
|
|
105
111
|
// As an arrow function, `scopes` and `postLoginPage` are known at compile time
|
|
106
112
|
const initiateLoginRedirect = async () => {
|
|
107
113
|
if (loginPage && window.location.href !== loginPage && window.location.pathname !== loginPage) {
|
|
108
|
-
saveLocal(client, {
|
|
114
|
+
saveLocal(client, {});
|
|
115
|
+
saveSession(client, {
|
|
109
116
|
oldUrl: postLoginPage
|
|
110
117
|
});
|
|
111
|
-
|
|
118
|
+
await go(loginPage);
|
|
119
|
+
return;
|
|
112
120
|
}
|
|
113
121
|
const state = generateRandomState();
|
|
114
122
|
const codeVerifier = generateRandomCodeVerifier();
|
|
115
|
-
const oldUrl =
|
|
116
|
-
saveLocal(client, {
|
|
123
|
+
const oldUrl = readSession(client).oldUrl ?? window.location.toString();
|
|
124
|
+
saveLocal(client, {});
|
|
125
|
+
saveSession(client, {
|
|
117
126
|
codeVerifier,
|
|
118
127
|
state,
|
|
119
128
|
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","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","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 ({\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 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 } = 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 } = 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();
|
|
@@ -155,22 +162,32 @@ describe(createPublicOauthClient, () => {
|
|
|
155
162
|
}), commonJs.createAuthorizationServer(clientArgs.ctxPath ?? "/multipass", clientArgs.foundryUrl), expect.any(Function), expect.anything(), expect.any(Function));
|
|
156
163
|
});
|
|
157
164
|
describe.each([{
|
|
158
|
-
|
|
165
|
+
localStorage: {
|
|
166
|
+
refresh_token: "a-refresh-token"
|
|
167
|
+
},
|
|
168
|
+
sessionStorage: {}
|
|
169
|
+
}, {
|
|
170
|
+
localStorage: {},
|
|
171
|
+
sessionStorage: {
|
|
172
|
+
codeVerifier: "hi",
|
|
173
|
+
state: "mom",
|
|
174
|
+
oldUrl: "https://someoldurl.local"
|
|
175
|
+
}
|
|
159
176
|
}, {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}, {}])("Initial Local State: %s", initialLocalState => {
|
|
177
|
+
localStorage: {},
|
|
178
|
+
sessionStorage: {}
|
|
179
|
+
}])("Initial Local State: %s", initialState => {
|
|
164
180
|
const ACCESS_TOKEN = (Math.random() + 1).toString(36).substring(7);
|
|
165
181
|
beforeEach(() => {
|
|
166
|
-
vi.mocked(commonJs.readLocal).mockImplementation(() =>
|
|
182
|
+
vi.mocked(commonJs.readLocal).mockImplementation(() => initialState.localStorage);
|
|
183
|
+
vi.mocked(commonJs.readSession).mockImplementation(() => initialState.sessionStorage);
|
|
167
184
|
hoistedMocks.makeTokenAndSaveRefresh.mockImplementation(() => ({
|
|
168
185
|
access_token: ACCESS_TOKEN,
|
|
169
186
|
expires_at: Date.now(),
|
|
170
187
|
expires_in: 10000
|
|
171
188
|
}));
|
|
172
189
|
});
|
|
173
|
-
if (Object.keys(
|
|
190
|
+
if (Object.keys(initialState.localStorage).length === 0 && Object.keys(initialState.sessionStorage).length === 0) {
|
|
174
191
|
if (should.redirectToLoginPage) {
|
|
175
192
|
it("redirects to login page", async () => {
|
|
176
193
|
const tokenPromise = client();
|
|
@@ -178,7 +195,7 @@ describe(createPublicOauthClient, () => {
|
|
|
178
195
|
if (should.redirectToLoginPage) {
|
|
179
196
|
// expect save local
|
|
180
197
|
await expect(tokenPromise).resolves.toBeUndefined();
|
|
181
|
-
expect(
|
|
198
|
+
expect(mockSessionStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({
|
|
182
199
|
oldUrl: window.location.toString()
|
|
183
200
|
}));
|
|
184
201
|
expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, "", clientArgs.loginPage);
|
|
@@ -191,7 +208,7 @@ describe(createPublicOauthClient, () => {
|
|
|
191
208
|
if (should.redirectToLoginPage) {
|
|
192
209
|
// expect save local
|
|
193
210
|
await expect(tokenPromise).resolves.toBeUndefined();
|
|
194
|
-
expect(
|
|
211
|
+
expect(mockSessionStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({
|
|
195
212
|
oldUrl: window.location.toString()
|
|
196
213
|
}));
|
|
197
214
|
expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, "", clientArgs.loginPage);
|
|
@@ -210,13 +227,13 @@ describe(createPublicOauthClient, () => {
|
|
|
210
227
|
redirect_uri: clientArgs.redirectUrl,
|
|
211
228
|
response_type: "code",
|
|
212
229
|
code_challenge_method: "S256",
|
|
213
|
-
scope: "offline_access api:
|
|
230
|
+
scope: "offline_access api:read-data api:write-data",
|
|
214
231
|
state: expect.any(String)
|
|
215
232
|
}));
|
|
216
233
|
});
|
|
217
234
|
}
|
|
218
235
|
}
|
|
219
|
-
if (
|
|
236
|
+
if (initialState.sessionStorage.codeVerifier) {
|
|
220
237
|
it("tries to auth with return results", async () => {
|
|
221
238
|
await expect(client()).resolves.toEqual(ACCESS_TOKEN);
|
|
222
239
|
expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(1);
|
|
@@ -224,10 +241,10 @@ describe(createPublicOauthClient, () => {
|
|
|
224
241
|
// this is only because we didn't mock out the internals
|
|
225
242
|
"signIn");
|
|
226
243
|
expect(mockWindow.history.replaceState).toHaveBeenCalledTimes(1);
|
|
227
|
-
expect(mockWindow.history.replaceState).toBeCalledWith(expect.anything(), expect.anything(),
|
|
244
|
+
expect(mockWindow.history.replaceState).toBeCalledWith(expect.anything(), expect.anything(), initialState.sessionStorage.oldUrl);
|
|
228
245
|
});
|
|
229
246
|
}
|
|
230
|
-
if (
|
|
247
|
+
if (initialState.localStorage.refresh_token) {
|
|
231
248
|
it("refreshes", async () => {
|
|
232
249
|
await expect(client()).resolves.toEqual(ACCESS_TOKEN);
|
|
233
250
|
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:ontologies-read api:ontologies-write\",\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","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","localStorage","refresh_token","sessionStorage","codeVerifier","state","oldUrl","initialState","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 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 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 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 // 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 (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/browser/utils.js
CHANGED
|
@@ -36,7 +36,7 @@ export function processOptionsAndAssignDefaults(url, redirect_uri, useHistory, l
|
|
|
36
36
|
useHistory: options.useHistory ?? true,
|
|
37
37
|
loginPage: options.loginPage,
|
|
38
38
|
postLoginPage: options.postLoginPage || window.location.toString(),
|
|
39
|
-
scopes: options.scopes ?? ["api:
|
|
39
|
+
scopes: options.scopes ?? ["api:read-data", "api:write-data"],
|
|
40
40
|
fetchFn: options.fetchFn ?? globalThis.fetch,
|
|
41
41
|
ctxPath: options.ctxPath ?? "multipass"
|
|
42
42
|
};
|
|
@@ -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","globalThis","fetch"],"sources":["utils.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 invariant from \"tiny-invariant\";\nexport function processOptionsAndAssignDefaults(url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath) {\n let options = {};\n if (typeof useHistory === \"object\") {\n invariant(!loginPage && !postLoginPage && !scopes && !fetchFn && !ctxPath, \"If useHistory is an object, other options should not be provided\");\n options = useHistory;\n }\n else {\n options = {\n useHistory,\n loginPage,\n postLoginPage,\n scopes,\n fetchFn,\n ctxPath,\n };\n }\n invariant(url, \"url is required\");\n invariant(redirect_uri, \"redirectUrl is required\");\n // Assign defaults\n return {\n useHistory: options.useHistory ?? true,\n loginPage: options.loginPage,\n postLoginPage: options.postLoginPage || window.location.toString(),\n scopes: options.scopes ?? [\"api:
|
|
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","globalThis","fetch"],"sources":["utils.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 invariant from \"tiny-invariant\";\nexport function processOptionsAndAssignDefaults(url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath) {\n let options = {};\n if (typeof useHistory === \"object\") {\n invariant(!loginPage && !postLoginPage && !scopes && !fetchFn && !ctxPath, \"If useHistory is an object, other options should not be provided\");\n options = useHistory;\n }\n else {\n options = {\n useHistory,\n loginPage,\n postLoginPage,\n scopes,\n fetchFn,\n ctxPath,\n };\n }\n invariant(url, \"url is required\");\n invariant(redirect_uri, \"redirectUrl is required\");\n // Assign defaults\n return {\n useHistory: options.useHistory ?? true,\n loginPage: options.loginPage,\n postLoginPage: options.postLoginPage || window.location.toString(),\n scopes: options.scopes ?? [\"api:read-data\", \"api:write-data\"],\n fetchFn: options.fetchFn ?? globalThis.fetch,\n ctxPath: options.ctxPath ?? \"multipass\",\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAOA,SAAS,MAAM,gBAAgB;AACtC,OAAO,SAASC,+BAA+BA,CAACC,GAAG,EAAEC,YAAY,EAAEC,UAAU,EAAEC,SAAS,EAAEC,aAAa,EAAEC,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAE;EAC/H,IAAIC,OAAO,GAAG,CAAC,CAAC;EAChB,IAAI,OAAON,UAAU,KAAK,QAAQ,EAAE;IAChC,EAAU,CAACC,SAAS,IAAI,CAACC,aAAa,IAAI,CAACC,MAAM,IAAI,CAACC,OAAO,IAAI,CAACC,OAAO,IAAAE,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAzEb,SAAS,QAAkE,kEAAkE,IAA7IA,SAAS;IACTU,OAAO,GAAGN,UAAU;EACxB,CAAC,MACI;IACDM,OAAO,GAAG;MACNN,UAAU;MACVC,SAAS;MACTC,aAAa;MACbC,MAAM;MACNC,OAAO;MACPC;IACJ,CAAC;EACL;EACA,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;EACT;EACA,OAAO;IACHI,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;IAClET,MAAM,EAAEG,OAAO,CAACH,MAAM,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAC7DC,OAAO,EAAEE,OAAO,CAACF,OAAO,IAAIS,UAAU,CAACC,KAAK;IAC5CT,OAAO,EAAEC,OAAO,CAACD,OAAO,IAAI;EAChC,CAAC;AACL","ignoreList":[]}
|