@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.
- package/lib/bp-contracts/org.betterportal.auth.workos.json +13 -3
- package/lib/plugins/service-betterportal-auth-workos/.bp-generated/registry.js +1 -1
- package/lib/plugins/service-betterportal-auth-workos/.bp-generated/registry.js.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.d.ts +68 -3
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.js +167 -3
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/GET.js.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_renderer.bootstrap5/GET.d.ts +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_renderer.bootstrap5/GET.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_renderer.bootstrap5/_background.monitor.GET.d.ts +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_renderer.bootstrap5/_background.monitor.GET.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_renderer.bootstrap5/_nav.profile.GET.d.ts +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/_renderer.bootstrap5/_nav.profile.GET.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.d.ts +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.js +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/index.js.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.d.ts +27 -3
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.js +26 -3
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/GET.js.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.d.ts +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.js +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/index.js.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.d.ts +32 -3
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.js +147 -3
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/POST.js.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.d.ts +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.js +1 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/index.js.map +1 -1
- package/lib/schemas/service-betterportal-auth-workos.json +1 -1
- package/lib/schemas/service-betterportal-auth-workos.plugin.json +1 -1
- package/package.json +4 -4
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.d.ts +0 -62
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.d.ts.map +0 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.js +0 -165
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/login/route.impl.js.map +0 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.d.ts +0 -27
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.d.ts.map +0 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.js +0 -27
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/logout/route.impl.js.map +0 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.d.ts +0 -32
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.d.ts.map +0 -1
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.js +0 -148
- package/lib/plugins/service-betterportal-auth-workos/bp-routes/refresh/route.impl.js.map +0 -1
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import * as av from "anyvali";
|
|
2
|
-
import { createHandler } from "@betterportal/framework";
|
|
3
|
-
import { resolveWorkOSAppConfig, workOSAccessTokenDetails, WorkOSRefreshContextSchema } from "../../index.js";
|
|
4
|
-
export const HeadersSchema = av.object({
|
|
5
|
-
"x-bp-refresh": av.optional(av.string())
|
|
6
|
-
});
|
|
7
|
-
export const RequestSchema = av.object({
|
|
8
|
-
refreshToken: av.optional(av.string().minLength(1))
|
|
9
|
-
});
|
|
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
|
-
});
|
|
16
|
-
export const title = "WorkOS Refresh";
|
|
17
|
-
export const description = "Refresh BetterPortal tokens using a WorkOS-backed BP 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
|
-
function clearAuth(ctx) {
|
|
28
|
-
ctx.bpHeaders?.remove("Authorization");
|
|
29
|
-
ctx.bpHeaders?.remove("X-BP-Refresh");
|
|
30
|
-
}
|
|
31
|
-
export const handlePost = createHandler({ response: ResponseSchema, request: RequestSchema, headers: HeadersSchema }, async (ctx) => {
|
|
32
|
-
const config = resolveWorkOSAppConfig(ctx.config);
|
|
33
|
-
if (!config) {
|
|
34
|
-
ctx.setStatus?.(503);
|
|
35
|
-
return { status: "error", message: "WorkOS config is missing clientId or apiKey." };
|
|
36
|
-
}
|
|
37
|
-
const body = ctx.request;
|
|
38
|
-
const headers = ctx.headers;
|
|
39
|
-
const refreshToken = body.refreshToken ?? headers["x-bp-refresh"];
|
|
40
|
-
if (!refreshToken?.trim()) {
|
|
41
|
-
ctx.setStatus?.(401);
|
|
42
|
-
clearAuth(ctx);
|
|
43
|
-
return { status: "error", message: "Refresh token is required." };
|
|
44
|
-
}
|
|
45
|
-
const plugin = pluginFrom(ctx);
|
|
46
|
-
let claims;
|
|
47
|
-
try {
|
|
48
|
-
claims = await plugin.verifyRefreshToken({ refreshToken, tenantId: ctx.tenant.id, appId: ctx.app.id });
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
ctx.setStatus?.(401);
|
|
52
|
-
clearAuth(ctx);
|
|
53
|
-
return { status: "error", message: "Refresh token invalid or expired." };
|
|
54
|
-
}
|
|
55
|
-
let refreshContext;
|
|
56
|
-
try {
|
|
57
|
-
if (claims.authProvider !== "workos" || claims.providerSubject !== claims.sub)
|
|
58
|
-
throw new Error("Wrong auth provider");
|
|
59
|
-
refreshContext = WorkOSRefreshContextSchema.parse(claims.refreshContext);
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
ctx.setStatus?.(401);
|
|
63
|
-
clearAuth(ctx);
|
|
64
|
-
return { status: "error", message: "Refresh token belongs to a different auth provider." };
|
|
65
|
-
}
|
|
66
|
-
let state;
|
|
67
|
-
try {
|
|
68
|
-
state = await plugin.getWorkOSSessionState(config, {
|
|
69
|
-
userId: claims.sub,
|
|
70
|
-
sessionId: refreshContext.sessionId,
|
|
71
|
-
organizationId: refreshContext.organizationId
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
ctx.obs?.error(error);
|
|
76
|
-
ctx.setStatus?.(502);
|
|
77
|
-
return { status: "error", message: "WorkOS session lookup failed." };
|
|
78
|
-
}
|
|
79
|
-
if (!state.sessionActive || !state.membershipActive) {
|
|
80
|
-
ctx.setStatus?.(401);
|
|
81
|
-
clearAuth(ctx);
|
|
82
|
-
return { status: "error", message: "WorkOS session or organization membership is inactive." };
|
|
83
|
-
}
|
|
84
|
-
let workosAuth;
|
|
85
|
-
try {
|
|
86
|
-
workosAuth = await plugin.refreshWorkOSToken(config, refreshContext.providerToken, refreshContext.organizationId);
|
|
87
|
-
}
|
|
88
|
-
catch (error) {
|
|
89
|
-
ctx.obs?.error(error);
|
|
90
|
-
const status = [400, 401, 403, 404, 422].includes(error?.status) ? 401 : 502;
|
|
91
|
-
ctx.setStatus?.(status);
|
|
92
|
-
if (status === 401)
|
|
93
|
-
clearAuth(ctx);
|
|
94
|
-
return {
|
|
95
|
-
status: "error",
|
|
96
|
-
message: status === 401 ? "WorkOS refresh token invalid, expired, or revoked." : "WorkOS token refresh failed."
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
const details = workOSAccessTokenDetails(workosAuth.accessToken, config.roleClaimPath ?? "roles");
|
|
100
|
-
if (!details
|
|
101
|
-
|| workosAuth.user.id !== claims.sub
|
|
102
|
-
|| details.sessionId !== refreshContext.sessionId
|
|
103
|
-
|| (details.organizationId ?? "") !== (refreshContext.organizationId ?? "")
|
|
104
|
-
|| (workosAuth.organizationId ?? details.organizationId ?? "") !== (refreshContext.organizationId ?? "")) {
|
|
105
|
-
ctx.setStatus?.(401);
|
|
106
|
-
clearAuth(ctx);
|
|
107
|
-
return { status: "error", message: "WorkOS refreshed identity does not match the original session." };
|
|
108
|
-
}
|
|
109
|
-
const issued = plugin.issueTokenPair({
|
|
110
|
-
sub: workosAuth.user.id,
|
|
111
|
-
tenantId: ctx.tenant.id,
|
|
112
|
-
appId: ctx.app.id,
|
|
113
|
-
roles: details.roles,
|
|
114
|
-
authProvider: "workos",
|
|
115
|
-
refreshContext: {
|
|
116
|
-
providerToken: workosAuth.refreshToken,
|
|
117
|
-
sessionId: details.sessionId,
|
|
118
|
-
...(details.organizationId ? { organizationId: details.organizationId } : {})
|
|
119
|
-
},
|
|
120
|
-
providerSubject: workosAuth.user.id,
|
|
121
|
-
provider: {
|
|
122
|
-
accountId: workosAuth.user.id,
|
|
123
|
-
scope: details.organizationId ? `organization:${details.organizationId}` : undefined
|
|
124
|
-
},
|
|
125
|
-
name: workosAuth.user.name ?? undefined,
|
|
126
|
-
email: workosAuth.user.email,
|
|
127
|
-
picture: workosAuth.user.profilePictureUrl ?? undefined
|
|
128
|
-
});
|
|
129
|
-
if (!issued.refreshToken)
|
|
130
|
-
throw new Error("Auth token issuer did not return a refresh token");
|
|
131
|
-
ctx.bpHeaders?.set("Authorization", `Bearer ${issued.accessToken}`, {
|
|
132
|
-
locked: true,
|
|
133
|
-
expiresInSeconds: issued.accessTokenExpiresInSeconds,
|
|
134
|
-
refreshPath: "/refresh",
|
|
135
|
-
refreshBeforeSeconds: 60
|
|
136
|
-
});
|
|
137
|
-
ctx.bpHeaders?.set("X-BP-Refresh", issued.refreshToken, {
|
|
138
|
-
locked: true,
|
|
139
|
-
scopeToOwner: true,
|
|
140
|
-
expiresInSeconds: issued.refreshTokenExpiresInSeconds
|
|
141
|
-
});
|
|
142
|
-
return {
|
|
143
|
-
status: "ok",
|
|
144
|
-
accessToken: issued.accessToken,
|
|
145
|
-
expiresInSeconds: issued.accessTokenExpiresInSeconds
|
|
146
|
-
};
|
|
147
|
-
});
|
|
148
|
-
//# 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/refresh/route.impl.ts"],"names":[],"mappings":"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"}
|