@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.
Files changed (95) hide show
  1. package/README.md +168 -1
  2. package/dist/contracts.d.ts +1 -1
  3. package/dist/contracts.d.ts.map +1 -1
  4. package/dist/contracts.js +2 -0
  5. package/dist/contracts.js.map +1 -1
  6. package/dist/index.d.ts +16 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +16 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/oauth/authorize-handler.d.ts +13 -0
  11. package/dist/oauth/authorize-handler.d.ts.map +1 -0
  12. package/dist/oauth/authorize-handler.js +143 -0
  13. package/dist/oauth/authorize-handler.js.map +1 -0
  14. package/dist/oauth/consent-decision-handler.d.ts +11 -0
  15. package/dist/oauth/consent-decision-handler.d.ts.map +1 -0
  16. package/dist/oauth/consent-decision-handler.js +58 -0
  17. package/dist/oauth/consent-decision-handler.js.map +1 -0
  18. package/dist/oauth/crypto-utils.d.ts +3 -0
  19. package/dist/oauth/crypto-utils.d.ts.map +1 -0
  20. package/dist/oauth/crypto-utils.js +13 -0
  21. package/dist/oauth/crypto-utils.js.map +1 -0
  22. package/dist/oauth/dpop.d.ts +18 -0
  23. package/dist/oauth/dpop.d.ts.map +1 -0
  24. package/dist/oauth/dpop.js +54 -0
  25. package/dist/oauth/dpop.js.map +1 -0
  26. package/dist/oauth/http-utils.d.ts +6 -0
  27. package/dist/oauth/http-utils.d.ts.map +1 -0
  28. package/dist/oauth/http-utils.js +27 -0
  29. package/dist/oauth/http-utils.js.map +1 -0
  30. package/dist/oauth/introspect-handler.d.ts +8 -0
  31. package/dist/oauth/introspect-handler.d.ts.map +1 -0
  32. package/dist/oauth/introspect-handler.js +63 -0
  33. package/dist/oauth/introspect-handler.js.map +1 -0
  34. package/dist/oauth/jwks-service.d.ts +25 -0
  35. package/dist/oauth/jwks-service.d.ts.map +1 -0
  36. package/dist/oauth/jwks-service.js +61 -0
  37. package/dist/oauth/jwks-service.js.map +1 -0
  38. package/dist/oauth/revoke-handler.d.ts +8 -0
  39. package/dist/oauth/revoke-handler.d.ts.map +1 -0
  40. package/dist/oauth/revoke-handler.js +55 -0
  41. package/dist/oauth/revoke-handler.js.map +1 -0
  42. package/dist/oauth/router.d.ts +8 -0
  43. package/dist/oauth/router.d.ts.map +1 -0
  44. package/dist/oauth/router.js +30 -0
  45. package/dist/oauth/router.js.map +1 -0
  46. package/dist/oauth/service-auth-middleware.d.ts +30 -0
  47. package/dist/oauth/service-auth-middleware.d.ts.map +1 -0
  48. package/dist/oauth/service-auth-middleware.js +170 -0
  49. package/dist/oauth/service-auth-middleware.js.map +1 -0
  50. package/dist/oauth/session-resolver.d.ts +9 -0
  51. package/dist/oauth/session-resolver.d.ts.map +1 -0
  52. package/dist/oauth/session-resolver.js +28 -0
  53. package/dist/oauth/session-resolver.js.map +1 -0
  54. package/dist/oauth/state-codec.d.ts +25 -0
  55. package/dist/oauth/state-codec.d.ts.map +1 -0
  56. package/dist/oauth/state-codec.js +60 -0
  57. package/dist/oauth/state-codec.js.map +1 -0
  58. package/dist/oauth/state-store-types.d.ts +100 -0
  59. package/dist/oauth/state-store-types.d.ts.map +1 -0
  60. package/dist/oauth/state-store-types.js +2 -0
  61. package/dist/oauth/state-store-types.js.map +1 -0
  62. package/dist/oauth/token-handler.d.ts +12 -0
  63. package/dist/oauth/token-handler.d.ts.map +1 -0
  64. package/dist/oauth/token-handler.js +294 -0
  65. package/dist/oauth/token-handler.js.map +1 -0
  66. package/dist/oauth/userinfo-handler.d.ts +9 -0
  67. package/dist/oauth/userinfo-handler.d.ts.map +1 -0
  68. package/dist/oauth/userinfo-handler.js +93 -0
  69. package/dist/oauth/userinfo-handler.js.map +1 -0
  70. package/dist/oauth/wellknown-handler.d.ts +9 -0
  71. package/dist/oauth/wellknown-handler.d.ts.map +1 -0
  72. package/dist/oauth/wellknown-handler.js +37 -0
  73. package/dist/oauth/wellknown-handler.js.map +1 -0
  74. package/dist/ports.d.ts +4 -0
  75. package/dist/ports.d.ts.map +1 -1
  76. package/package.json +1 -1
  77. package/src/contracts.ts +2 -0
  78. package/src/index.ts +16 -0
  79. package/src/oauth/authorize-handler.ts +201 -0
  80. package/src/oauth/consent-decision-handler.ts +93 -0
  81. package/src/oauth/crypto-utils.ts +14 -0
  82. package/src/oauth/dpop.ts +93 -0
  83. package/src/oauth/http-utils.ts +58 -0
  84. package/src/oauth/introspect-handler.ts +88 -0
  85. package/src/oauth/jwks-service.ts +103 -0
  86. package/src/oauth/revoke-handler.ts +70 -0
  87. package/src/oauth/router.ts +42 -0
  88. package/src/oauth/service-auth-middleware.ts +250 -0
  89. package/src/oauth/session-resolver.ts +48 -0
  90. package/src/oauth/state-codec.ts +98 -0
  91. package/src/oauth/state-store-types.ts +109 -0
  92. package/src/oauth/token-handler.ts +423 -0
  93. package/src/oauth/userinfo-handler.ts +129 -0
  94. package/src/oauth/wellknown-handler.ts +52 -0
  95. 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
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentropic/auth-hono",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "description": "Reusable Hono authentication route factories, contracts, and server-side auth helpers for Sentropic-compatible apps.",
5
5
  "type": "module",
6
6
  "license": "MIT",
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
+ };