@betterportal/auth-workos 10.1.64 → 10.1.65

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.
Files changed (48) hide show
  1. package/lib/bp-contracts/org.betterportal.auth.workos.json +13 -3
  2. package/lib/plugins/service-betterportal-auth-workos/.bp-generated/registry.js +1 -1
  3. package/lib/plugins/service-betterportal-auth-workos/.bp-generated/registry.js.map +1 -1
  4. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.d.ts +68 -3
  5. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.d.ts.map +1 -1
  6. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.js +167 -3
  7. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.js.map +1 -1
  8. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_renderer.bootstrap5/GET.d.ts +1 -1
  9. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_renderer.bootstrap5/GET.d.ts.map +1 -1
  10. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_renderer.bootstrap5/_background.monitor.GET.d.ts +1 -1
  11. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_renderer.bootstrap5/_background.monitor.GET.d.ts.map +1 -1
  12. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_renderer.bootstrap5/_nav.profile.GET.d.ts +1 -1
  13. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_renderer.bootstrap5/_nav.profile.GET.d.ts.map +1 -1
  14. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.d.ts +1 -1
  15. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.d.ts.map +1 -1
  16. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.js +1 -1
  17. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.js.map +1 -1
  18. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.d.ts +27 -3
  19. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.d.ts.map +1 -1
  20. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.js +26 -3
  21. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.js.map +1 -1
  22. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.d.ts +1 -1
  23. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.d.ts.map +1 -1
  24. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.js +1 -1
  25. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.js.map +1 -1
  26. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.d.ts +32 -3
  27. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.d.ts.map +1 -1
  28. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.js +147 -3
  29. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.js.map +1 -1
  30. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.d.ts +1 -1
  31. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.d.ts.map +1 -1
  32. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.js +1 -1
  33. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.js.map +1 -1
  34. package/lib/schemas/service-betterportal-auth-workos.json +1 -1
  35. package/lib/schemas/service-betterportal-auth-workos.plugin.json +1 -1
  36. package/package.json +4 -4
  37. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.d.ts +0 -62
  38. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.d.ts.map +0 -1
  39. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.js +0 -165
  40. package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.js.map +0 -1
  41. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.d.ts +0 -27
  42. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.d.ts.map +0 -1
  43. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.js +0 -27
  44. package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.js.map +0 -1
  45. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.d.ts +0 -32
  46. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.d.ts.map +0 -1
  47. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.js +0 -148
  48. package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.js.map +0 -1
@@ -1,5 +1,149 @@
1
1
  export const operationId = "auth.refresh";
2
- export { title, description, auth, role, cacheHints } from "./route.impl.js";
3
- export { ResponseSchema, RequestSchema, HeadersSchema } from "./route.impl.js";
4
- export { handlePost as default } from "./route.impl.js";
2
+ import * as av from "anyvali";
3
+ import { createHandler } from "@betterportal/framework";
4
+ import { resolveWorkOSAppConfig, workOSAccessTokenDetails, WorkOSRefreshContextSchema } from "../../index.js";
5
+ export const HeadersSchema = av.object({
6
+ "x-bp-refresh": av.optional(av.string())
7
+ });
8
+ export const RequestSchema = av.object({
9
+ refreshToken: av.optional(av.string().minLength(1))
10
+ });
11
+ export const ResponseSchema = av.object({
12
+ status: av.enum_(["ok", "error"]),
13
+ message: av.optional(av.string()),
14
+ accessToken: av.optional(av.string()),
15
+ expiresInSeconds: av.optional(av.int().min(1))
16
+ });
17
+ export const title = "WorkOS Refresh";
18
+ export const description = "Refresh BetterPortal tokens using a WorkOS-backed BP refresh token.";
19
+ export const role = "auth.refresh";
20
+ export const auth = { required: false, permissions: [] };
21
+ export const cacheHints = { ttlSeconds: 0, varyBy: [] };
22
+ function pluginFrom(ctx) {
23
+ const plugin = ctx.plugin;
24
+ if (!plugin)
25
+ throw new Error("WorkOS plugin not available on handler context");
26
+ return plugin;
27
+ }
28
+ function clearAuth(ctx) {
29
+ ctx.bpHeaders?.remove("Authorization");
30
+ ctx.bpHeaders?.remove("X-BP-Refresh");
31
+ }
32
+ export default createHandler({ response: ResponseSchema, request: RequestSchema, headers: HeadersSchema }, async (ctx) => {
33
+ const config = resolveWorkOSAppConfig(ctx.config);
34
+ if (!config) {
35
+ ctx.setStatus?.(503);
36
+ return { status: "error", message: "WorkOS config is missing clientId or apiKey." };
37
+ }
38
+ const body = ctx.request;
39
+ const headers = ctx.headers;
40
+ const refreshToken = body.refreshToken ?? headers["x-bp-refresh"];
41
+ if (!refreshToken?.trim()) {
42
+ ctx.setStatus?.(401);
43
+ clearAuth(ctx);
44
+ return { status: "error", message: "Refresh token is required." };
45
+ }
46
+ const plugin = pluginFrom(ctx);
47
+ let claims;
48
+ try {
49
+ claims = await plugin.verifyRefreshToken({ refreshToken, tenantId: ctx.tenant.id, appId: ctx.app.id });
50
+ }
51
+ catch {
52
+ ctx.setStatus?.(401);
53
+ clearAuth(ctx);
54
+ return { status: "error", message: "Refresh token invalid or expired." };
55
+ }
56
+ let refreshContext;
57
+ try {
58
+ if (claims.authProvider !== "workos" || claims.providerSubject !== claims.sub)
59
+ throw new Error("Wrong auth provider");
60
+ refreshContext = WorkOSRefreshContextSchema.parse(claims.refreshContext);
61
+ }
62
+ catch {
63
+ ctx.setStatus?.(401);
64
+ clearAuth(ctx);
65
+ return { status: "error", message: "Refresh token belongs to a different auth provider." };
66
+ }
67
+ let state;
68
+ try {
69
+ state = await plugin.getWorkOSSessionState(config, {
70
+ userId: claims.sub,
71
+ sessionId: refreshContext.sessionId,
72
+ organizationId: refreshContext.organizationId
73
+ });
74
+ }
75
+ catch (error) {
76
+ ctx.obs?.error(error);
77
+ ctx.setStatus?.(502);
78
+ return { status: "error", message: "WorkOS session lookup failed." };
79
+ }
80
+ if (!state.sessionActive || !state.membershipActive) {
81
+ ctx.setStatus?.(401);
82
+ clearAuth(ctx);
83
+ return { status: "error", message: "WorkOS session or organization membership is inactive." };
84
+ }
85
+ let workosAuth;
86
+ try {
87
+ workosAuth = await plugin.refreshWorkOSToken(config, refreshContext.providerToken, refreshContext.organizationId);
88
+ }
89
+ catch (error) {
90
+ ctx.obs?.error(error);
91
+ const status = [400, 401, 403, 404, 422].includes(error?.status) ? 401 : 502;
92
+ ctx.setStatus?.(status);
93
+ if (status === 401)
94
+ clearAuth(ctx);
95
+ return {
96
+ status: "error",
97
+ message: status === 401 ? "WorkOS refresh token invalid, expired, or revoked." : "WorkOS token refresh failed."
98
+ };
99
+ }
100
+ const details = workOSAccessTokenDetails(workosAuth.accessToken, config.roleClaimPath ?? "roles");
101
+ if (!details
102
+ || workosAuth.user.id !== claims.sub
103
+ || details.sessionId !== refreshContext.sessionId
104
+ || (details.organizationId ?? "") !== (refreshContext.organizationId ?? "")
105
+ || (workosAuth.organizationId ?? details.organizationId ?? "") !== (refreshContext.organizationId ?? "")) {
106
+ ctx.setStatus?.(401);
107
+ clearAuth(ctx);
108
+ return { status: "error", message: "WorkOS refreshed identity does not match the original session." };
109
+ }
110
+ const issued = plugin.issueTokenPair({
111
+ sub: workosAuth.user.id,
112
+ tenantId: ctx.tenant.id,
113
+ appId: ctx.app.id,
114
+ roles: details.roles,
115
+ authProvider: "workos",
116
+ refreshContext: {
117
+ providerToken: workosAuth.refreshToken,
118
+ sessionId: details.sessionId,
119
+ ...(details.organizationId ? { organizationId: details.organizationId } : {})
120
+ },
121
+ providerSubject: workosAuth.user.id,
122
+ provider: {
123
+ accountId: workosAuth.user.id,
124
+ scope: details.organizationId ? `organization:${details.organizationId}` : undefined
125
+ },
126
+ name: workosAuth.user.name ?? undefined,
127
+ email: workosAuth.user.email,
128
+ picture: workosAuth.user.profilePictureUrl ?? undefined
129
+ });
130
+ if (!issued.refreshToken)
131
+ throw new Error("Auth token issuer did not return a refresh token");
132
+ ctx.bpHeaders?.set("Authorization", `Bearer ${issued.accessToken}`, {
133
+ locked: true,
134
+ expiresInSeconds: issued.accessTokenExpiresInSeconds,
135
+ refreshPath: "/refresh",
136
+ refreshBeforeSeconds: 60
137
+ });
138
+ ctx.bpHeaders?.set("X-BP-Refresh", issued.refreshToken, {
139
+ locked: true,
140
+ scopeToOwner: true,
141
+ expiresInSeconds: issued.refreshTokenExpiresInSeconds
142
+ });
143
+ return {
144
+ status: "ok",
145
+ accessToken: issued.accessToken,
146
+ expiresInSeconds: issued.accessTokenExpiresInSeconds
147
+ };
148
+ });
5
149
  //# sourceMappingURL=POST.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"POST.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"POST.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { title, description } from "./route.impl.js";
1
+ export { title, description } from "./POST.js";
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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,MAAM,iBAAiB,CAAC"}
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,MAAM,WAAW,CAAC"}
@@ -1,2 +1,2 @@
1
- export { title, description } from "./route.impl.js";
1
+ export { title, description } from "./POST.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +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,MAAM,iBAAiB,CAAC"}
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,MAAM,WAAW,CAAC"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "pluginName": "org.betterportal.auth.workos",
3
3
  "events": {},
4
- "version": "10.1.64",
4
+ "version": "10.1.65",
5
5
  "configSchema": {
6
6
  "anyvaliVersion": "1.0",
7
7
  "schemaVersion": "1.1",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "service-betterportal-auth-workos",
3
3
  "name": "org.betterportal.auth.workos",
4
- "version": "10.1.64",
4
+ "version": "10.1.65",
5
5
  "description": "BetterPortal WorkOS auth service",
6
6
  "category": "service",
7
7
  "tags": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@betterportal/auth-workos",
3
- "version": "10.1.64",
3
+ "version": "10.1.65",
4
4
  "description": "BetterPortal WorkOS auth service for Node.js",
5
5
  "main": "lib/index.js",
6
6
  "types": "src/index.ts",
@@ -33,9 +33,9 @@
33
33
  "typescript": "^6.0.3"
34
34
  },
35
35
  "dependencies": {
36
- "@betterportal/framework": "10.1.64",
37
- "@betterportal/plugin-bsb": "10.1.64",
38
- "@bsb/base": "^9.6.61",
36
+ "@betterportal/framework": "10.1.65",
37
+ "@betterportal/plugin-bsb": "10.1.65",
38
+ "@bsb/base": "^9.6.66",
39
39
  "@workos-inc/node": "^10.7.0",
40
40
  "anyvali": "^1.0.6",
41
41
  "jsonwebtoken": "^9.0.2",
@@ -1,62 +0,0 @@
1
- import * as av from "anyvali";
2
- import type { Infer } from "anyvali";
3
- import { type ApiAuthRequirement, type BetterPortalRouteChrome, type CacheHints } from "@betterportal/framework";
4
- export declare const QuerySchema: av.ObjectSchema<{
5
- action: av.OptionalSchema<av.StringSchema>;
6
- code: av.OptionalSchema<av.StringSchema>;
7
- state: av.OptionalSchema<av.StringSchema>;
8
- next: av.OptionalSchema<av.StringSchema>;
9
- redirect: av.OptionalSchema<av.StringSchema>;
10
- error: av.OptionalSchema<av.StringSchema>;
11
- error_description: av.OptionalSchema<av.StringSchema>;
12
- }>;
13
- export declare const HeadersSchema: av.ObjectSchema<{}>;
14
- export declare const ResponseSchema: av.ObjectSchema<{
15
- status: av.EnumSchema<readonly ["ok", "error"]>;
16
- message: av.OptionalSchema<av.StringSchema>;
17
- authorizationUrl: av.OptionalSchema<av.StringSchema>;
18
- loginUI: av.EnumSchema<readonly ["default", "clean", "redirect"]>;
19
- alreadyLoggedIn: av.OptionalSchema<av.BoolSchema>;
20
- loggedOut: av.OptionalSchema<av.BoolSchema>;
21
- signedIn: av.OptionalSchema<av.BoolSchema>;
22
- nextUrl: av.OptionalSchema<av.StringSchema>;
23
- user: av.OptionalSchema<av.ObjectSchema<{
24
- id: av.OptionalSchema<av.StringSchema>;
25
- name: av.OptionalSchema<av.StringSchema>;
26
- email: av.OptionalSchema<av.StringSchema>;
27
- picture: av.OptionalSchema<av.StringSchema>;
28
- }>>;
29
- }>;
30
- export type ResponseData = Infer<typeof ResponseSchema>;
31
- export declare const title = "WorkOS Login";
32
- export declare const description = "Authenticate with WorkOS AuthKit and store BetterPortal auth headers.";
33
- export declare const role = "auth.login";
34
- export declare const dependencies: string[];
35
- export declare const chrome: BetterPortalRouteChrome;
36
- export declare const auth: ApiAuthRequirement;
37
- export declare const cacheHints: CacheHints;
38
- export declare const handleGet: import("@betterportal/framework").RouteHandler<Record<string, string>, {
39
- action?: string | undefined;
40
- code?: string | undefined;
41
- state?: string | undefined;
42
- next?: string | undefined;
43
- redirect?: string | undefined;
44
- error?: string | undefined;
45
- error_description?: string | undefined;
46
- }, {}, Record<string, unknown>, {
47
- status: "error" | "ok";
48
- loginUI: "redirect" | "default" | "clean";
49
- message?: string | undefined;
50
- authorizationUrl?: string | undefined;
51
- alreadyLoggedIn?: boolean | undefined;
52
- loggedOut?: boolean | undefined;
53
- signedIn?: boolean | undefined;
54
- nextUrl?: string | undefined;
55
- user?: {
56
- id?: string | undefined;
57
- name?: string | undefined;
58
- email?: string | undefined;
59
- picture?: string | undefined;
60
- } | undefined;
61
- }, unknown, Record<string, unknown>>;
62
- //# sourceMappingURL=route.impl.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"route.impl.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAOjC,eAAO,MAAM,WAAW;;;;;;;;EAQtB,CAAC;AAEH,eAAO,MAAM,aAAa,qBAAgB,CAAC;AAE3C,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;EAezB,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAExD,eAAO,MAAM,KAAK,iBAAiB,CAAC;AACpC,eAAO,MAAM,WAAW,0EAA0E,CAAC;AACnG,eAAO,MAAM,IAAI,eAAe,CAAC;AACjC,eAAO,MAAM,YAAY,UAAkC,CAAC;AAC5D,eAAO,MAAM,MAAM,EAAE,uBAA8C,CAAC;AACpE,eAAO,MAAM,IAAI,EAAE,kBAAyD,CAAC;AAC7E,eAAO,MAAM,UAAU,EAAE,UAA0C,CAAC;AAYpE,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;oCA2HrB,CAAC"}
@@ -1,165 +0,0 @@
1
- import * as av from "anyvali";
2
- import { createHandler, resolveAppAuthRedirect } from "@betterportal/framework";
3
- import { resolveWorkOSAppConfig, workOSAccessTokenDetails } from "../../index.js";
4
- export const QuerySchema = av.object({
5
- action: av.optional(av.string()),
6
- code: av.optional(av.string()),
7
- state: av.optional(av.string()),
8
- next: av.optional(av.string()),
9
- redirect: av.optional(av.string()),
10
- error: av.optional(av.string()),
11
- error_description: av.optional(av.string())
12
- });
13
- export const HeadersSchema = av.object({});
14
- export const ResponseSchema = av.object({
15
- status: av.enum_(["ok", "error"]),
16
- message: av.optional(av.string()),
17
- authorizationUrl: av.optional(av.string()),
18
- loginUI: av.enum_(["default", "clean", "redirect"]).default("default"),
19
- alreadyLoggedIn: av.optional(av.bool()),
20
- loggedOut: av.optional(av.bool()),
21
- signedIn: av.optional(av.bool()),
22
- nextUrl: av.optional(av.string()),
23
- user: av.optional(av.object({
24
- id: av.optional(av.string()),
25
- name: av.optional(av.string()),
26
- email: av.optional(av.string()),
27
- picture: av.optional(av.string())
28
- }))
29
- });
30
- export const title = "WorkOS Login";
31
- export const description = "Authenticate with WorkOS AuthKit and store BetterPortal auth headers.";
32
- export const role = "auth.login";
33
- export const dependencies = ["auth.logout", "auth.refresh"];
34
- export const chrome = { fullScreen: true };
35
- export const auth = { required: false, permissions: [] };
36
- export const cacheHints = { ttlSeconds: 0, varyBy: [] };
37
- function pluginFrom(ctx) {
38
- const plugin = ctx.plugin;
39
- if (!plugin)
40
- throw new Error("WorkOS plugin not available on handler context");
41
- return plugin;
42
- }
43
- function firstString(...values) {
44
- return values.find((value) => typeof value === "string" && value.trim().length > 0)?.trim();
45
- }
46
- export const handleGet = createHandler({ response: ResponseSchema, query: QuerySchema, headers: HeadersSchema }, async (ctx) => {
47
- const query = ctx.query;
48
- const config = resolveWorkOSAppConfig(ctx.config);
49
- const nextUrl = resolveAppAuthRedirect(ctx, "afterLogin", query.state ?? query.next ?? query.redirect);
50
- if (query.action === "logout") {
51
- ctx.bpHeaders?.remove("Authorization");
52
- ctx.bpHeaders?.remove("X-BP-Refresh");
53
- if (ctx.serviceId)
54
- ctx.responseHeaders?.set("HX-Trigger", `bp:fragments:${ctx.serviceId}`);
55
- return {
56
- status: "ok",
57
- message: "Signed out.",
58
- loginUI: config?.loginUI ?? "default",
59
- loggedOut: true,
60
- nextUrl: resolveAppAuthRedirect(ctx, "afterLogout")
61
- };
62
- }
63
- if (!config) {
64
- return { status: "error", message: "WorkOS config is missing clientId or apiKey.", loginUI: "default", nextUrl };
65
- }
66
- if (query.error) {
67
- return {
68
- status: "error",
69
- message: query.error_description || query.error,
70
- loginUI: config.loginUI ?? "default",
71
- nextUrl
72
- };
73
- }
74
- if (query.code) {
75
- try {
76
- const auth = await pluginFrom(ctx).authenticateWithCode(config, query.code);
77
- const details = workOSAccessTokenDetails(auth.accessToken, config.roleClaimPath ?? "roles");
78
- if (!details)
79
- throw new Error("WorkOS access token is missing its session id.");
80
- if (auth.organizationId && details.organizationId && auth.organizationId !== details.organizationId) {
81
- throw new Error("WorkOS organization does not match the access token.");
82
- }
83
- const organizationId = auth.organizationId ?? details.organizationId;
84
- const issued = pluginFrom(ctx).issueTokenPair({
85
- sub: auth.user.id,
86
- tenantId: ctx.tenant.id,
87
- appId: ctx.app.id,
88
- roles: details.roles,
89
- authProvider: "workos",
90
- refreshContext: {
91
- providerToken: auth.refreshToken,
92
- sessionId: details.sessionId,
93
- ...(organizationId ? { organizationId } : {})
94
- },
95
- providerSubject: auth.user.id,
96
- provider: {
97
- accountId: auth.user.id,
98
- scope: organizationId ? `organization:${organizationId}` : undefined
99
- },
100
- name: firstString(auth.user.name, [auth.user.firstName, auth.user.lastName].filter(Boolean).join(" ")),
101
- email: auth.user.email,
102
- picture: auth.user.profilePictureUrl ?? undefined
103
- });
104
- if (!issued.refreshToken)
105
- throw new Error("Auth token issuer did not return a refresh token");
106
- ctx.bpHeaders?.set("Authorization", `Bearer ${issued.accessToken}`, {
107
- locked: true,
108
- expiresInSeconds: issued.accessTokenExpiresInSeconds,
109
- refreshPath: "/refresh",
110
- refreshBeforeSeconds: 60
111
- });
112
- ctx.bpHeaders?.set("X-BP-Refresh", issued.refreshToken, {
113
- locked: true,
114
- scopeToOwner: true,
115
- expiresInSeconds: issued.refreshTokenExpiresInSeconds
116
- });
117
- ctx.responseHeaders?.set("HX-Redirect", nextUrl);
118
- if (ctx.serviceId)
119
- ctx.responseHeaders?.set("HX-Trigger", `bp:fragments:${ctx.serviceId}`);
120
- return {
121
- status: "ok",
122
- message: "Signed in.",
123
- loginUI: config.loginUI ?? "default",
124
- signedIn: true,
125
- nextUrl,
126
- user: {
127
- id: auth.user.id,
128
- name: firstString(auth.user.name, [auth.user.firstName, auth.user.lastName].filter(Boolean).join(" ")),
129
- email: auth.user.email,
130
- picture: auth.user.profilePictureUrl ?? undefined
131
- }
132
- };
133
- }
134
- catch (error) {
135
- ctx.obs?.error(error);
136
- return { status: "error", message: `WorkOS sign in failed: ${error.message}`, loginUI: config.loginUI ?? "default", nextUrl };
137
- }
138
- }
139
- if (ctx.user) {
140
- return {
141
- status: "ok",
142
- message: "Already signed in.",
143
- loginUI: config.loginUI ?? "default",
144
- alreadyLoggedIn: true,
145
- nextUrl,
146
- user: {
147
- id: ctx.user.sub,
148
- name: ctx.user.name,
149
- email: ctx.user.email,
150
- picture: ctx.user.picture
151
- }
152
- };
153
- }
154
- const redirectUri = ctx.uiRouteUrl?.("login.index", { absolute: true }) ??
155
- ctx.routeUrl?.("login.index", { absolute: true }) ??
156
- "/login";
157
- return {
158
- status: "ok",
159
- message: "Continue to WorkOS.",
160
- loginUI: config.loginUI ?? "default",
161
- authorizationUrl: pluginFrom(ctx).getAuthorizationUrl(config, { redirectUri, state: nextUrl }),
162
- nextUrl
163
- };
164
- });
165
- //# sourceMappingURL=route.impl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"route.impl.js","sourceRoot":"","sources":["../../../../../src/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
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
@@ -1 +0,0 @@
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,EAAyC,KAAK,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1H,eAAO,MAAM,WAAW;;;EAGtB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;EAIzB,CAAC;AACH,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;AAEpE,eAAO,MAAM,SAAS;;;;;;;oCAWrB,CAAC"}
@@ -1,27 +0,0 @@
1
- import * as av from "anyvali";
2
- import { createHandler, resolveAppAuthRedirect } from "@betterportal/framework";
3
- export const QuerySchema = av.object({
4
- next: av.optional(av.string()),
5
- redirect: av.optional(av.string())
6
- });
7
- export const ResponseSchema = av.object({
8
- status: av.enum_(["ok"]),
9
- message: av.string(),
10
- nextUrl: av.string()
11
- });
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
- export const handleGet = createHandler({ response: ResponseSchema, query: QuerySchema }, (ctx) => {
18
- const query = ctx.query;
19
- const nextUrl = resolveAppAuthRedirect(ctx, "afterLogout", query.next ?? query.redirect);
20
- ctx.bpHeaders?.remove("Authorization");
21
- ctx.bpHeaders?.remove("X-BP-Refresh");
22
- ctx.responseHeaders?.set("HX-Location", "/login?action=logout");
23
- if (ctx.serviceId)
24
- ctx.responseHeaders?.set("HX-Trigger", `bp:fragments:${ctx.serviceId}`);
25
- return { status: "ok", message: "Signed out.", nextUrl };
26
- });
27
- //# sourceMappingURL=route.impl.js.map
@@ -1 +0,0 @@
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,EAAE,sBAAsB,EAA4C,MAAM,yBAAyB,CAAC;AAE1H,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,CAAC,CAAC;AAEH,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,CAAC,CAAC;AAGH,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,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,sBAAsB,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IACzF,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"}
@@ -1,32 +0,0 @@
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 a WorkOS-backed BP 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
@@ -1 +0,0 @@
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;;EAExB,CAAC;AAEH,eAAO,MAAM,aAAa;;EAExB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;EAKzB,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAExD,eAAO,MAAM,KAAK,mBAAmB,CAAC;AACtC,eAAO,MAAM,WAAW,wEAAwE,CAAC;AACjG,eAAO,MAAM,IAAI,iBAAiB,CAAC;AACnC,eAAO,MAAM,IAAI,EAAE,kBAAyD,CAAC;AAC7E,eAAO,MAAM,UAAU,EAAE,UAA0C,CAAC;AAapE,eAAO,MAAM,UAAU;;;;;;;;;oCAyHtB,CAAC"}