@betterportal/auth-workos 0.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 +18 -0
- package/betterportal-logo.png +0 -0
- package/bsb-plugin.json +23 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/.bp-generated/registry.d.ts +3 -0
- package/lib/plugins/service-betterportal-auth-workos/.bp-generated/registry.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/.bp-generated/registry.js +97 -0
- package/lib/plugins/service-betterportal-auth-workos/.bp-generated/registry.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.d.ts +3 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.js +3 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/GET.d.ts +5 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/GET.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/GET.js +61 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/GET.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_background.monitor.GET.d.ts +5 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_background.monitor.GET.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_background.monitor.GET.js +5 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_background.monitor.GET.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_nav.profile.GET.d.ts +5 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_nav.profile.GET.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_nav.profile.GET.js +10 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.bootstrap1/_nav.profile.GET.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.embedded/_background.monitor.GET.d.ts +3 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.embedded/_background.monitor.GET.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.embedded/_background.monitor.GET.js +3 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_theme.embedded/_background.monitor.GET.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.d.ts +2 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.js +2 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.d.ts +60 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.js +154 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.d.ts +3 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.js +3 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.d.ts +2 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.js +2 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.d.ts +27 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.js +35 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.d.ts +3 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.js +3 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.d.ts +2 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.js +2 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.d.ts +32 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.js +78 -0
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.js.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/index.d.ts +166 -0
- package/lib/plugins/service-betterportal-auth-workos/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-auth-workos/index.js +575 -0
- package/lib/plugins/service-betterportal-auth-workos/index.js.map +1 -0
- package/lib/schemas/service-betterportal-auth-workos.json +138 -0
- package/lib/schemas/service-betterportal-auth-workos.plugin.json +151 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-workos/bp-routes/logout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as av from "anyvali";
|
|
2
|
+
import type { Infer } from "anyvali";
|
|
3
|
+
import { type ApiAuthRequirement, type CacheHints } from "@betterportal/framework";
|
|
4
|
+
export declare const QuerySchema: av.ObjectSchema<{
|
|
5
|
+
next: av.OptionalSchema<av.StringSchema>;
|
|
6
|
+
redirect: av.OptionalSchema<av.StringSchema>;
|
|
7
|
+
}>;
|
|
8
|
+
export declare const ResponseSchema: av.ObjectSchema<{
|
|
9
|
+
status: av.EnumSchema<readonly ["ok"]>;
|
|
10
|
+
message: av.StringSchema;
|
|
11
|
+
nextUrl: av.StringSchema;
|
|
12
|
+
}>;
|
|
13
|
+
export type ResponseData = Infer<typeof ResponseSchema>;
|
|
14
|
+
export declare const title = "WorkOS Logout";
|
|
15
|
+
export declare const description = "Clear the stored WorkOS bearer token.";
|
|
16
|
+
export declare const role = "auth.logout";
|
|
17
|
+
export declare const auth: ApiAuthRequirement;
|
|
18
|
+
export declare const cacheHints: CacheHints;
|
|
19
|
+
export declare const handleGet: import("@betterportal/framework").RouteHandler<Record<string, string>, {
|
|
20
|
+
next?: string | undefined;
|
|
21
|
+
redirect?: string | undefined;
|
|
22
|
+
}, Record<string, string>, Record<string, unknown>, {
|
|
23
|
+
status: "ok";
|
|
24
|
+
message: string;
|
|
25
|
+
nextUrl: string;
|
|
26
|
+
}, unknown, Record<string, unknown>>;
|
|
27
|
+
//# sourceMappingURL=route.impl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.impl.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAiB,KAAK,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAElG,eAAO,MAAM,WAAW;;;EAGI,CAAC;AAE7B,eAAO,MAAM,cAAc;;;;EAIC,CAAC;AAC7B,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAExD,eAAO,MAAM,KAAK,kBAAkB,CAAC;AACrC,eAAO,MAAM,WAAW,0CAA0C,CAAC;AACnE,eAAO,MAAM,IAAI,gBAAgB,CAAC;AAClC,eAAO,MAAM,IAAI,EAAE,kBAAyD,CAAC;AAC7E,eAAO,MAAM,UAAU,EAAE,UAA0C,CAAC;AASpE,eAAO,MAAM,SAAS;;;;;;;oCAWrB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as av from "anyvali";
|
|
2
|
+
import { createHandler } from "@betterportal/framework";
|
|
3
|
+
export const QuerySchema = av.object({
|
|
4
|
+
next: av.optional(av.string()),
|
|
5
|
+
redirect: av.optional(av.string())
|
|
6
|
+
}, { unknownKeys: "strip" });
|
|
7
|
+
export const ResponseSchema = av.object({
|
|
8
|
+
status: av.enum_(["ok"]),
|
|
9
|
+
message: av.string(),
|
|
10
|
+
nextUrl: av.string()
|
|
11
|
+
}, { unknownKeys: "strip" });
|
|
12
|
+
export const title = "WorkOS Logout";
|
|
13
|
+
export const description = "Clear the stored WorkOS bearer token.";
|
|
14
|
+
export const role = "auth.logout";
|
|
15
|
+
export const auth = { required: false, permissions: [] };
|
|
16
|
+
export const cacheHints = { ttlSeconds: 0, varyBy: [] };
|
|
17
|
+
function normalizeRedirect(raw) {
|
|
18
|
+
const redirect = raw?.trim();
|
|
19
|
+
if (!redirect)
|
|
20
|
+
return "/";
|
|
21
|
+
if (redirect.startsWith("http://") || redirect.startsWith("https://"))
|
|
22
|
+
return redirect;
|
|
23
|
+
return redirect.startsWith("/") ? redirect : `/${redirect}`;
|
|
24
|
+
}
|
|
25
|
+
export const handleGet = createHandler({ response: ResponseSchema, query: QuerySchema }, (ctx) => {
|
|
26
|
+
const query = ctx.query;
|
|
27
|
+
const nextUrl = normalizeRedirect(query.next ?? query.redirect);
|
|
28
|
+
ctx.bpHeaders?.remove("Authorization");
|
|
29
|
+
ctx.bpHeaders?.remove("X-BP-Refresh");
|
|
30
|
+
ctx.responseHeaders?.set("HX-Location", "/login?action=logout");
|
|
31
|
+
if (ctx.serviceId)
|
|
32
|
+
ctx.responseHeaders?.set("HX-Trigger", `bp:fragments:${ctx.serviceId}`);
|
|
33
|
+
return { status: "ok", message: "Signed out.", nextUrl };
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=route.impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.impl.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,aAAa,EAA4C,MAAM,yBAAyB,CAAC;AAElG,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IAC9B,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;CACnC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAE7B,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAU,CAAC;IACjC,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;IACpB,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;CACrB,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAG7B,MAAM,CAAC,MAAM,KAAK,GAAG,eAAe,CAAC;AACrC,MAAM,CAAC,MAAM,WAAW,GAAG,uCAAuC,CAAC;AACnE,MAAM,CAAC,MAAM,IAAI,GAAG,aAAa,CAAC;AAClC,MAAM,CAAC,MAAM,IAAI,GAAuB,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAC7E,MAAM,CAAC,MAAM,UAAU,GAAe,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAEpE,SAAS,iBAAiB,CAAC,GAAuB;IAChD,MAAM,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC;IAC1B,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvF,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CACpC,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,EAChD,CAAC,GAAG,EAAE,EAAE;IACN,MAAM,KAAK,GAAG,GAAG,CAAC,KAAkC,CAAC;IACrD,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChE,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IACvC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IACtC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;IAChE,IAAI,GAAG,CAAC,SAAS;QAAE,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,YAAY,EAAE,gBAAgB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3F,OAAO,EAAE,MAAM,EAAE,IAAa,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AACpE,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"POST.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"POST.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as av from "anyvali";
|
|
2
|
+
import type { Infer } from "anyvali";
|
|
3
|
+
import { type ApiAuthRequirement, type CacheHints } from "@betterportal/framework";
|
|
4
|
+
export declare const HeadersSchema: av.ObjectSchema<{
|
|
5
|
+
"x-bp-refresh": av.OptionalSchema<av.StringSchema>;
|
|
6
|
+
}>;
|
|
7
|
+
export declare const RequestSchema: av.ObjectSchema<{
|
|
8
|
+
refreshToken: av.OptionalSchema<av.StringSchema>;
|
|
9
|
+
}>;
|
|
10
|
+
export declare const ResponseSchema: av.ObjectSchema<{
|
|
11
|
+
status: av.EnumSchema<readonly ["ok", "error"]>;
|
|
12
|
+
message: av.OptionalSchema<av.StringSchema>;
|
|
13
|
+
accessToken: av.OptionalSchema<av.StringSchema>;
|
|
14
|
+
expiresInSeconds: av.OptionalSchema<av.IntSchema>;
|
|
15
|
+
}>;
|
|
16
|
+
export type ResponseData = Infer<typeof ResponseSchema>;
|
|
17
|
+
export declare const title = "WorkOS Refresh";
|
|
18
|
+
export declare const description = "Refresh BetterPortal tokens using the WorkOS refresh token.";
|
|
19
|
+
export declare const role = "auth.refresh";
|
|
20
|
+
export declare const auth: ApiAuthRequirement;
|
|
21
|
+
export declare const cacheHints: CacheHints;
|
|
22
|
+
export declare const handlePost: import("@betterportal/framework").RouteHandler<Record<string, string>, Record<string, unknown>, {
|
|
23
|
+
"x-bp-refresh"?: string | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
refreshToken?: string | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
status: "error" | "ok";
|
|
28
|
+
message?: string | undefined;
|
|
29
|
+
accessToken?: string | undefined;
|
|
30
|
+
expiresInSeconds?: number | undefined;
|
|
31
|
+
}, unknown, Record<string, unknown>>;
|
|
32
|
+
//# sourceMappingURL=route.impl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.impl.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAQjC,eAAO,MAAM,aAAa;;EAEE,CAAC;AAE7B,eAAO,MAAM,aAAa;;EAEE,CAAC;AAE7B,eAAO,MAAM,cAAc;;;;;EAKC,CAAC;AAC7B,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAExD,eAAO,MAAM,KAAK,mBAAmB,CAAC;AACtC,eAAO,MAAM,WAAW,gEAAgE,CAAC;AACzF,eAAO,MAAM,IAAI,iBAAiB,CAAC;AACnC,eAAO,MAAM,IAAI,EAAE,kBAAyD,CAAC;AAC7E,eAAO,MAAM,UAAU,EAAE,UAA0C,CAAC;AAQpE,eAAO,MAAM,UAAU;;;;;;;;;oCAyDtB,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as av from "anyvali";
|
|
2
|
+
import { createHandler } from "@betterportal/framework";
|
|
3
|
+
import { resolveWorkOSAppConfig, rolesFromWorkOSAccessToken, secondsUntilJwtExpiry } from "../../index.js";
|
|
4
|
+
export const HeadersSchema = av.object({
|
|
5
|
+
"x-bp-refresh": av.optional(av.string())
|
|
6
|
+
}, { unknownKeys: "strip" });
|
|
7
|
+
export const RequestSchema = av.object({
|
|
8
|
+
refreshToken: av.optional(av.string().minLength(1))
|
|
9
|
+
}, { unknownKeys: "strip" });
|
|
10
|
+
export const ResponseSchema = av.object({
|
|
11
|
+
status: av.enum_(["ok", "error"]),
|
|
12
|
+
message: av.optional(av.string()),
|
|
13
|
+
accessToken: av.optional(av.string()),
|
|
14
|
+
expiresInSeconds: av.optional(av.int().min(1))
|
|
15
|
+
}, { unknownKeys: "strip" });
|
|
16
|
+
export const title = "WorkOS Refresh";
|
|
17
|
+
export const description = "Refresh BetterPortal tokens using the WorkOS refresh token.";
|
|
18
|
+
export const role = "auth.refresh";
|
|
19
|
+
export const auth = { required: false, permissions: [] };
|
|
20
|
+
export const cacheHints = { ttlSeconds: 0, varyBy: [] };
|
|
21
|
+
function pluginFrom(ctx) {
|
|
22
|
+
const plugin = ctx.plugin;
|
|
23
|
+
if (!plugin)
|
|
24
|
+
throw new Error("WorkOS plugin not available on handler context");
|
|
25
|
+
return plugin;
|
|
26
|
+
}
|
|
27
|
+
export const handlePost = createHandler({ response: ResponseSchema, request: RequestSchema, headers: HeadersSchema }, async (ctx) => {
|
|
28
|
+
const config = resolveWorkOSAppConfig(ctx.config);
|
|
29
|
+
if (!config) {
|
|
30
|
+
return { status: "error", message: "WorkOS config is missing clientId or apiKey." };
|
|
31
|
+
}
|
|
32
|
+
const body = ctx.request;
|
|
33
|
+
const headers = ctx.headers;
|
|
34
|
+
const refreshToken = body.refreshToken ?? headers["x-bp-refresh"];
|
|
35
|
+
if (!refreshToken?.trim()) {
|
|
36
|
+
return { status: "error", message: "WorkOS refresh token is required." };
|
|
37
|
+
}
|
|
38
|
+
let auth;
|
|
39
|
+
try {
|
|
40
|
+
auth = await pluginFrom(ctx).refreshWorkOSToken(config, refreshToken);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
ctx.obs?.error(error);
|
|
44
|
+
return { status: "error", message: "WorkOS refresh token invalid or expired." };
|
|
45
|
+
}
|
|
46
|
+
const issued = pluginFrom(ctx).issueTokenPair({
|
|
47
|
+
sub: auth.user.id,
|
|
48
|
+
tenantId: ctx.tenant.id,
|
|
49
|
+
appId: ctx.app.id,
|
|
50
|
+
roles: rolesFromWorkOSAccessToken(auth.accessToken, config.roleClaimPath ?? "roles"),
|
|
51
|
+
authProvider: "workos",
|
|
52
|
+
providerSubject: auth.user.id,
|
|
53
|
+
provider: {
|
|
54
|
+
accountId: auth.user.id,
|
|
55
|
+
scope: auth.organizationId ? `organization:${auth.organizationId}` : undefined
|
|
56
|
+
},
|
|
57
|
+
name: auth.user.name ?? undefined,
|
|
58
|
+
email: auth.user.email,
|
|
59
|
+
picture: auth.user.profilePictureUrl ?? undefined
|
|
60
|
+
}, { includeRefreshToken: false });
|
|
61
|
+
ctx.bpHeaders?.set("Authorization", `Bearer ${issued.accessToken}`, {
|
|
62
|
+
locked: true,
|
|
63
|
+
expiresInSeconds: issued.accessTokenExpiresInSeconds,
|
|
64
|
+
refreshPath: "/refresh",
|
|
65
|
+
refreshBeforeSeconds: 60
|
|
66
|
+
});
|
|
67
|
+
ctx.bpHeaders?.set("X-BP-Refresh", auth.refreshToken, {
|
|
68
|
+
locked: true,
|
|
69
|
+
scopeToOwner: true,
|
|
70
|
+
expiresInSeconds: secondsUntilJwtExpiry(auth.accessToken)
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
status: "ok",
|
|
74
|
+
accessToken: issued.accessToken,
|
|
75
|
+
expiresInSeconds: issued.accessTokenExpiresInSeconds
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=route.impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.impl.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { type BSBServiceConstructor, type Observable } from "@bsb/base";
|
|
2
|
+
import * as av from "anyvali";
|
|
3
|
+
import { BPService, type BPServiceDefinition } from "@betterportal/plugin-bsb";
|
|
4
|
+
import { type AuthenticationResponse } from "@workos-inc/node";
|
|
5
|
+
import { type AppAuthPermissionAction, type ConfigSchemaDescriptor, type JwtClaims, type JwtVerifier, type TenantAppValidation } from "@betterportal/framework";
|
|
6
|
+
declare const PluginConfigSchema: av.ObjectSchema<{
|
|
7
|
+
host: av.StringSchema;
|
|
8
|
+
port: av.IntSchema;
|
|
9
|
+
issuer: av.StringSchema;
|
|
10
|
+
audience: av.StringSchema;
|
|
11
|
+
accessTokenSeconds: av.IntSchema;
|
|
12
|
+
refreshTokenSeconds: av.IntSchema;
|
|
13
|
+
keyStorePath: av.StringSchema;
|
|
14
|
+
betterportal: av.OptionalSchema<av.ObjectSchema<{
|
|
15
|
+
bpConfigPath: av.OptionalSchema<av.StringSchema>;
|
|
16
|
+
configApiToken: av.OptionalSchema<av.StringSchema>;
|
|
17
|
+
configEncryptionKey: av.OptionalSchema<av.StringSchema>;
|
|
18
|
+
controlPlaneUrl: av.OptionalSchema<av.StringSchema>;
|
|
19
|
+
serviceApiKey: av.OptionalSchema<av.StringSchema>;
|
|
20
|
+
bootstrapStatePath: av.StringSchema;
|
|
21
|
+
scopedConfigCachePath: av.StringSchema;
|
|
22
|
+
trustedProxyHeaders: av.BoolSchema;
|
|
23
|
+
cfProxy: av.BoolSchema;
|
|
24
|
+
trustedProxyIps: av.ArraySchema<av.StringSchema>;
|
|
25
|
+
}>>;
|
|
26
|
+
}>;
|
|
27
|
+
export type WorkOSPluginConfig = av.Infer<typeof PluginConfigSchema>;
|
|
28
|
+
declare const Config: import("@bsb/base").BSBPluginConfigClass<av.ObjectSchema<{
|
|
29
|
+
host: av.StringSchema;
|
|
30
|
+
port: av.IntSchema;
|
|
31
|
+
issuer: av.StringSchema;
|
|
32
|
+
audience: av.StringSchema;
|
|
33
|
+
accessTokenSeconds: av.IntSchema;
|
|
34
|
+
refreshTokenSeconds: av.IntSchema;
|
|
35
|
+
keyStorePath: av.StringSchema;
|
|
36
|
+
betterportal: av.OptionalSchema<av.ObjectSchema<{
|
|
37
|
+
bpConfigPath: av.OptionalSchema<av.StringSchema>;
|
|
38
|
+
configApiToken: av.OptionalSchema<av.StringSchema>;
|
|
39
|
+
configEncryptionKey: av.OptionalSchema<av.StringSchema>;
|
|
40
|
+
controlPlaneUrl: av.OptionalSchema<av.StringSchema>;
|
|
41
|
+
serviceApiKey: av.OptionalSchema<av.StringSchema>;
|
|
42
|
+
bootstrapStatePath: av.StringSchema;
|
|
43
|
+
scopedConfigCachePath: av.StringSchema;
|
|
44
|
+
trustedProxyHeaders: av.BoolSchema;
|
|
45
|
+
cfProxy: av.BoolSchema;
|
|
46
|
+
trustedProxyIps: av.ArraySchema<av.StringSchema>;
|
|
47
|
+
}>>;
|
|
48
|
+
}>>;
|
|
49
|
+
declare const EventSchemas: {
|
|
50
|
+
readonly emitEvents: {};
|
|
51
|
+
readonly onEvents: {};
|
|
52
|
+
readonly emitReturnableEvents: {};
|
|
53
|
+
readonly onReturnableEvents: {};
|
|
54
|
+
readonly emitBroadcast: {};
|
|
55
|
+
readonly onBroadcast: {};
|
|
56
|
+
};
|
|
57
|
+
export interface WorkOSAppConfig {
|
|
58
|
+
clientId: string;
|
|
59
|
+
apiKey: string;
|
|
60
|
+
provider?: string;
|
|
61
|
+
connectionId?: string;
|
|
62
|
+
organizationId?: string;
|
|
63
|
+
domainHint?: string;
|
|
64
|
+
scopes?: string;
|
|
65
|
+
loginRedirectPath?: string;
|
|
66
|
+
logoutRedirectPath?: string;
|
|
67
|
+
roleClaimPath?: string;
|
|
68
|
+
webhookSecret?: string;
|
|
69
|
+
}
|
|
70
|
+
export type WorkOSBrowserConfig = Omit<WorkOSAppConfig, "apiKey">;
|
|
71
|
+
export declare function resolveWorkOSAppConfig(raw: Record<string, unknown> | undefined): WorkOSAppConfig | null;
|
|
72
|
+
export declare function resolveWorkOSBrowserConfig(raw: Record<string, unknown> | undefined): WorkOSBrowserConfig | null;
|
|
73
|
+
export declare const WorkOSConfigSchemas: ConfigSchemaDescriptor[];
|
|
74
|
+
export declare class Plugin extends BPService<InstanceType<typeof Config>, typeof EventSchemas> {
|
|
75
|
+
static Config: import("@bsb/base").BSBPluginConfigClass<av.ObjectSchema<{
|
|
76
|
+
host: av.StringSchema;
|
|
77
|
+
port: av.IntSchema;
|
|
78
|
+
issuer: av.StringSchema;
|
|
79
|
+
audience: av.StringSchema;
|
|
80
|
+
accessTokenSeconds: av.IntSchema;
|
|
81
|
+
refreshTokenSeconds: av.IntSchema;
|
|
82
|
+
keyStorePath: av.StringSchema;
|
|
83
|
+
betterportal: av.OptionalSchema<av.ObjectSchema<{
|
|
84
|
+
bpConfigPath: av.OptionalSchema<av.StringSchema>;
|
|
85
|
+
configApiToken: av.OptionalSchema<av.StringSchema>;
|
|
86
|
+
configEncryptionKey: av.OptionalSchema<av.StringSchema>;
|
|
87
|
+
controlPlaneUrl: av.OptionalSchema<av.StringSchema>;
|
|
88
|
+
serviceApiKey: av.OptionalSchema<av.StringSchema>;
|
|
89
|
+
bootstrapStatePath: av.StringSchema;
|
|
90
|
+
scopedConfigCachePath: av.StringSchema;
|
|
91
|
+
trustedProxyHeaders: av.BoolSchema;
|
|
92
|
+
cfProxy: av.BoolSchema;
|
|
93
|
+
trustedProxyIps: av.ArraySchema<av.StringSchema>;
|
|
94
|
+
}>>;
|
|
95
|
+
}>>;
|
|
96
|
+
static EventSchemas: {
|
|
97
|
+
readonly emitEvents: {};
|
|
98
|
+
readonly onEvents: {};
|
|
99
|
+
readonly emitReturnableEvents: {};
|
|
100
|
+
readonly onReturnableEvents: {};
|
|
101
|
+
readonly emitBroadcast: {};
|
|
102
|
+
readonly onBroadcast: {};
|
|
103
|
+
};
|
|
104
|
+
private keyPair;
|
|
105
|
+
constructor(cfg: BSBServiceConstructor<InstanceType<typeof Config>, typeof EventSchemas>);
|
|
106
|
+
init(obs: Observable): Promise<void>;
|
|
107
|
+
protected definition(): BPServiceDefinition;
|
|
108
|
+
protected onRegistered(): void;
|
|
109
|
+
protected getJwtVerifier(tenantId: string, appId: string): JwtVerifier | undefined;
|
|
110
|
+
protected validateTenantApp(tenantId: string, appId: string): Promise<TenantAppValidation>;
|
|
111
|
+
getWorkOSAppConfig(tenantId: string, appId: string): WorkOSAppConfig | null;
|
|
112
|
+
getAuthorizationUrl(config: WorkOSAppConfig, input: {
|
|
113
|
+
redirectUri: string;
|
|
114
|
+
state: string;
|
|
115
|
+
}): string;
|
|
116
|
+
authenticateWithCode(config: WorkOSAppConfig, code: string): Promise<AuthenticationResponse>;
|
|
117
|
+
refreshWorkOSToken(config: WorkOSAppConfig, refreshToken: string): Promise<AuthenticationResponse>;
|
|
118
|
+
syncPermissionsToWorkOS(tenantId: string, appId: string): Promise<{
|
|
119
|
+
created: number;
|
|
120
|
+
updated: number;
|
|
121
|
+
deleted: number;
|
|
122
|
+
deprecated: number;
|
|
123
|
+
current: number;
|
|
124
|
+
}>;
|
|
125
|
+
syncRolesFromWorkOS(tenantId: string, appId: string): Promise<{
|
|
126
|
+
roles: number;
|
|
127
|
+
grants: number;
|
|
128
|
+
}>;
|
|
129
|
+
issueTokenPair(input: {
|
|
130
|
+
sub: string;
|
|
131
|
+
tenantId: string;
|
|
132
|
+
appId: string;
|
|
133
|
+
roles: string[];
|
|
134
|
+
authProvider: string;
|
|
135
|
+
providerSubject: string;
|
|
136
|
+
provider?: JwtClaims["provider"];
|
|
137
|
+
name?: string;
|
|
138
|
+
email?: string;
|
|
139
|
+
picture?: string;
|
|
140
|
+
}, options?: {
|
|
141
|
+
includeRefreshToken?: boolean;
|
|
142
|
+
}): import("@betterportal/framework").BpIssuedTokenPair;
|
|
143
|
+
private getWorkOSRawConfig;
|
|
144
|
+
private workosConfigReadTicket;
|
|
145
|
+
private client;
|
|
146
|
+
private listWorkOSRoles;
|
|
147
|
+
private bpPermissionCatalog;
|
|
148
|
+
private toBpRole;
|
|
149
|
+
private pushRolesToConfigManager;
|
|
150
|
+
private matchingConfiguredApps;
|
|
151
|
+
private renderRoleSyncFragment;
|
|
152
|
+
private handlePermissionSync;
|
|
153
|
+
private handleRoleSync;
|
|
154
|
+
private handleWorkOSWebhook;
|
|
155
|
+
private tokenIssuer;
|
|
156
|
+
}
|
|
157
|
+
export { Config, EventSchemas };
|
|
158
|
+
export declare function rolesFromWorkOSAccessToken(token: string, roleClaimPath?: string): string[];
|
|
159
|
+
export declare function secondsUntilJwtExpiry(token: string): number | undefined;
|
|
160
|
+
export declare function bpPermissionSlug(serviceId: string, viewId: string, action: AppAuthPermissionAction): string;
|
|
161
|
+
export declare function parseBpPermissionSlug(slug: string): {
|
|
162
|
+
serviceId: string;
|
|
163
|
+
viewId: string;
|
|
164
|
+
action: AppAuthPermissionAction;
|
|
165
|
+
} | null;
|
|
166
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-auth-workos/index.ts"],"names":[],"mappings":"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"}
|