@sentropic/auth-hono 0.2.1 → 0.4.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/README.md +168 -1
- package/dist/contracts.d.ts +1 -1
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +2 -0
- package/dist/contracts.js.map +1 -1
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/oauth/authorize-handler.d.ts +13 -0
- package/dist/oauth/authorize-handler.d.ts.map +1 -0
- package/dist/oauth/authorize-handler.js +143 -0
- package/dist/oauth/authorize-handler.js.map +1 -0
- package/dist/oauth/consent-decision-handler.d.ts +11 -0
- package/dist/oauth/consent-decision-handler.d.ts.map +1 -0
- package/dist/oauth/consent-decision-handler.js +58 -0
- package/dist/oauth/consent-decision-handler.js.map +1 -0
- package/dist/oauth/crypto-utils.d.ts +3 -0
- package/dist/oauth/crypto-utils.d.ts.map +1 -0
- package/dist/oauth/crypto-utils.js +13 -0
- package/dist/oauth/crypto-utils.js.map +1 -0
- package/dist/oauth/dpop.d.ts +18 -0
- package/dist/oauth/dpop.d.ts.map +1 -0
- package/dist/oauth/dpop.js +54 -0
- package/dist/oauth/dpop.js.map +1 -0
- package/dist/oauth/http-utils.d.ts +6 -0
- package/dist/oauth/http-utils.d.ts.map +1 -0
- package/dist/oauth/http-utils.js +27 -0
- package/dist/oauth/http-utils.js.map +1 -0
- package/dist/oauth/introspect-handler.d.ts +8 -0
- package/dist/oauth/introspect-handler.d.ts.map +1 -0
- package/dist/oauth/introspect-handler.js +63 -0
- package/dist/oauth/introspect-handler.js.map +1 -0
- package/dist/oauth/jwks-service.d.ts +25 -0
- package/dist/oauth/jwks-service.d.ts.map +1 -0
- package/dist/oauth/jwks-service.js +61 -0
- package/dist/oauth/jwks-service.js.map +1 -0
- package/dist/oauth/revoke-handler.d.ts +8 -0
- package/dist/oauth/revoke-handler.d.ts.map +1 -0
- package/dist/oauth/revoke-handler.js +55 -0
- package/dist/oauth/revoke-handler.js.map +1 -0
- package/dist/oauth/router.d.ts +8 -0
- package/dist/oauth/router.d.ts.map +1 -0
- package/dist/oauth/router.js +30 -0
- package/dist/oauth/router.js.map +1 -0
- package/dist/oauth/service-auth-middleware.d.ts +30 -0
- package/dist/oauth/service-auth-middleware.d.ts.map +1 -0
- package/dist/oauth/service-auth-middleware.js +170 -0
- package/dist/oauth/service-auth-middleware.js.map +1 -0
- package/dist/oauth/session-resolver.d.ts +9 -0
- package/dist/oauth/session-resolver.d.ts.map +1 -0
- package/dist/oauth/session-resolver.js +28 -0
- package/dist/oauth/session-resolver.js.map +1 -0
- package/dist/oauth/state-codec.d.ts +25 -0
- package/dist/oauth/state-codec.d.ts.map +1 -0
- package/dist/oauth/state-codec.js +60 -0
- package/dist/oauth/state-codec.js.map +1 -0
- package/dist/oauth/state-store-types.d.ts +100 -0
- package/dist/oauth/state-store-types.d.ts.map +1 -0
- package/dist/oauth/state-store-types.js +2 -0
- package/dist/oauth/state-store-types.js.map +1 -0
- package/dist/oauth/token-handler.d.ts +12 -0
- package/dist/oauth/token-handler.d.ts.map +1 -0
- package/dist/oauth/token-handler.js +294 -0
- package/dist/oauth/token-handler.js.map +1 -0
- package/dist/oauth/userinfo-handler.d.ts +9 -0
- package/dist/oauth/userinfo-handler.d.ts.map +1 -0
- package/dist/oauth/userinfo-handler.js +93 -0
- package/dist/oauth/userinfo-handler.js.map +1 -0
- package/dist/oauth/wellknown-handler.d.ts +9 -0
- package/dist/oauth/wellknown-handler.d.ts.map +1 -0
- package/dist/oauth/wellknown-handler.js +37 -0
- package/dist/oauth/wellknown-handler.js.map +1 -0
- package/dist/ports.d.ts +4 -0
- package/dist/ports.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/contracts.ts +2 -0
- package/src/index.ts +16 -0
- package/src/oauth/authorize-handler.ts +201 -0
- package/src/oauth/consent-decision-handler.ts +93 -0
- package/src/oauth/crypto-utils.ts +14 -0
- package/src/oauth/dpop.ts +93 -0
- package/src/oauth/http-utils.ts +58 -0
- package/src/oauth/introspect-handler.ts +88 -0
- package/src/oauth/jwks-service.ts +103 -0
- package/src/oauth/revoke-handler.ts +70 -0
- package/src/oauth/router.ts +42 -0
- package/src/oauth/service-auth-middleware.ts +250 -0
- package/src/oauth/session-resolver.ts +48 -0
- package/src/oauth/state-codec.ts +98 -0
- package/src/oauth/state-store-types.ts +109 -0
- package/src/oauth/token-handler.ts +423 -0
- package/src/oauth/userinfo-handler.ts +129 -0
- package/src/oauth/wellknown-handler.ts +52 -0
- package/src/ports.ts +17 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { OAuthDpopProofError, verifyOAuthDpopProof } from './dpop.js';
|
|
2
|
+
import { oauthJsonError } from './http-utils.js';
|
|
3
|
+
import { createJwksService } from './jwks-service.js';
|
|
4
|
+
export const createOAuthUserInfoHandler = (options) => async (c) => {
|
|
5
|
+
const authorization = parseAccessToken(c.req.header('authorization'));
|
|
6
|
+
if (!authorization)
|
|
7
|
+
return unauthorized(c, 'Access token is required.');
|
|
8
|
+
const payload = await verifyAccessToken(c, options, authorization.token);
|
|
9
|
+
if (payload instanceof Response)
|
|
10
|
+
return payload;
|
|
11
|
+
const meta = await resolveActiveTokenMeta(c, options.ports, payload);
|
|
12
|
+
if (meta instanceof Response)
|
|
13
|
+
return meta;
|
|
14
|
+
if (meta.dpopJkt) {
|
|
15
|
+
const dpop = await verifyBoundDpop(c, options, authorization, meta);
|
|
16
|
+
if (dpop instanceof Response)
|
|
17
|
+
return dpop;
|
|
18
|
+
}
|
|
19
|
+
const scopes = meta.scope.split(/\s+/).filter(Boolean);
|
|
20
|
+
if (scopes.some((scope) => !['openid', 'profile', 'email'].includes(scope))) {
|
|
21
|
+
return unauthorized(c, 'Access token contains unsupported scopes.');
|
|
22
|
+
}
|
|
23
|
+
const user = await options.ports.users.findById(meta.userId);
|
|
24
|
+
if (!user)
|
|
25
|
+
return unauthorized(c, 'Access token user is invalid.');
|
|
26
|
+
return c.json({
|
|
27
|
+
sub: user.id,
|
|
28
|
+
...(scopes.includes('profile') ? { name: user.displayName } : {}),
|
|
29
|
+
...(scopes.includes('email') ? { email: user.email, email_verified: user.emailVerified } : {}),
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
const verifyAccessToken = async (c, options, token) => {
|
|
33
|
+
try {
|
|
34
|
+
const jwks = createJwksService({ clock: options.ports.clock, jwksPort: options.ports.jwks });
|
|
35
|
+
const result = await jwks.verifyJwt(token, {
|
|
36
|
+
audience: `${trimTrailingSlash(options.issuer)}/api/v1/auth/oauth/userinfo`,
|
|
37
|
+
currentDate: options.ports.clock.now(),
|
|
38
|
+
issuer: trimTrailingSlash(options.issuer),
|
|
39
|
+
});
|
|
40
|
+
return result.payload;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return unauthorized(c, 'Access token is invalid.');
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const resolveActiveTokenMeta = async (c, ports, payload) => {
|
|
47
|
+
const jti = payload.jti;
|
|
48
|
+
if (!jti)
|
|
49
|
+
return unauthorized(c, 'Access token jti is missing.');
|
|
50
|
+
const meta = await ports.oauthStateStore.findTokenMeta(jti);
|
|
51
|
+
if (!meta ||
|
|
52
|
+
meta.tokenType !== 'access_token' ||
|
|
53
|
+
meta.expiresAt <= ports.clock.now() ||
|
|
54
|
+
(await ports.oauthStateStore.isTokenRevoked(jti))) {
|
|
55
|
+
return unauthorized(c, 'Access token is inactive.');
|
|
56
|
+
}
|
|
57
|
+
return meta;
|
|
58
|
+
};
|
|
59
|
+
const verifyBoundDpop = async (c, options, authorization, meta) => {
|
|
60
|
+
const proof = c.req.header('dpop');
|
|
61
|
+
if (authorization.scheme !== 'DPoP' || !proof) {
|
|
62
|
+
return unauthorized(c, 'DPoP proof is required for this access token.');
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const verified = await verifyOAuthDpopProof({
|
|
66
|
+
accessToken: authorization.token,
|
|
67
|
+
htm: c.req.method,
|
|
68
|
+
htu: c.req.url,
|
|
69
|
+
iatSkewSeconds: options.dpopIatSkewSeconds,
|
|
70
|
+
ports: options.ports,
|
|
71
|
+
proof,
|
|
72
|
+
});
|
|
73
|
+
if (verified.jkt !== meta.dpopJkt) {
|
|
74
|
+
return unauthorized(c, 'DPoP proof key does not match the access token.');
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error instanceof OAuthDpopProofError) {
|
|
80
|
+
return unauthorized(c, error.message);
|
|
81
|
+
}
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const parseAccessToken = (authorization) => {
|
|
86
|
+
const [scheme, token, extra] = authorization?.split(/\s+/) ?? [];
|
|
87
|
+
if (extra || !token || (scheme !== 'Bearer' && scheme !== 'DPoP'))
|
|
88
|
+
return null;
|
|
89
|
+
return { scheme, token };
|
|
90
|
+
};
|
|
91
|
+
const unauthorized = (c, message) => oauthJsonError(c, 401, 'invalid_token', message);
|
|
92
|
+
const trimTrailingSlash = (value) => value.replace(/\/+$/u, '');
|
|
93
|
+
//# sourceMappingURL=userinfo-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userinfo-handler.js","sourceRoot":"","sources":["../../src/oauth/userinfo-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import type { AuthHonoPorts } from '../ports.js';
|
|
3
|
+
export interface CreateWellKnownRouterOptions {
|
|
4
|
+
issuer: string;
|
|
5
|
+
oauthPathPrefix?: string;
|
|
6
|
+
ports: AuthHonoPorts;
|
|
7
|
+
}
|
|
8
|
+
export declare const createWellKnownRouter: (options: CreateWellKnownRouterOptions) => Hono;
|
|
9
|
+
//# sourceMappingURL=wellknown-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wellknown-handler.d.ts","sourceRoot":"","sources":["../../src/oauth/wellknown-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,eAAO,MAAM,qBAAqB,YAAa,4BAA4B,KAAG,IAiC7E,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { createJwksService } from './jwks-service.js';
|
|
3
|
+
export const createWellKnownRouter = (options) => {
|
|
4
|
+
const router = new Hono();
|
|
5
|
+
const issuer = trimTrailingSlash(options.issuer);
|
|
6
|
+
const oauthPrefix = normalizePathPrefix(options.oauthPathPrefix ?? '/api/v1/auth/oauth');
|
|
7
|
+
router.get('/openid-configuration', (c) => c.json({
|
|
8
|
+
authorization_endpoint: `${issuer}${oauthPrefix}/authorize`,
|
|
9
|
+
claims_supported: ['sub', 'aud', 'iss', 'exp', 'iat', 'nonce', 'auth_time', 'acr', 'email', 'email_verified', 'name'],
|
|
10
|
+
code_challenge_methods_supported: ['S256'],
|
|
11
|
+
dpop_signing_alg_values_supported: ['EdDSA'],
|
|
12
|
+
grant_types_supported: ['authorization_code', 'client_credentials'],
|
|
13
|
+
id_token_signing_alg_values_supported: ['EdDSA'],
|
|
14
|
+
introspection_endpoint: `${issuer}${oauthPrefix}/introspect`,
|
|
15
|
+
issuer,
|
|
16
|
+
jwks_uri: `${issuer}/.well-known/jwks.json`,
|
|
17
|
+
response_types_supported: ['code'],
|
|
18
|
+
revocation_endpoint: `${issuer}${oauthPrefix}/revoke`,
|
|
19
|
+
scopes_supported: ['openid', 'profile', 'email'],
|
|
20
|
+
subject_types_supported: ['public'],
|
|
21
|
+
token_endpoint: `${issuer}${oauthPrefix}/token`,
|
|
22
|
+
token_endpoint_auth_methods_supported: ['client_secret_basic', 'client_secret_post', 'none'],
|
|
23
|
+
userinfo_endpoint: `${issuer}${oauthPrefix}/userinfo`,
|
|
24
|
+
}));
|
|
25
|
+
router.get('/jwks.json', async (c) => {
|
|
26
|
+
const jwks = createJwksService({ clock: options.ports.clock, jwksPort: options.ports.jwks });
|
|
27
|
+
c.header('Cache-Control', 'public, max-age=300');
|
|
28
|
+
return c.json(await jwks.getPublicJwks());
|
|
29
|
+
});
|
|
30
|
+
return router;
|
|
31
|
+
};
|
|
32
|
+
const trimTrailingSlash = (value) => value.replace(/\/+$/u, '');
|
|
33
|
+
const normalizePathPrefix = (value) => {
|
|
34
|
+
const trimmed = value.replace(/^\/+|\/+$/gu, '');
|
|
35
|
+
return trimmed ? `/${trimmed}` : '';
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=wellknown-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wellknown-handler.js","sourceRoot":"","sources":["../../src/oauth/wellknown-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAQtD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAqC,EAAQ,EAAE;IACnF,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,eAAe,IAAI,oBAAoB,CAAC,CAAC;IAEzF,MAAM,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE,CACxC,CAAC,CAAC,IAAI,CAAC;QACL,sBAAsB,EAAE,GAAG,MAAM,GAAG,WAAW,YAAY;QAC3D,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC;QACrH,gCAAgC,EAAE,CAAC,MAAM,CAAC;QAC1C,iCAAiC,EAAE,CAAC,OAAO,CAAC;QAC5C,qBAAqB,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;QACnE,qCAAqC,EAAE,CAAC,OAAO,CAAC;QAChD,sBAAsB,EAAE,GAAG,MAAM,GAAG,WAAW,aAAa;QAC5D,MAAM;QACN,QAAQ,EAAE,GAAG,MAAM,wBAAwB;QAC3C,wBAAwB,EAAE,CAAC,MAAM,CAAC;QAClC,mBAAmB,EAAE,GAAG,MAAM,GAAG,WAAW,SAAS;QACrD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;QAChD,uBAAuB,EAAE,CAAC,QAAQ,CAAC;QACnC,cAAc,EAAE,GAAG,MAAM,GAAG,WAAW,QAAQ;QAC/C,qCAAqC,EAAE,CAAC,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,CAAC;QAC5F,iBAAiB,EAAE,GAAG,MAAM,GAAG,WAAW,WAAW;KACtD,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7F,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAEhF,MAAM,mBAAmB,GAAG,CAAC,KAAa,EAAU,EAAE;IACpD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACtC,CAAC,CAAC"}
|
package/dist/ports.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { JwksPort, OauthStateStorePort } from './oauth/state-store-types.js';
|
|
2
|
+
export type { AuthCodePayload, DpopProofRecord, JwksKeyRecord, JwksPort, JwksPublicJwk, OauthClientRecord, OauthStateStorePort, OauthTokenType, ServiceClientRecord, TokenMeta, } from './oauth/state-store-types.js';
|
|
1
3
|
export type AuthHonoAccountStatus = 'active' | 'pending_admin_approval' | 'approval_expired_readonly' | 'disabled_by_user' | 'disabled_by_admin' | (string & {});
|
|
2
4
|
export type AuthHonoChallengeType = 'registration' | 'authentication';
|
|
3
5
|
export interface AuthHonoDeviceInfo {
|
|
@@ -275,5 +277,7 @@ export interface AuthHonoPorts {
|
|
|
275
277
|
clock: AuthHonoClockPort;
|
|
276
278
|
random: AuthHonoRandomPort;
|
|
277
279
|
accountPolicy: AuthHonoAccountPolicyPort;
|
|
280
|
+
oauthStateStore: OauthStateStorePort;
|
|
281
|
+
jwks: JwksPort;
|
|
278
282
|
}
|
|
279
283
|
//# sourceMappingURL=ports.d.ts.map
|
package/dist/ports.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/contracts.ts
CHANGED
|
@@ -94,6 +94,8 @@ export const AUTH_HONO_REQUIRED_PORTS = [
|
|
|
94
94
|
'clock',
|
|
95
95
|
'random',
|
|
96
96
|
'accountPolicy',
|
|
97
|
+
'oauthStateStore',
|
|
98
|
+
'jwks',
|
|
97
99
|
] as const satisfies readonly (keyof AuthHonoPorts)[];
|
|
98
100
|
|
|
99
101
|
export type AuthHonoRequiredPort = (typeof AUTH_HONO_REQUIRED_PORTS)[number];
|
package/src/index.ts
CHANGED
|
@@ -3,6 +3,22 @@ export * from './credential-route-handlers.js';
|
|
|
3
3
|
export * from './email-verification.js';
|
|
4
4
|
export * from './magic-link.js';
|
|
5
5
|
export * from './middleware.js';
|
|
6
|
+
export * from './oauth/authorize-handler.js';
|
|
7
|
+
export * from './oauth/consent-decision-handler.js';
|
|
8
|
+
export * from './oauth/crypto-utils.js';
|
|
9
|
+
export * from './oauth/dpop.js';
|
|
10
|
+
export * from './oauth/http-utils.js';
|
|
11
|
+
export * from './oauth/introspect-handler.js';
|
|
12
|
+
export * from './oauth/jwks-service.js';
|
|
13
|
+
export * from './oauth/router.js';
|
|
14
|
+
export * from './oauth/revoke-handler.js';
|
|
15
|
+
export * from './oauth/service-auth-middleware.js';
|
|
16
|
+
export * from './oauth/session-resolver.js';
|
|
17
|
+
export * from './oauth/state-store-types.js';
|
|
18
|
+
export * from './oauth/state-codec.js';
|
|
19
|
+
export * from './oauth/token-handler.js';
|
|
20
|
+
export * from './oauth/userinfo-handler.js';
|
|
21
|
+
export * from './oauth/wellknown-handler.js';
|
|
6
22
|
export * from './ports.js';
|
|
7
23
|
export * from './route-handlers.js';
|
|
8
24
|
export * from './router.js';
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import type { Context } from 'hono';
|
|
2
|
+
|
|
3
|
+
import type { AuthHonoPorts } from '../ports.js';
|
|
4
|
+
import type { OauthClientRecord } from './state-store-types.js';
|
|
5
|
+
import type { OAuthContinuationCodec, OAuthContinuationState } from './state-codec.js';
|
|
6
|
+
import { appendParams, oauthJsonError, redirectWithOAuthError } from './http-utils.js';
|
|
7
|
+
import { resolveOAuthAcr, resolveOAuthSession } from './session-resolver.js';
|
|
8
|
+
|
|
9
|
+
export interface OAuthAuthorizeHandlerOptions {
|
|
10
|
+
consentUrl: string;
|
|
11
|
+
issuer: string;
|
|
12
|
+
loginUrl: string;
|
|
13
|
+
ports: AuthHonoPorts;
|
|
14
|
+
stateCodec: OAuthContinuationCodec;
|
|
15
|
+
stateTtlSeconds?: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface ValidatedAuthorizeRequest {
|
|
19
|
+
client: OauthClientRecord;
|
|
20
|
+
codeChallenge: string;
|
|
21
|
+
dpopJkt: string | null;
|
|
22
|
+
nonce: string | null;
|
|
23
|
+
redirectUri: string;
|
|
24
|
+
scope: string;
|
|
25
|
+
state: string | null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const createOAuthAuthorizeHandler =
|
|
29
|
+
(options: OAuthAuthorizeHandlerOptions) =>
|
|
30
|
+
async (c: Context): Promise<Response> => {
|
|
31
|
+
const continuation = c.req.query('continue');
|
|
32
|
+
if (continuation) {
|
|
33
|
+
return resumeLoginContinuation(c, options, continuation);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const validation = await validateAuthorizeRequest(c, options.ports);
|
|
37
|
+
if (validation instanceof Response) return validation;
|
|
38
|
+
|
|
39
|
+
const prompt = c.req.query('prompt') ?? '';
|
|
40
|
+
const session = await resolveOAuthSession(c.req.raw, options.ports);
|
|
41
|
+
|
|
42
|
+
if (!session || prompt === 'login') {
|
|
43
|
+
if (prompt === 'none') {
|
|
44
|
+
return redirectWithOAuthError(validation.redirectUri, 'login_required', validation.state, c.req.url);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const continuation = await sealContinuation(c, options, validation);
|
|
48
|
+
return c.redirect(appendParams(options.loginUrl, { continue: continuation }, c.req.url), 302);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (prompt === 'none') {
|
|
52
|
+
return redirectWithOAuthError(validation.redirectUri, 'consent_required', validation.state, c.req.url);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const sealedState = await sealContinuation(c, options, validation, {
|
|
56
|
+
acr: resolveOAuthAcr(session.sessionRecord),
|
|
57
|
+
authTime: session.sessionRecord.createdAt.toISOString(),
|
|
58
|
+
userId: session.user.id,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
return c.redirect(appendParams(options.consentUrl, { state: sealedState }, c.req.url), 302);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const resumeLoginContinuation = async (
|
|
65
|
+
c: Context,
|
|
66
|
+
options: OAuthAuthorizeHandlerOptions,
|
|
67
|
+
continuation: string
|
|
68
|
+
): Promise<Response> => {
|
|
69
|
+
const payload = await options.stateCodec.unseal(continuation);
|
|
70
|
+
const now = options.ports.clock.now();
|
|
71
|
+
if (!payload || payload.userId || payload.codeChallengeMethod !== 'S256' || new Date(payload.expiresAt) <= now) {
|
|
72
|
+
return oauthJsonError(c, 400, 'invalid_request', 'OAuth continuation is invalid or expired.');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const client = await options.ports.oauthStateStore.findClient(payload.clientId);
|
|
76
|
+
if (!client) return oauthJsonError(c, 400, 'invalid_request', 'Unknown OAuth client.');
|
|
77
|
+
|
|
78
|
+
const redirectError = validateRedirectUri(client, payload.redirectUri);
|
|
79
|
+
if (redirectError) return oauthJsonError(c, 400, 'invalid_request', redirectError);
|
|
80
|
+
|
|
81
|
+
const scopeResult = validateScope(payload.scope, client, payload.redirectUri, payload.state, c.req.url);
|
|
82
|
+
if (scopeResult instanceof Response) return scopeResult;
|
|
83
|
+
|
|
84
|
+
const session = await resolveOAuthSession(c.req.raw, options.ports);
|
|
85
|
+
if (!session) {
|
|
86
|
+
return c.redirect(appendParams(options.loginUrl, { continue: continuation }, c.req.url), 302);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const expiresAt = options.ports.clock.addSeconds(now, options.stateTtlSeconds ?? 10 * 60);
|
|
90
|
+
const sealedState = await options.stateCodec.seal({
|
|
91
|
+
...payload,
|
|
92
|
+
acr: resolveOAuthAcr(session.sessionRecord),
|
|
93
|
+
authTime: session.sessionRecord.createdAt.toISOString(),
|
|
94
|
+
createdAt: now.toISOString(),
|
|
95
|
+
expiresAt: expiresAt.toISOString(),
|
|
96
|
+
scope: scopeResult,
|
|
97
|
+
userId: session.user.id,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
return c.redirect(appendParams(options.consentUrl, { state: sealedState }, c.req.url), 302);
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const validateAuthorizeRequest = async (
|
|
104
|
+
c: Context,
|
|
105
|
+
ports: AuthHonoPorts
|
|
106
|
+
): Promise<ValidatedAuthorizeRequest | Response> => {
|
|
107
|
+
const clientId = c.req.query('client_id');
|
|
108
|
+
const client = clientId ? await ports.oauthStateStore.findClient(clientId) : null;
|
|
109
|
+
if (!client) {
|
|
110
|
+
return oauthJsonError(c, 400, 'invalid_request', 'Unknown OAuth client.');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const redirectUri = c.req.query('redirect_uri') ?? '';
|
|
114
|
+
const redirectError = validateRedirectUri(client, redirectUri);
|
|
115
|
+
if (redirectError) {
|
|
116
|
+
return oauthJsonError(c, 400, 'invalid_request', redirectError);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const state = c.req.query('state') ?? null;
|
|
120
|
+
if (c.req.query('response_type') !== 'code') {
|
|
121
|
+
return redirectWithOAuthError(redirectUri, 'unsupported_response_type', state, c.req.url);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const codeChallenge = c.req.query('code_challenge') ?? '';
|
|
125
|
+
if (!codeChallenge || c.req.query('code_challenge_method') !== 'S256') {
|
|
126
|
+
return redirectWithOAuthError(redirectUri, 'invalid_request', state, c.req.url);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const scopeResult = validateScope(c.req.query('scope') ?? '', client, redirectUri, state, c.req.url);
|
|
130
|
+
if (scopeResult instanceof Response) return scopeResult;
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
client,
|
|
134
|
+
codeChallenge,
|
|
135
|
+
dpopJkt: c.req.query('dpop_jkt') ?? null,
|
|
136
|
+
nonce: c.req.query('nonce') ?? null,
|
|
137
|
+
redirectUri,
|
|
138
|
+
scope: scopeResult,
|
|
139
|
+
state,
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const validateRedirectUri = (client: OauthClientRecord, redirectUri: string): string | null => {
|
|
144
|
+
if (!client.redirectUris.includes(redirectUri)) return 'redirect_uri is not registered for this client.';
|
|
145
|
+
|
|
146
|
+
let parsed: URL;
|
|
147
|
+
try {
|
|
148
|
+
parsed = new URL(redirectUri);
|
|
149
|
+
} catch {
|
|
150
|
+
return 'redirect_uri must be an absolute URI.';
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (parsed.hash) return 'redirect_uri must not contain a fragment.';
|
|
154
|
+
if (parsed.username || parsed.password) return 'redirect_uri must not contain credentials.';
|
|
155
|
+
if (parsed.protocol === 'https:') return null;
|
|
156
|
+
if (parsed.protocol === 'http:' && ['localhost', '127.0.0.1'].includes(parsed.hostname)) return null;
|
|
157
|
+
return 'redirect_uri must use https except for localhost development callbacks.';
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
const validateScope = (
|
|
161
|
+
scope: string,
|
|
162
|
+
client: OauthClientRecord,
|
|
163
|
+
redirectUri: string,
|
|
164
|
+
state: string | null,
|
|
165
|
+
baseUrl: string
|
|
166
|
+
): string | Response => {
|
|
167
|
+
const requestedScopes = scope.split(/\s+/).filter(Boolean);
|
|
168
|
+
if (requestedScopes.includes('offline_access')) {
|
|
169
|
+
return redirectWithOAuthError(redirectUri, 'invalid_scope', state, baseUrl);
|
|
170
|
+
}
|
|
171
|
+
if (requestedScopes.some((requestedScope) => !client.allowedScopes.includes(requestedScope))) {
|
|
172
|
+
return redirectWithOAuthError(redirectUri, 'invalid_scope', state, baseUrl);
|
|
173
|
+
}
|
|
174
|
+
return requestedScopes.join(' ');
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
const sealContinuation = async (
|
|
178
|
+
c: Context,
|
|
179
|
+
options: OAuthAuthorizeHandlerOptions,
|
|
180
|
+
request: ValidatedAuthorizeRequest,
|
|
181
|
+
session?: Pick<OAuthContinuationState, 'acr' | 'authTime' | 'userId'>
|
|
182
|
+
): Promise<string> => {
|
|
183
|
+
const now = options.ports.clock.now();
|
|
184
|
+
const expiresAt = options.ports.clock.addSeconds(now, options.stateTtlSeconds ?? 10 * 60);
|
|
185
|
+
return options.stateCodec.seal({
|
|
186
|
+
acr: session?.acr,
|
|
187
|
+
authTime: session?.authTime,
|
|
188
|
+
clientId: request.client.clientId,
|
|
189
|
+
codeChallenge: request.codeChallenge,
|
|
190
|
+
codeChallengeMethod: 'S256',
|
|
191
|
+
createdAt: now.toISOString(),
|
|
192
|
+
dpopJkt: request.dpopJkt,
|
|
193
|
+
expiresAt: expiresAt.toISOString(),
|
|
194
|
+
nonce: request.nonce,
|
|
195
|
+
redirectUri: request.redirectUri,
|
|
196
|
+
scope: request.scope,
|
|
197
|
+
state: request.state,
|
|
198
|
+
tenantId: request.client.tenantId,
|
|
199
|
+
userId: session?.userId,
|
|
200
|
+
});
|
|
201
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Context } from 'hono';
|
|
2
|
+
|
|
3
|
+
import type { AuthHonoPorts } from '../ports.js';
|
|
4
|
+
import { appendParams, oauthJsonError, redirectOrJson } from './http-utils.js';
|
|
5
|
+
import type { OAuthContinuationCodec, OAuthContinuationState } from './state-codec.js';
|
|
6
|
+
import { resolveOAuthSession } from './session-resolver.js';
|
|
7
|
+
|
|
8
|
+
export interface OAuthConsentHandlerOptions {
|
|
9
|
+
authorizationCodeTtlSeconds?: number;
|
|
10
|
+
ports: AuthHonoPorts;
|
|
11
|
+
stateCodec: OAuthContinuationCodec;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const createOAuthConsentDetailsHandler =
|
|
15
|
+
(options: OAuthConsentHandlerOptions) =>
|
|
16
|
+
async (c: Context): Promise<Response> => {
|
|
17
|
+
const state = c.req.query('state') ?? '';
|
|
18
|
+
const payload = await validateConsentState(c, options, state);
|
|
19
|
+
if (payload instanceof Response) return payload;
|
|
20
|
+
|
|
21
|
+
const client = await options.ports.oauthStateStore.findClient(payload.clientId);
|
|
22
|
+
if (!client) return oauthJsonError(c, 400, 'invalid_request', 'Unknown OAuth client.');
|
|
23
|
+
|
|
24
|
+
return c.json({
|
|
25
|
+
clientName: client.name,
|
|
26
|
+
redirectUri: payload.redirectUri,
|
|
27
|
+
scopes: payload.scope.split(/\s+/).filter(Boolean),
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const createOAuthConsentDecisionHandler =
|
|
32
|
+
(options: OAuthConsentHandlerOptions) =>
|
|
33
|
+
async (c: Context): Promise<Response> => {
|
|
34
|
+
const body = await c.req.json<{ decision?: string; state?: string }>().catch(() => null);
|
|
35
|
+
if (!body?.state || !['approve', 'deny'].includes(body.decision ?? '')) {
|
|
36
|
+
return oauthJsonError(c, 400, 'invalid_request', 'Consent decision and state are required.');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const payload = await validateConsentState(c, options, body.state);
|
|
40
|
+
if (payload instanceof Response) return payload;
|
|
41
|
+
|
|
42
|
+
if (body.decision === 'deny') {
|
|
43
|
+
return redirectOrJson(
|
|
44
|
+
c,
|
|
45
|
+
appendParams(payload.redirectUri, { error: 'access_denied', state: payload.state }, c.req.url)
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const code = options.ports.random.token(32);
|
|
50
|
+
const now = options.ports.clock.now();
|
|
51
|
+
await options.ports.oauthStateStore.saveAuthCode(
|
|
52
|
+
code,
|
|
53
|
+
{
|
|
54
|
+
acr: payload.acr ?? 'urn:sentropic:loa:bearer',
|
|
55
|
+
authTime: new Date(payload.authTime ?? now.toISOString()),
|
|
56
|
+
clientId: payload.clientId,
|
|
57
|
+
codeChallenge: payload.codeChallenge,
|
|
58
|
+
codeChallengeMethod: 'S256',
|
|
59
|
+
createdAt: now,
|
|
60
|
+
dpopJkt: payload.dpopJkt,
|
|
61
|
+
expiresAt: options.ports.clock.addSeconds(now, options.authorizationCodeTtlSeconds ?? 60),
|
|
62
|
+
nonce: payload.nonce,
|
|
63
|
+
redirectUri: payload.redirectUri,
|
|
64
|
+
scope: payload.scope,
|
|
65
|
+
tenantId: payload.tenantId,
|
|
66
|
+
userId: payload.userId ?? '',
|
|
67
|
+
},
|
|
68
|
+
options.authorizationCodeTtlSeconds ?? 60
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return redirectOrJson(
|
|
72
|
+
c,
|
|
73
|
+
appendParams(payload.redirectUri, { code, state: payload.state }, c.req.url)
|
|
74
|
+
);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const validateConsentState = async (
|
|
78
|
+
c: Context,
|
|
79
|
+
options: OAuthConsentHandlerOptions,
|
|
80
|
+
sealedState: string
|
|
81
|
+
): Promise<OAuthContinuationState | Response> => {
|
|
82
|
+
const payload = await options.stateCodec.unseal(sealedState);
|
|
83
|
+
if (!payload || !payload.userId || new Date(payload.expiresAt) <= options.ports.clock.now()) {
|
|
84
|
+
return oauthJsonError(c, 400, 'invalid_request', 'OAuth consent state is invalid or expired.');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const session = await resolveOAuthSession(c.req.raw, options.ports);
|
|
88
|
+
if (!session || session.user.id !== payload.userId) {
|
|
89
|
+
return oauthJsonError(c, 401, 'login_required', 'A valid user session is required.');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return payload;
|
|
93
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const textEncoder = new TextEncoder();
|
|
2
|
+
|
|
3
|
+
export const sha256Base64url = async (value: string): Promise<string> => {
|
|
4
|
+
const digest = await crypto.subtle.digest('SHA-256', textEncoder.encode(value));
|
|
5
|
+
return base64urlEncode(new Uint8Array(digest));
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const base64urlEncode = (bytes: Uint8Array): string => {
|
|
9
|
+
let binary = '';
|
|
10
|
+
for (const byte of bytes) {
|
|
11
|
+
binary += String.fromCharCode(byte);
|
|
12
|
+
}
|
|
13
|
+
return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/u, '');
|
|
14
|
+
};
|