@auth0/ai 1.0.2 → 2.0.1
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/README.md +1 -1
- package/dist/cjs/authorizers/ciba/CIBAAuthorizerBase.js +81 -55
- package/dist/cjs/authorizers/ciba/CIBAAuthorizerBase.js.map +1 -1
- package/dist/cjs/authorizers/ciba/CIBAAuthorizerParams.js.map +1 -1
- package/dist/cjs/authorizers/ciba/asyncLocalStorage.js +1 -1
- package/dist/cjs/authorizers/ciba/asyncLocalStorage.js.map +1 -1
- package/dist/cjs/authorizers/context.js +20 -0
- package/dist/cjs/authorizers/context.js.map +1 -0
- package/dist/cjs/authorizers/device-authorizer/DeviceAuthResponse.js +18 -0
- package/dist/cjs/authorizers/device-authorizer/DeviceAuthResponse.js.map +1 -0
- package/dist/cjs/authorizers/device-authorizer/DeviceAuthorizerBase.js +231 -0
- package/dist/cjs/authorizers/device-authorizer/DeviceAuthorizerBase.js.map +1 -0
- package/dist/cjs/{TokenResponse.js → authorizers/device-authorizer/DeviceAuthorizerParams.js} +1 -1
- package/dist/cjs/authorizers/device-authorizer/DeviceAuthorizerParams.js.map +1 -0
- package/dist/cjs/authorizers/device-authorizer/asyncLocalStorage.js +14 -0
- package/dist/cjs/authorizers/device-authorizer/asyncLocalStorage.js.map +1 -0
- package/dist/cjs/authorizers/device-authorizer/index.js +9 -0
- package/dist/cjs/authorizers/device-authorizer/index.js.map +1 -0
- package/dist/cjs/authorizers/federated-connections/FederatedConnectionAuthorizerBase.js +161 -0
- package/dist/cjs/authorizers/federated-connections/FederatedConnectionAuthorizerBase.js.map +1 -0
- package/dist/cjs/authorizers/federated-connections/FederatedConnectionAuthorizerParams.js +3 -0
- package/dist/cjs/authorizers/federated-connections/FederatedConnectionAuthorizerParams.js.map +1 -0
- package/dist/cjs/authorizers/federated-connections/asyncLocalStorage.js +5 -5
- package/dist/cjs/authorizers/federated-connections/asyncLocalStorage.js.map +1 -1
- package/dist/cjs/authorizers/federated-connections/index.js +5 -125
- package/dist/cjs/authorizers/federated-connections/index.js.map +1 -1
- package/dist/cjs/authorizers/index.js.map +1 -1
- package/dist/cjs/authorizers/types.js +14 -0
- package/dist/cjs/authorizers/types.js.map +1 -0
- package/dist/cjs/credentials.js +13 -0
- package/dist/cjs/credentials.js.map +1 -1
- package/dist/cjs/index.js +0 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interrupts/DeviceInterrupts.js +79 -0
- package/dist/cjs/interrupts/DeviceInterrupts.js.map +1 -0
- package/dist/cjs/interrupts/index.js +37 -1
- package/dist/cjs/interrupts/index.js.map +1 -1
- package/dist/cjs/stores/Store.js +12 -0
- package/dist/cjs/stores/Store.js.map +1 -0
- package/dist/cjs/stores/SubStore.js +52 -0
- package/dist/cjs/stores/SubStore.js.map +1 -0
- package/dist/cjs/stores/impl/FSStore.js +80 -0
- package/dist/cjs/stores/impl/FSStore.js.map +1 -0
- package/dist/cjs/stores/impl/MemoryStore.js +15 -0
- package/dist/cjs/stores/impl/MemoryStore.js.map +1 -0
- package/dist/cjs/stores/impl/TempBoxStore.js +22 -0
- package/dist/cjs/stores/impl/TempBoxStore.js.map +1 -0
- package/dist/cjs/stores/index.js +10 -0
- package/dist/cjs/stores/index.js.map +1 -0
- package/dist/cjs/util/index.js +12 -0
- package/dist/cjs/util/index.js.map +1 -0
- package/dist/esm/authorizers/ciba/CIBAAuthorizerBase.d.ts +12 -8
- package/dist/esm/authorizers/ciba/CIBAAuthorizerBase.js +78 -55
- package/dist/esm/authorizers/ciba/CIBAAuthorizerBase.js.map +1 -1
- package/dist/esm/authorizers/ciba/CIBAAuthorizerParams.d.ts +20 -20
- package/dist/esm/authorizers/ciba/CIBAAuthorizerParams.js.map +1 -1
- package/dist/esm/authorizers/ciba/asyncLocalStorage.d.ts +7 -3
- package/dist/esm/authorizers/ciba/asyncLocalStorage.js +1 -1
- package/dist/esm/authorizers/ciba/asyncLocalStorage.js.map +1 -1
- package/dist/esm/authorizers/context.d.ts +16 -0
- package/dist/esm/authorizers/context.js +16 -0
- package/dist/esm/authorizers/context.js.map +1 -0
- package/dist/esm/authorizers/device-authorizer/DeviceAuthResponse.d.ts +38 -0
- package/dist/esm/authorizers/device-authorizer/DeviceAuthResponse.js +15 -0
- package/dist/esm/authorizers/device-authorizer/DeviceAuthResponse.js.map +1 -0
- package/dist/esm/authorizers/device-authorizer/DeviceAuthorizerBase.d.ts +49 -0
- package/dist/esm/authorizers/device-authorizer/DeviceAuthorizerBase.js +224 -0
- package/dist/esm/authorizers/device-authorizer/DeviceAuthorizerBase.js.map +1 -0
- package/dist/esm/authorizers/device-authorizer/DeviceAuthorizerParams.d.ts +58 -0
- package/dist/esm/authorizers/device-authorizer/DeviceAuthorizerParams.js +2 -0
- package/dist/esm/authorizers/device-authorizer/DeviceAuthorizerParams.js.map +1 -0
- package/dist/esm/authorizers/device-authorizer/asyncLocalStorage.d.ts +16 -0
- package/dist/esm/authorizers/device-authorizer/asyncLocalStorage.js +10 -0
- package/dist/esm/authorizers/device-authorizer/asyncLocalStorage.js.map +1 -0
- package/dist/esm/authorizers/device-authorizer/index.d.ts +4 -0
- package/dist/esm/authorizers/device-authorizer/index.js +3 -0
- package/dist/esm/authorizers/device-authorizer/index.js.map +1 -0
- package/dist/esm/authorizers/federated-connections/FederatedConnectionAuthorizerBase.d.ts +30 -0
- package/dist/esm/authorizers/federated-connections/FederatedConnectionAuthorizerBase.js +154 -0
- package/dist/esm/authorizers/federated-connections/FederatedConnectionAuthorizerBase.js.map +1 -0
- package/dist/esm/authorizers/federated-connections/FederatedConnectionAuthorizerParams.d.ts +38 -0
- package/dist/esm/authorizers/federated-connections/FederatedConnectionAuthorizerParams.js +2 -0
- package/dist/esm/authorizers/federated-connections/FederatedConnectionAuthorizerParams.js.map +1 -0
- package/dist/esm/authorizers/federated-connections/asyncLocalStorage.d.ts +7 -5
- package/dist/esm/authorizers/federated-connections/asyncLocalStorage.js +3 -3
- package/dist/esm/authorizers/federated-connections/asyncLocalStorage.js.map +1 -1
- package/dist/esm/authorizers/federated-connections/index.d.ts +3 -36
- package/dist/esm/authorizers/federated-connections/index.js +2 -122
- package/dist/esm/authorizers/federated-connections/index.js.map +1 -1
- package/dist/esm/authorizers/index.d.ts +1 -12
- package/dist/esm/authorizers/index.js.map +1 -1
- package/dist/esm/authorizers/types.d.ts +37 -0
- package/dist/esm/authorizers/types.js +11 -0
- package/dist/esm/authorizers/types.js.map +1 -0
- package/dist/esm/credentials.d.ts +33 -8
- package/dist/esm/credentials.js +11 -1
- package/dist/esm/credentials.js.map +1 -1
- package/dist/esm/index.d.ts +1 -3
- package/dist/esm/index.js +0 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/interrupts/DeviceInterrupts.d.ts +55 -0
- package/dist/esm/interrupts/DeviceInterrupts.js +70 -0
- package/dist/esm/interrupts/DeviceInterrupts.js.map +1 -0
- package/dist/esm/interrupts/index.d.ts +2 -0
- package/dist/esm/interrupts/index.js +2 -0
- package/dist/esm/interrupts/index.js.map +1 -1
- package/dist/esm/stores/Store.d.ts +40 -0
- package/dist/esm/stores/Store.js +11 -0
- package/dist/esm/stores/Store.js.map +1 -0
- package/dist/esm/stores/SubStore.d.ts +31 -0
- package/dist/esm/stores/SubStore.js +48 -0
- package/dist/esm/stores/SubStore.js.map +1 -0
- package/dist/esm/stores/impl/FSStore.d.ts +19 -0
- package/dist/esm/stores/impl/FSStore.js +72 -0
- package/dist/esm/stores/impl/FSStore.js.map +1 -0
- package/dist/esm/stores/impl/MemoryStore.d.ts +8 -0
- package/dist/esm/stores/impl/MemoryStore.js +11 -0
- package/dist/esm/stores/impl/MemoryStore.js.map +1 -0
- package/dist/esm/stores/impl/TempBoxStore.d.ts +13 -0
- package/dist/esm/stores/impl/TempBoxStore.js +18 -0
- package/dist/esm/stores/impl/TempBoxStore.js.map +1 -0
- package/dist/esm/stores/index.d.ts +5 -0
- package/dist/esm/stores/index.js +4 -0
- package/dist/esm/stores/index.js.map +1 -0
- package/dist/esm/util/index.d.ts +3 -0
- package/dist/esm/util/index.js +8 -0
- package/dist/esm/util/index.js.map +1 -0
- package/package.json +20 -4
- package/dist/cjs/TokenResponse.js.map +0 -1
- package/dist/cjs/authorizers/device-authorizer.js +0 -130
- package/dist/cjs/authorizers/device-authorizer.js.map +0 -1
- package/dist/esm/TokenResponse.d.ts +0 -15
- package/dist/esm/TokenResponse.js +0 -2
- package/dist/esm/TokenResponse.js.map +0 -1
- package/dist/esm/authorizers/device-authorizer.d.ts +0 -15
- package/dist/esm/authorizers/device-authorizer.js +0 -90
- package/dist/esm/authorizers/device-authorizer.js.map +0 -1
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import Enquirer from "enquirer";
|
|
2
|
-
import * as jose from "jose";
|
|
3
|
-
import open from "open";
|
|
4
|
-
import { discovery, initiateDeviceAuthorization, pollDeviceAuthorizationGrant, } from "openid-client";
|
|
5
|
-
import { AccessDeniedError, AuthorizationRequestExpiredError } from "../errors";
|
|
6
|
-
export class DeviceAuthorizer {
|
|
7
|
-
constructor(params) {
|
|
8
|
-
this.domain = (params === null || params === void 0 ? void 0 : params.domain) || process.env.AUTH0_DOMAIN;
|
|
9
|
-
this.clientId = (params === null || params === void 0 ? void 0 : params.clientId) || process.env.AUTH0_CLIENT_ID;
|
|
10
|
-
}
|
|
11
|
-
async _authorize(params) {
|
|
12
|
-
const config = await discovery(new URL(`https://${this.domain}`), this.clientId);
|
|
13
|
-
const handle = await initiateDeviceAuthorization(config, {
|
|
14
|
-
...params,
|
|
15
|
-
});
|
|
16
|
-
const { verification_uri_complete, user_code, expires_in } = handle;
|
|
17
|
-
const enquirer = new Enquirer();
|
|
18
|
-
await enquirer.prompt({
|
|
19
|
-
type: "input",
|
|
20
|
-
name: "confirmation",
|
|
21
|
-
message: `Press Enter to open the browser to log in or press Ctrl+C to abort. You should see the following code: ${user_code}. It expires in ${expires_in % 60 === 0
|
|
22
|
-
? `${expires_in / 60} minutes`
|
|
23
|
-
: `${expires_in} seconds`}.`,
|
|
24
|
-
});
|
|
25
|
-
await open(verification_uri_complete);
|
|
26
|
-
let tokens = null;
|
|
27
|
-
try {
|
|
28
|
-
tokens = await pollDeviceAuthorizationGrant(config, handle);
|
|
29
|
-
}
|
|
30
|
-
catch (err) {
|
|
31
|
-
switch (err.error) {
|
|
32
|
-
case "access_denied":
|
|
33
|
-
throw new AccessDeniedError(err.error_description);
|
|
34
|
-
case "expired_token":
|
|
35
|
-
throw new AuthorizationRequestExpiredError("Authorization request has expired");
|
|
36
|
-
default:
|
|
37
|
-
throw new Error(`Error: ${err.error}; Description: ${err.error_description}`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
if (!tokens) {
|
|
41
|
-
throw new Error("Failed to obtain tokens");
|
|
42
|
-
}
|
|
43
|
-
const credentials = {
|
|
44
|
-
accessToken: {
|
|
45
|
-
type: tokens.token_type || "bearer",
|
|
46
|
-
value: tokens.access_token,
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
if (tokens.id_token) {
|
|
50
|
-
credentials.idToken = {
|
|
51
|
-
type: tokens.token_type || "bearer",
|
|
52
|
-
value: tokens.id_token,
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
return credentials;
|
|
56
|
-
}
|
|
57
|
-
static async authorize(options, params) {
|
|
58
|
-
const authorizer = new DeviceAuthorizer(params);
|
|
59
|
-
const credentials = await authorizer._authorize(options);
|
|
60
|
-
let claims = {};
|
|
61
|
-
if (credentials.idToken) {
|
|
62
|
-
claims = jose.decodeJwt(credentials.idToken.value);
|
|
63
|
-
}
|
|
64
|
-
return { accessToken: credentials.accessToken.value, claims };
|
|
65
|
-
}
|
|
66
|
-
static create(params) {
|
|
67
|
-
const authorizer = new DeviceAuthorizer(params);
|
|
68
|
-
return (options) => {
|
|
69
|
-
return function deviceFlow(handler, onError) {
|
|
70
|
-
return async (input, config) => {
|
|
71
|
-
try {
|
|
72
|
-
const credentials = await authorizer._authorize(options);
|
|
73
|
-
let claims = {};
|
|
74
|
-
if (credentials.idToken) {
|
|
75
|
-
claims = jose.decodeJwt(credentials.idToken.value);
|
|
76
|
-
}
|
|
77
|
-
return handler({ accessToken: credentials.accessToken.value, claims }, input, config);
|
|
78
|
-
}
|
|
79
|
-
catch (e) {
|
|
80
|
-
if (typeof onError === "function") {
|
|
81
|
-
return onError(e);
|
|
82
|
-
}
|
|
83
|
-
return "Access denied.";
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
};
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=device-authorizer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"device-authorizer.js","sourceRoot":"","sources":["../../../src/authorizers/device-authorizer.ts"],"names":[],"mappings":"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","sourcesContent":["import Enquirer from \"enquirer\";\nimport * as jose from \"jose\";\nimport open from \"open\";\nimport {\n discovery,\n initiateDeviceAuthorization,\n pollDeviceAuthorizationGrant,\n TokenEndpointResponse,\n TokenEndpointResponseHelpers,\n} from \"openid-client\";\n\nimport { Credentials } from \"../credentials\";\nimport { AccessDeniedError, AuthorizationRequestExpiredError } from \"../errors\";\nimport { AuthorizerParams, AuthParams, ToolWithAuthHandler } from \"./\";\n\nexport type DeviceAuthorizerOptions = {\n scope: string;\n audience?: string;\n};\n\nexport class DeviceAuthorizer {\n domain: string;\n clientId: string;\n\n private constructor(params?: AuthorizerParams) {\n this.domain = params?.domain || process.env.AUTH0_DOMAIN!;\n this.clientId = params?.clientId || process.env.AUTH0_CLIENT_ID!;\n }\n\n private async _authorize(\n params: DeviceAuthorizerOptions\n ): Promise<Credentials> {\n const config = await discovery(\n new URL(`https://${this.domain}`),\n this.clientId\n );\n\n const handle = await initiateDeviceAuthorization(config, {\n ...params,\n });\n\n const { verification_uri_complete, user_code, expires_in } = handle;\n\n const enquirer = new Enquirer();\n await enquirer.prompt({\n type: \"input\",\n name: \"confirmation\",\n message: `Press Enter to open the browser to log in or press Ctrl+C to abort. You should see the following code: ${user_code}. It expires in ${\n expires_in % 60 === 0\n ? `${expires_in / 60} minutes`\n : `${expires_in} seconds`\n }.`,\n });\n\n await open(verification_uri_complete!);\n\n let tokens: (TokenEndpointResponse & TokenEndpointResponseHelpers) | null =\n null;\n\n try {\n tokens = await pollDeviceAuthorizationGrant(config, handle);\n } catch (err: any) {\n switch (err.error) {\n case \"access_denied\":\n throw new AccessDeniedError(err.error_description);\n case \"expired_token\":\n throw new AuthorizationRequestExpiredError(\n \"Authorization request has expired\"\n );\n default:\n throw new Error(\n `Error: ${err.error}; Description: ${err.error_description}`\n );\n }\n }\n\n if (!tokens) {\n throw new Error(\"Failed to obtain tokens\");\n }\n\n const credentials: Credentials = {\n accessToken: {\n type: tokens.token_type || \"bearer\",\n value: tokens.access_token,\n },\n };\n\n if (tokens.id_token) {\n credentials.idToken = {\n type: tokens.token_type || \"bearer\",\n value: tokens.id_token,\n };\n }\n\n return credentials;\n }\n\n static async authorize(\n options: DeviceAuthorizerOptions,\n params?: AuthorizerParams\n ) {\n const authorizer = new DeviceAuthorizer(params);\n const credentials = await authorizer._authorize(options);\n\n let claims = {};\n\n if (credentials.idToken) {\n claims = jose.decodeJwt(credentials.idToken!.value);\n }\n\n return { accessToken: credentials.accessToken.value, claims } as AuthParams;\n }\n\n static create(params?: AuthorizerParams): DeviceFlowInstance {\n const authorizer = new DeviceAuthorizer(params);\n\n return (options: DeviceAuthorizerOptions) => {\n return function deviceFlow<I, O, C>(\n handler: ToolWithAuthHandler<I, O, C>,\n onError?: (error: Error) => Promise<O>\n ) {\n return async (input: I, config?: C): Promise<O> => {\n try {\n const credentials = await authorizer._authorize(options);\n let claims = {};\n\n if (credentials.idToken) {\n claims = jose.decodeJwt(credentials.idToken!.value);\n }\n\n return handler(\n { accessToken: credentials.accessToken.value, claims },\n input,\n config\n );\n } catch (e: any) {\n if (typeof onError === \"function\") {\n return onError(e);\n }\n\n return \"Access denied.\" as O;\n }\n };\n };\n };\n }\n}\n\nexport type DeviceFlowInstance = (\n options: DeviceAuthorizerOptions\n) => <I, O, C>(\n handler: ToolWithAuthHandler<I, O, C>,\n onError?: (error: Error) => Promise<O>\n) => (input: I, config?: C) => Promise<O>;\n"]}
|