@growth-labs/auth 0.11.0 → 0.13.0
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/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +67 -3
- package/dist/middleware/auth.js.map +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/client-secret-header.d.ts +2 -0
- package/dist/utils/client-secret-header.d.ts.map +1 -0
- package/dist/utils/client-secret-header.js +8 -0
- package/dist/utils/client-secret-header.js.map +1 -0
- package/dist/utils/client-secret.d.ts +1 -1
- package/dist/utils/client-secret.d.ts.map +1 -1
- package/dist/utils/client-secret.js +1 -7
- package/dist/utils/client-secret.js.map +1 -1
- package/dist/utils/cookies.d.ts.map +1 -1
- package/dist/utils/cookies.js +8 -1
- package/dist/utils/cookies.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/tokens.d.ts +28 -1
- package/dist/utils/tokens.d.ts.map +1 -1
- package/dist/utils/tokens.js +78 -8
- package/dist/utils/tokens.js.map +1 -1
- package/dist/workers.d.ts +89 -0
- package/dist/workers.d.ts.map +1 -0
- package/dist/workers.js +516 -0
- package/dist/workers.js.map +1 -0
- package/package.json +24 -5
- package/src/middleware/auth.ts +74 -4
- package/src/types.ts +13 -0
- package/src/utils/client-secret-header.ts +8 -0
- package/src/utils/client-secret.ts +1 -9
- package/src/utils/cookies.ts +6 -1
- package/src/utils/index.ts +1 -1
- package/src/utils/tokens.ts +121 -7
- package/src/workers.ts +758 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
2
|
+
export type ClientSecretValue = Uint8Array | string;
|
|
3
|
+
export type ClientSecretResolver = (request: Request) => MaybePromise<ClientSecretValue>;
|
|
4
|
+
export interface ClientSecretStore {
|
|
5
|
+
get(): MaybePromise<ClientSecretValue | string>;
|
|
6
|
+
}
|
|
7
|
+
export interface ClientSecretResolverSource {
|
|
8
|
+
resolve(request: Request): MaybePromise<ClientSecretValue>;
|
|
9
|
+
}
|
|
10
|
+
export type WorkersClientSecret = Uint8Array | ClientSecretResolver | ClientSecretResolverSource | ClientSecretStore;
|
|
11
|
+
export interface WorkersAuthConfig {
|
|
12
|
+
issuer: string;
|
|
13
|
+
issuerInternal?: string;
|
|
14
|
+
clientId: string;
|
|
15
|
+
clientSecret?: WorkersClientSecret;
|
|
16
|
+
resource: string;
|
|
17
|
+
callbackPath?: string;
|
|
18
|
+
cookiePrefix: string;
|
|
19
|
+
sessionCookieDomain?: string;
|
|
20
|
+
providers: readonly string[];
|
|
21
|
+
gatedPaths?: readonly string[];
|
|
22
|
+
loginPath?: string;
|
|
23
|
+
accessTokenMaxAge?: number;
|
|
24
|
+
refreshTokenMaxAge?: number;
|
|
25
|
+
transactionMaxAge?: number;
|
|
26
|
+
clockSkew?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface Principal {
|
|
29
|
+
Subject: string;
|
|
30
|
+
UserID: string;
|
|
31
|
+
Email: string;
|
|
32
|
+
Name: string;
|
|
33
|
+
Image: string;
|
|
34
|
+
Roles: string[];
|
|
35
|
+
Audiences: string[];
|
|
36
|
+
}
|
|
37
|
+
export interface Tokens {
|
|
38
|
+
AccessToken: string;
|
|
39
|
+
RefreshToken: string;
|
|
40
|
+
}
|
|
41
|
+
export interface Session {
|
|
42
|
+
Principal: Principal | null;
|
|
43
|
+
Tokens: Tokens | null;
|
|
44
|
+
Refreshed: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface WorkersAuthVariables {
|
|
47
|
+
principal: Principal | null;
|
|
48
|
+
session: Session;
|
|
49
|
+
}
|
|
50
|
+
export interface WorkersAuthEnv {
|
|
51
|
+
Variables: WorkersAuthVariables;
|
|
52
|
+
}
|
|
53
|
+
export interface WorkersAuthContext {
|
|
54
|
+
req: {
|
|
55
|
+
readonly raw: Request;
|
|
56
|
+
};
|
|
57
|
+
get<Key extends keyof WorkersAuthVariables>(key: Key): WorkersAuthVariables[Key];
|
|
58
|
+
set<Key extends keyof WorkersAuthVariables>(key: Key, value: WorkersAuthVariables[Key]): void;
|
|
59
|
+
redirect(location: string, status: 302): Response;
|
|
60
|
+
res: Response;
|
|
61
|
+
}
|
|
62
|
+
export type WorkersAuthMiddleware = (context: WorkersAuthContext, next: () => Promise<void>) => Promise<Response | undefined>;
|
|
63
|
+
export type RequestOrHonoContext = Request | Pick<WorkersAuthContext, 'req'>;
|
|
64
|
+
export type PrincipalSource = Session | Pick<WorkersAuthContext, 'get'>;
|
|
65
|
+
export declare class WorkersAuthServiceUnavailableError extends Error {
|
|
66
|
+
readonly code = "AUTH_SERVICE_UNAVAILABLE";
|
|
67
|
+
readonly status = 503;
|
|
68
|
+
constructor();
|
|
69
|
+
}
|
|
70
|
+
export interface WorkersAuthClient {
|
|
71
|
+
Authorize(requestOrContext: RequestOrHonoContext, provider: string, redirectPath: string): Promise<Response>;
|
|
72
|
+
Callback(requestOrContext: RequestOrHonoContext): Promise<Response>;
|
|
73
|
+
Middleware(): WorkersAuthMiddleware;
|
|
74
|
+
Principal(source: PrincipalSource): Principal | null;
|
|
75
|
+
getSession(requestOrContext: RequestOrHonoContext): Promise<Session>;
|
|
76
|
+
setSessionCookies(response: Response, tokens: Tokens): Response;
|
|
77
|
+
clearSessionCookies(response: Response): Response;
|
|
78
|
+
}
|
|
79
|
+
export declare function Authorize(config: WorkersAuthConfig, requestOrContext: RequestOrHonoContext, provider: string, redirectPath: string): Promise<Response>;
|
|
80
|
+
export declare function Callback(config: WorkersAuthConfig, requestOrContext: RequestOrHonoContext): Promise<Response>;
|
|
81
|
+
export declare function getSession(config: WorkersAuthConfig, requestOrContext: RequestOrHonoContext): Promise<Session>;
|
|
82
|
+
export declare function setSessionCookies(config: WorkersAuthConfig, response: Response, tokens: Tokens): Response;
|
|
83
|
+
export declare function clearSessionCookies(config: WorkersAuthConfig, response: Response): Response;
|
|
84
|
+
export declare function Principal(source: PrincipalSource): Principal | null;
|
|
85
|
+
export declare function Middleware(config: WorkersAuthConfig): WorkersAuthMiddleware;
|
|
86
|
+
export declare function New(config: WorkersAuthConfig): WorkersAuthClient;
|
|
87
|
+
export declare const createWorkersAuth: typeof New;
|
|
88
|
+
export {};
|
|
89
|
+
//# sourceMappingURL=workers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../src/workers.ts"],"names":[],"mappings":"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"}
|
package/dist/workers.js
ADDED
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
import { createClientSecretBasicAuthHeader } from './utils/client-secret-header.js';
|
|
2
|
+
import { getCookie, setCookie } from './utils/cookies.js';
|
|
3
|
+
import { extractIdentityId } from './utils/identity.js';
|
|
4
|
+
import { resolveInternalIssuer } from './utils/issuer.js';
|
|
5
|
+
import { generatePKCE } from './utils/pkce.js';
|
|
6
|
+
import { generateState, verifyState } from './utils/state.js';
|
|
7
|
+
import { verifyAccessToken } from './utils/tokens.js';
|
|
8
|
+
const DEFAULT_CALLBACK_PATH = '/api/auth/callback';
|
|
9
|
+
const DEFAULT_LOGIN_PATH = '/login';
|
|
10
|
+
const DEFAULT_ACCESS_TOKEN_MAX_AGE = 900;
|
|
11
|
+
const DEFAULT_REFRESH_TOKEN_MAX_AGE = 2_592_000;
|
|
12
|
+
const DEFAULT_TRANSACTION_MAX_AGE = 600;
|
|
13
|
+
const DEFAULT_CLOCK_SKEW = 60;
|
|
14
|
+
export class WorkersAuthServiceUnavailableError extends Error {
|
|
15
|
+
code = 'AUTH_SERVICE_UNAVAILABLE';
|
|
16
|
+
status = 503;
|
|
17
|
+
constructor() {
|
|
18
|
+
super('Auth service unavailable');
|
|
19
|
+
this.name = 'WorkersAuthServiceUnavailableError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function normalizeIssuer(value, label) {
|
|
23
|
+
let url;
|
|
24
|
+
try {
|
|
25
|
+
url = new URL(value);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new TypeError(`${label} must be an absolute HTTP URL`);
|
|
29
|
+
}
|
|
30
|
+
if ((url.protocol !== 'https:' && url.protocol !== 'http:') ||
|
|
31
|
+
url.username !== '' ||
|
|
32
|
+
url.password !== '' ||
|
|
33
|
+
(url.pathname !== '/' && url.pathname !== '') ||
|
|
34
|
+
url.search !== '' ||
|
|
35
|
+
url.hash !== '') {
|
|
36
|
+
throw new TypeError(`${label} must be an origin without credentials, path, query, or fragment`);
|
|
37
|
+
}
|
|
38
|
+
return url.origin;
|
|
39
|
+
}
|
|
40
|
+
function validateResource(value) {
|
|
41
|
+
let url;
|
|
42
|
+
try {
|
|
43
|
+
url = new URL(value);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
throw new TypeError('resource must be an absolute HTTP URL');
|
|
47
|
+
}
|
|
48
|
+
if ((url.protocol !== 'https:' && url.protocol !== 'http:') ||
|
|
49
|
+
url.username !== '' ||
|
|
50
|
+
url.password !== '' ||
|
|
51
|
+
url.hash !== '') {
|
|
52
|
+
throw new TypeError('resource must be an absolute HTTP URL without credentials or fragment');
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
function isSafeAbsolutePath(path) {
|
|
57
|
+
const lower = path.toLowerCase();
|
|
58
|
+
if (!path.startsWith('/') ||
|
|
59
|
+
path.startsWith('//') ||
|
|
60
|
+
path.includes('\\') ||
|
|
61
|
+
lower.includes('%2f') ||
|
|
62
|
+
lower.includes('%5c')) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
const parsed = new URL(path, 'https://local.invalid');
|
|
67
|
+
return parsed.origin === 'https://local.invalid';
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function isSafeLocalRoute(path) {
|
|
74
|
+
if (!isSafeAbsolutePath(path))
|
|
75
|
+
return false;
|
|
76
|
+
const parsed = new URL(path, 'https://local.invalid');
|
|
77
|
+
return parsed.search === '' && parsed.hash === '';
|
|
78
|
+
}
|
|
79
|
+
function safeRedirect(path) {
|
|
80
|
+
return path !== null && isSafeAbsolutePath(path) ? path : '/';
|
|
81
|
+
}
|
|
82
|
+
function positiveSeconds(value, fallback, label) {
|
|
83
|
+
if (value === undefined)
|
|
84
|
+
return fallback;
|
|
85
|
+
if (!Number.isInteger(value) || value <= 0) {
|
|
86
|
+
throw new TypeError(`${label} must be a positive integer number of seconds`);
|
|
87
|
+
}
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
function normalizeConfig(config) {
|
|
91
|
+
const issuer = normalizeIssuer(config.issuer, 'issuer');
|
|
92
|
+
const issuerInternal = config.issuerInternal
|
|
93
|
+
? normalizeIssuer(config.issuerInternal, 'issuerInternal')
|
|
94
|
+
: issuer;
|
|
95
|
+
if (typeof config.clientId !== 'string' || config.clientId.trim() === '') {
|
|
96
|
+
throw new TypeError('clientId is required');
|
|
97
|
+
}
|
|
98
|
+
if (typeof config.cookiePrefix !== 'string' || !/^[A-Za-z0-9_-]+$/.test(config.cookiePrefix)) {
|
|
99
|
+
throw new TypeError('cookiePrefix must contain only letters, numbers, underscores, or hyphens');
|
|
100
|
+
}
|
|
101
|
+
const callbackPath = config.callbackPath ?? DEFAULT_CALLBACK_PATH;
|
|
102
|
+
const loginPath = config.loginPath ?? DEFAULT_LOGIN_PATH;
|
|
103
|
+
if (!isSafeLocalRoute(callbackPath))
|
|
104
|
+
throw new TypeError('callbackPath must be a local route');
|
|
105
|
+
if (!isSafeLocalRoute(loginPath))
|
|
106
|
+
throw new TypeError('loginPath must be a local route');
|
|
107
|
+
if (!Array.isArray(config.providers) || config.providers.length === 0) {
|
|
108
|
+
throw new TypeError('at least one provider is required');
|
|
109
|
+
}
|
|
110
|
+
if (config.providers.some((provider) => typeof provider !== 'string' || provider.trim() === '')) {
|
|
111
|
+
throw new TypeError('providers must be non-empty strings');
|
|
112
|
+
}
|
|
113
|
+
const gatedPaths = [...(config.gatedPaths ?? [])];
|
|
114
|
+
for (const pattern of gatedPaths) {
|
|
115
|
+
const route = pattern.endsWith('/*') ? pattern.slice(0, -1) : pattern;
|
|
116
|
+
if (!isSafeLocalRoute(route))
|
|
117
|
+
throw new TypeError('gatedPaths must contain local routes');
|
|
118
|
+
}
|
|
119
|
+
if (config.sessionCookieDomain !== undefined &&
|
|
120
|
+
(!/^(?:\.?[A-Za-z0-9-]+)(?:\.[A-Za-z0-9-]+)*$/.test(config.sessionCookieDomain) ||
|
|
121
|
+
config.sessionCookieDomain.includes('..'))) {
|
|
122
|
+
throw new TypeError('sessionCookieDomain is invalid');
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
issuer,
|
|
126
|
+
issuerInternal,
|
|
127
|
+
clientId: config.clientId,
|
|
128
|
+
clientSecret: config.clientSecret,
|
|
129
|
+
resource: validateResource(config.resource),
|
|
130
|
+
callbackPath,
|
|
131
|
+
cookiePrefix: config.cookiePrefix,
|
|
132
|
+
sessionCookieDomain: config.sessionCookieDomain,
|
|
133
|
+
providers: [...config.providers],
|
|
134
|
+
gatedPaths,
|
|
135
|
+
loginPath,
|
|
136
|
+
accessTokenMaxAge: positiveSeconds(config.accessTokenMaxAge, DEFAULT_ACCESS_TOKEN_MAX_AGE, 'accessTokenMaxAge'),
|
|
137
|
+
refreshTokenMaxAge: positiveSeconds(config.refreshTokenMaxAge, DEFAULT_REFRESH_TOKEN_MAX_AGE, 'refreshTokenMaxAge'),
|
|
138
|
+
transactionMaxAge: positiveSeconds(config.transactionMaxAge, DEFAULT_TRANSACTION_MAX_AGE, 'transactionMaxAge'),
|
|
139
|
+
clockSkew: positiveSeconds(config.clockSkew, DEFAULT_CLOCK_SKEW, 'clockSkew'),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function requestFrom(input) {
|
|
143
|
+
if (input instanceof Request)
|
|
144
|
+
return input;
|
|
145
|
+
if (input && input.req?.raw instanceof Request)
|
|
146
|
+
return input.req.raw;
|
|
147
|
+
throw new TypeError('expected a Web Request or Hono Context');
|
|
148
|
+
}
|
|
149
|
+
function cookieName(config, suffix) {
|
|
150
|
+
return `${config.cookiePrefix}_${suffix}`;
|
|
151
|
+
}
|
|
152
|
+
function setSecureCookie(response, name, value, path, maxAge, domain) {
|
|
153
|
+
setCookie(response, name, value, {
|
|
154
|
+
path,
|
|
155
|
+
maxAge,
|
|
156
|
+
httpOnly: true,
|
|
157
|
+
secure: true,
|
|
158
|
+
sameSite: 'lax',
|
|
159
|
+
...(domain ? { domain } : {}),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
function setTransactionCookies(config, response, transaction) {
|
|
163
|
+
const callbackNames = ['pkce', 'callback', 'expires'];
|
|
164
|
+
const callbackValues = [
|
|
165
|
+
transaction.verifier,
|
|
166
|
+
transaction.callback,
|
|
167
|
+
String(transaction.expires),
|
|
168
|
+
];
|
|
169
|
+
for (let index = 0; index < callbackNames.length; index += 1) {
|
|
170
|
+
setSecureCookie(response, cookieName(config, callbackNames[index]), callbackValues[index], config.callbackPath, config.transactionMaxAge);
|
|
171
|
+
}
|
|
172
|
+
for (const [suffix, value] of [
|
|
173
|
+
['state', transaction.state],
|
|
174
|
+
['redirect', transaction.redirect],
|
|
175
|
+
['provider', transaction.provider],
|
|
176
|
+
]) {
|
|
177
|
+
setSecureCookie(response, cookieName(config, suffix), value, '/', config.transactionMaxAge);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function clearTransactionCookies(config, response) {
|
|
181
|
+
for (const suffix of ['pkce', 'callback', 'expires']) {
|
|
182
|
+
setSecureCookie(response, cookieName(config, suffix), '', config.callbackPath, 0);
|
|
183
|
+
}
|
|
184
|
+
for (const suffix of ['state', 'redirect', 'provider']) {
|
|
185
|
+
setSecureCookie(response, cookieName(config, suffix), '', '/', 0);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function setSessionCookiesNormalized(config, response, tokens) {
|
|
189
|
+
const mutable = cloneMutableResponse(response);
|
|
190
|
+
appendSessionCookiesNormalized(config, mutable, tokens);
|
|
191
|
+
return mutable;
|
|
192
|
+
}
|
|
193
|
+
function appendSessionCookiesNormalized(config, response, tokens) {
|
|
194
|
+
setSecureCookie(response, cookieName(config, 'at'), tokens.AccessToken, '/', config.accessTokenMaxAge, config.sessionCookieDomain);
|
|
195
|
+
setSecureCookie(response, cookieName(config, 'rt'), tokens.RefreshToken, '/', config.refreshTokenMaxAge, config.sessionCookieDomain);
|
|
196
|
+
}
|
|
197
|
+
function clearSessionCookiesNormalized(config, response) {
|
|
198
|
+
const mutable = cloneMutableResponse(response);
|
|
199
|
+
setSecureCookie(mutable, cookieName(config, 'at'), '', '/', 0, config.sessionCookieDomain);
|
|
200
|
+
setSecureCookie(mutable, cookieName(config, 'rt'), '', '/', 0, config.sessionCookieDomain);
|
|
201
|
+
return mutable;
|
|
202
|
+
}
|
|
203
|
+
function cloneMutableResponse(response) {
|
|
204
|
+
return new Response(response.body, {
|
|
205
|
+
status: response.status,
|
|
206
|
+
statusText: response.statusText,
|
|
207
|
+
headers: new Headers(response.headers),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
function clearTerminalTransaction(config, response) {
|
|
211
|
+
clearTransactionCookies(config, response);
|
|
212
|
+
return response;
|
|
213
|
+
}
|
|
214
|
+
function serviceUnavailable(request) {
|
|
215
|
+
const headers = {
|
|
216
|
+
'Cache-Control': 'private, no-store',
|
|
217
|
+
Pragma: 'no-cache',
|
|
218
|
+
Expires: '0',
|
|
219
|
+
};
|
|
220
|
+
const acceptsJson = request.headers
|
|
221
|
+
.get('accept')
|
|
222
|
+
?.split(',')
|
|
223
|
+
.some((part) => part.split(';', 1)[0].trim().toLowerCase() === 'application/json');
|
|
224
|
+
if (acceptsJson) {
|
|
225
|
+
return Response.json({ error: 'auth_service_unavailable' }, { status: 503, headers });
|
|
226
|
+
}
|
|
227
|
+
return new Response('Service unavailable', { status: 503, headers });
|
|
228
|
+
}
|
|
229
|
+
async function resolveSecret(config, request) {
|
|
230
|
+
const source = config.clientSecret;
|
|
231
|
+
if (source === undefined)
|
|
232
|
+
return null;
|
|
233
|
+
let value;
|
|
234
|
+
try {
|
|
235
|
+
if (source instanceof Uint8Array) {
|
|
236
|
+
value = source;
|
|
237
|
+
}
|
|
238
|
+
else if (typeof source === 'function') {
|
|
239
|
+
value = await source(request);
|
|
240
|
+
}
|
|
241
|
+
else if ('resolve' in source && typeof source.resolve === 'function') {
|
|
242
|
+
value = await source.resolve(request);
|
|
243
|
+
}
|
|
244
|
+
else if ('get' in source && typeof source.get === 'function') {
|
|
245
|
+
value = await source.get();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
throw new WorkersAuthServiceUnavailableError();
|
|
250
|
+
}
|
|
251
|
+
let secret;
|
|
252
|
+
try {
|
|
253
|
+
secret =
|
|
254
|
+
value instanceof Uint8Array
|
|
255
|
+
? new TextDecoder('utf-8', { fatal: true }).decode(value)
|
|
256
|
+
: typeof value === 'string'
|
|
257
|
+
? value
|
|
258
|
+
: '';
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
throw new WorkersAuthServiceUnavailableError();
|
|
262
|
+
}
|
|
263
|
+
if (secret.trim() === '')
|
|
264
|
+
throw new WorkersAuthServiceUnavailableError();
|
|
265
|
+
return secret;
|
|
266
|
+
}
|
|
267
|
+
function principalFromClaims(claims) {
|
|
268
|
+
try {
|
|
269
|
+
const userId = claims.userId ?? extractIdentityId(claims.sub);
|
|
270
|
+
return {
|
|
271
|
+
Subject: claims.sub,
|
|
272
|
+
UserID: userId,
|
|
273
|
+
Email: claims.email,
|
|
274
|
+
Name: claims.name ?? '',
|
|
275
|
+
Image: claims.image ?? '',
|
|
276
|
+
Roles: [...(claims.roles ?? [])],
|
|
277
|
+
Audiences: [...(claims.audiences ?? [])],
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
async function verifyToken(config, token) {
|
|
285
|
+
const claims = await verifyAccessToken(config.issuer, token, {
|
|
286
|
+
audience: config.resource,
|
|
287
|
+
algorithms: ['ES256'],
|
|
288
|
+
jwksIssuer: resolveInternalIssuer(config),
|
|
289
|
+
requireUserToken: true,
|
|
290
|
+
clockSkew: config.clockSkew,
|
|
291
|
+
});
|
|
292
|
+
return claims ? principalFromClaims(claims) : null;
|
|
293
|
+
}
|
|
294
|
+
async function requestTokens(config, request, form) {
|
|
295
|
+
const secret = await resolveSecret(config, request);
|
|
296
|
+
const headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' });
|
|
297
|
+
if (secret !== null) {
|
|
298
|
+
headers.set('Authorization', createClientSecretBasicAuthHeader(config.clientId, secret));
|
|
299
|
+
}
|
|
300
|
+
let response;
|
|
301
|
+
try {
|
|
302
|
+
response = await fetch(`${config.issuerInternal}/token`, {
|
|
303
|
+
method: 'POST',
|
|
304
|
+
headers,
|
|
305
|
+
body: form.toString(),
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
if (!response.ok)
|
|
312
|
+
return null;
|
|
313
|
+
let data;
|
|
314
|
+
try {
|
|
315
|
+
data = await response.json();
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
if (typeof data !== 'object' ||
|
|
321
|
+
data === null ||
|
|
322
|
+
typeof data.access_token !== 'string' ||
|
|
323
|
+
typeof data.refresh_token !== 'string') {
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
const tokens = {
|
|
327
|
+
AccessToken: data.access_token,
|
|
328
|
+
RefreshToken: data.refresh_token,
|
|
329
|
+
};
|
|
330
|
+
const principal = await verifyToken(config, tokens.AccessToken);
|
|
331
|
+
return principal ? { tokens, principal } : null;
|
|
332
|
+
}
|
|
333
|
+
export async function Authorize(config, requestOrContext, provider, redirectPath) {
|
|
334
|
+
const normalized = normalizeConfig(config);
|
|
335
|
+
if (!normalized.providers.includes(provider))
|
|
336
|
+
throw new TypeError('provider is not configured');
|
|
337
|
+
const request = requestFrom(requestOrContext);
|
|
338
|
+
const requestUrl = new URL(request.url);
|
|
339
|
+
const callback = `${requestUrl.origin}${normalized.callbackPath}`;
|
|
340
|
+
const { verifier, challenge } = await generatePKCE();
|
|
341
|
+
const state = generateState();
|
|
342
|
+
const redirect = safeRedirect(redirectPath);
|
|
343
|
+
const expires = Math.floor(Date.now() / 1000) + normalized.transactionMaxAge;
|
|
344
|
+
const authorizationUrl = new URL(`${normalized.issuer}/authorize`);
|
|
345
|
+
for (const [key, value] of [
|
|
346
|
+
['response_type', 'code'],
|
|
347
|
+
['client_id', normalized.clientId],
|
|
348
|
+
['redirect_uri', callback],
|
|
349
|
+
['scope', 'openid email profile'],
|
|
350
|
+
['state', state],
|
|
351
|
+
['code_challenge', challenge],
|
|
352
|
+
['code_challenge_method', 'S256'],
|
|
353
|
+
['provider', provider === 'email-code' ? 'code' : provider],
|
|
354
|
+
['resource', normalized.resource],
|
|
355
|
+
]) {
|
|
356
|
+
authorizationUrl.searchParams.set(key, value);
|
|
357
|
+
}
|
|
358
|
+
const response = new Response(null, {
|
|
359
|
+
status: 302,
|
|
360
|
+
headers: { Location: authorizationUrl.toString() },
|
|
361
|
+
});
|
|
362
|
+
setTransactionCookies(normalized, response, {
|
|
363
|
+
verifier,
|
|
364
|
+
callback,
|
|
365
|
+
expires,
|
|
366
|
+
state,
|
|
367
|
+
redirect,
|
|
368
|
+
provider,
|
|
369
|
+
});
|
|
370
|
+
return response;
|
|
371
|
+
}
|
|
372
|
+
export async function Callback(config, requestOrContext) {
|
|
373
|
+
const normalized = normalizeConfig(config);
|
|
374
|
+
const request = requestFrom(requestOrContext);
|
|
375
|
+
const url = new URL(request.url);
|
|
376
|
+
const state = url.searchParams.get('state') ?? '';
|
|
377
|
+
const storedState = getCookie(request, cookieName(normalized, 'state')) ?? '';
|
|
378
|
+
const callback = getCookie(request, cookieName(normalized, 'callback'));
|
|
379
|
+
const expectedCallback = `${url.origin}${normalized.callbackPath}`;
|
|
380
|
+
const storedExpires = getCookie(request, cookieName(normalized, 'expires')) ?? '';
|
|
381
|
+
const expires = /^(?:0|[1-9]\d*)$/.test(storedExpires) ? Number(storedExpires) : Number.NaN;
|
|
382
|
+
if (url.pathname !== normalized.callbackPath || !verifyState(state, storedState)) {
|
|
383
|
+
return new Response('Invalid state parameter', { status: 403 });
|
|
384
|
+
}
|
|
385
|
+
if (callback !== expectedCallback ||
|
|
386
|
+
!Number.isSafeInteger(expires) ||
|
|
387
|
+
Math.floor(Date.now() / 1000) >= expires) {
|
|
388
|
+
return clearTerminalTransaction(normalized, new Response('Invalid state parameter', { status: 403 }));
|
|
389
|
+
}
|
|
390
|
+
const verifier = getCookie(request, cookieName(normalized, 'pkce'));
|
|
391
|
+
if (!verifier) {
|
|
392
|
+
return clearTerminalTransaction(normalized, new Response('Missing PKCE verifier', { status: 400 }));
|
|
393
|
+
}
|
|
394
|
+
const code = url.searchParams.get('code');
|
|
395
|
+
if (url.searchParams.has('error') || !code) {
|
|
396
|
+
return clearTerminalTransaction(normalized, new Response(null, {
|
|
397
|
+
status: 302,
|
|
398
|
+
headers: { Location: `${normalized.loginPath}?error=auth_failed` },
|
|
399
|
+
}));
|
|
400
|
+
}
|
|
401
|
+
const form = new URLSearchParams();
|
|
402
|
+
form.set('grant_type', 'authorization_code');
|
|
403
|
+
form.set('code', code);
|
|
404
|
+
form.set('code_verifier', verifier);
|
|
405
|
+
form.set('redirect_uri', callback);
|
|
406
|
+
form.set('client_id', normalized.clientId);
|
|
407
|
+
form.set('resource', normalized.resource);
|
|
408
|
+
let result;
|
|
409
|
+
try {
|
|
410
|
+
result = await requestTokens(normalized, request, form);
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
if (error instanceof WorkersAuthServiceUnavailableError) {
|
|
414
|
+
return clearTerminalTransaction(normalized, serviceUnavailable(request));
|
|
415
|
+
}
|
|
416
|
+
throw error;
|
|
417
|
+
}
|
|
418
|
+
if (!result) {
|
|
419
|
+
return clearTerminalTransaction(normalized, new Response(null, {
|
|
420
|
+
status: 302,
|
|
421
|
+
headers: { Location: `${normalized.loginPath}?error=auth_failed` },
|
|
422
|
+
}));
|
|
423
|
+
}
|
|
424
|
+
let response = new Response(null, {
|
|
425
|
+
status: 302,
|
|
426
|
+
headers: { Location: safeRedirect(getCookie(request, cookieName(normalized, 'redirect'))) },
|
|
427
|
+
});
|
|
428
|
+
response = setSessionCookiesNormalized(normalized, response, result.tokens);
|
|
429
|
+
clearTransactionCookies(normalized, response);
|
|
430
|
+
return response;
|
|
431
|
+
}
|
|
432
|
+
async function getSessionNormalized(config, request) {
|
|
433
|
+
const accessToken = getCookie(request, cookieName(config, 'at')) ?? '';
|
|
434
|
+
const refreshToken = getCookie(request, cookieName(config, 'rt')) ?? '';
|
|
435
|
+
if (accessToken) {
|
|
436
|
+
const principal = await verifyToken(config, accessToken);
|
|
437
|
+
if (principal) {
|
|
438
|
+
return {
|
|
439
|
+
Principal: principal,
|
|
440
|
+
Tokens: { AccessToken: accessToken, RefreshToken: refreshToken },
|
|
441
|
+
Refreshed: false,
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
if (refreshToken) {
|
|
446
|
+
const form = new URLSearchParams();
|
|
447
|
+
form.set('grant_type', 'refresh_token');
|
|
448
|
+
form.set('refresh_token', refreshToken);
|
|
449
|
+
form.set('client_id', config.clientId);
|
|
450
|
+
form.set('resource', config.resource);
|
|
451
|
+
const result = await requestTokens(config, request, form);
|
|
452
|
+
if (result) {
|
|
453
|
+
return { Principal: result.principal, Tokens: result.tokens, Refreshed: true };
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return { Principal: null, Tokens: null, Refreshed: false };
|
|
457
|
+
}
|
|
458
|
+
export async function getSession(config, requestOrContext) {
|
|
459
|
+
return getSessionNormalized(normalizeConfig(config), requestFrom(requestOrContext));
|
|
460
|
+
}
|
|
461
|
+
export function setSessionCookies(config, response, tokens) {
|
|
462
|
+
return setSessionCookiesNormalized(normalizeConfig(config), response, tokens);
|
|
463
|
+
}
|
|
464
|
+
export function clearSessionCookies(config, response) {
|
|
465
|
+
return clearSessionCookiesNormalized(normalizeConfig(config), response);
|
|
466
|
+
}
|
|
467
|
+
export function Principal(source) {
|
|
468
|
+
if ('Principal' in source)
|
|
469
|
+
return source.Principal;
|
|
470
|
+
return source.get('principal') ?? null;
|
|
471
|
+
}
|
|
472
|
+
function isGated(config, path) {
|
|
473
|
+
return config.gatedPaths.some((pattern) => pattern.endsWith('/*') ? path.startsWith(pattern.slice(0, -1)) : path === pattern);
|
|
474
|
+
}
|
|
475
|
+
export function Middleware(config) {
|
|
476
|
+
const normalized = normalizeConfig(config);
|
|
477
|
+
return async (context, next) => {
|
|
478
|
+
const request = context.req.raw;
|
|
479
|
+
let session;
|
|
480
|
+
try {
|
|
481
|
+
session = await getSessionNormalized(normalized, request);
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
if (error instanceof WorkersAuthServiceUnavailableError)
|
|
485
|
+
return serviceUnavailable(request);
|
|
486
|
+
throw error;
|
|
487
|
+
}
|
|
488
|
+
context.set('session', session);
|
|
489
|
+
context.set('principal', session.Principal);
|
|
490
|
+
if (!session.Principal && isGated(normalized, new URL(request.url).pathname)) {
|
|
491
|
+
const login = new URL(normalized.loginPath, request.url);
|
|
492
|
+
login.searchParams.set('redirect', new URL(request.url).pathname);
|
|
493
|
+
return context.redirect(login.toString(), 302);
|
|
494
|
+
}
|
|
495
|
+
await next();
|
|
496
|
+
if (session.Refreshed && session.Tokens) {
|
|
497
|
+
context.res = cloneMutableResponse(context.res);
|
|
498
|
+
appendSessionCookiesNormalized(normalized, context.res, session.Tokens);
|
|
499
|
+
}
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
export function New(config) {
|
|
503
|
+
const normalized = normalizeConfig(config);
|
|
504
|
+
const stableConfig = normalized;
|
|
505
|
+
return {
|
|
506
|
+
Authorize: (requestOrContext, provider, redirectPath) => Authorize(stableConfig, requestOrContext, provider, redirectPath),
|
|
507
|
+
Callback: (requestOrContext) => Callback(stableConfig, requestOrContext),
|
|
508
|
+
Middleware: () => Middleware(stableConfig),
|
|
509
|
+
Principal,
|
|
510
|
+
getSession: (requestOrContext) => getSession(stableConfig, requestOrContext),
|
|
511
|
+
setSessionCookies: (response, tokens) => setSessionCookies(stableConfig, response, tokens),
|
|
512
|
+
clearSessionCookies: (response) => clearSessionCookies(stableConfig, response),
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
export const createWorkersAuth = New;
|
|
516
|
+
//# sourceMappingURL=workers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workers.js","sourceRoot":"","sources":["../src/workers.ts"],"names":[],"mappings":"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"}
|