@vonosan/auth 0.2.1
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/__tests__/passkey.test.d.ts +11 -0
- package/dist/__tests__/passkey.test.d.ts.map +1 -0
- package/dist/__tests__/passkey.test.js +87 -0
- package/dist/__tests__/passkey.test.js.map +1 -0
- package/dist/composables/useAuth.d.ts +43 -0
- package/dist/composables/useAuth.d.ts.map +1 -0
- package/dist/composables/useAuth.js +133 -0
- package/dist/composables/useAuth.js.map +1 -0
- package/dist/composables/usePasskey.d.ts +72 -0
- package/dist/composables/usePasskey.d.ts.map +1 -0
- package/dist/composables/usePasskey.js +289 -0
- package/dist/composables/usePasskey.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/jwt.d.ts +30 -0
- package/dist/lib/jwt.d.ts.map +1 -0
- package/dist/lib/jwt.js +43 -0
- package/dist/lib/jwt.js.map +1 -0
- package/dist/lib/otp.d.ts +23 -0
- package/dist/lib/otp.d.ts.map +1 -0
- package/dist/lib/otp.js +50 -0
- package/dist/lib/otp.js.map +1 -0
- package/dist/lib/passkey.d.ts +139 -0
- package/dist/lib/passkey.d.ts.map +1 -0
- package/dist/lib/passkey.js +401 -0
- package/dist/lib/passkey.js.map +1 -0
- package/dist/lib/password.d.ts +20 -0
- package/dist/lib/password.d.ts.map +1 -0
- package/dist/lib/password.js +77 -0
- package/dist/lib/password.js.map +1 -0
- package/dist/middleware/auth.middleware.d.ts +50 -0
- package/dist/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/middleware/auth.middleware.js +194 -0
- package/dist/middleware/auth.middleware.js.map +1 -0
- package/dist/passkey-schema.d.ts +375 -0
- package/dist/passkey-schema.d.ts.map +1 -0
- package/dist/passkey-schema.js +63 -0
- package/dist/passkey-schema.js.map +1 -0
- package/dist/routes/auth.routes.d.ts +16 -0
- package/dist/routes/auth.routes.d.ts.map +1 -0
- package/dist/routes/auth.routes.js +81 -0
- package/dist/routes/auth.routes.js.map +1 -0
- package/dist/routes/passkey.routes.d.ts +16 -0
- package/dist/routes/passkey.routes.d.ts.map +1 -0
- package/dist/routes/passkey.routes.js +127 -0
- package/dist/routes/passkey.routes.js.map +1 -0
- package/dist/schema.d.ts +547 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +81 -0
- package/dist/schema.js.map +1 -0
- package/dist/service/auth.service.d.ts +73 -0
- package/dist/service/auth.service.d.ts.map +1 -0
- package/dist/service/auth.service.js +249 -0
- package/dist/service/auth.service.js.map +1 -0
- package/dist/service/passkey.service.d.ts +65 -0
- package/dist/service/passkey.service.d.ts.map +1 -0
- package/dist/service/passkey.service.js +202 -0
- package/dist/service/passkey.service.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
import { Hono } from 'hono';
|
|
11
|
+
import { zValidator } from '@hono/zod-validator';
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
import { ApiResponse } from 'vonosan/server';
|
|
14
|
+
import { AuthService } from '../service/auth.service.js';
|
|
15
|
+
// ─── Schemas ─────────────────────────────────────────────────────────────────
|
|
16
|
+
const RegisterSchema = z.object({
|
|
17
|
+
email: z.string().email(),
|
|
18
|
+
password: z.string().min(8),
|
|
19
|
+
username: z.string().min(3).optional(),
|
|
20
|
+
});
|
|
21
|
+
const LoginSchema = z.object({
|
|
22
|
+
email: z.string().email(),
|
|
23
|
+
password: z.string().min(1),
|
|
24
|
+
});
|
|
25
|
+
const ForgotPasswordSchema = z.object({
|
|
26
|
+
email: z.string().email(),
|
|
27
|
+
});
|
|
28
|
+
const ResetPasswordSchema = z.object({
|
|
29
|
+
email: z.string().email(),
|
|
30
|
+
otp: z.string().length(6),
|
|
31
|
+
password: z.string().min(8),
|
|
32
|
+
});
|
|
33
|
+
const RefreshSchema = z.object({
|
|
34
|
+
refreshToken: z.string().min(1),
|
|
35
|
+
});
|
|
36
|
+
// ─── Router ───────────────────────────────────────────────────────────────────
|
|
37
|
+
const authRouter = new Hono();
|
|
38
|
+
authRouter.post('/register', zValidator('json', RegisterSchema), async (c) => {
|
|
39
|
+
const { email, password, username } = c.req.valid('json');
|
|
40
|
+
const service = new AuthService(c.var.db, c.var.config.JWT_SECRET);
|
|
41
|
+
const account = await service.register(email, password, username);
|
|
42
|
+
return c.json(ApiResponse.success(account, 'Account created successfully'), 201);
|
|
43
|
+
});
|
|
44
|
+
authRouter.post('/login', zValidator('json', LoginSchema), async (c) => {
|
|
45
|
+
const { email, password } = c.req.valid('json');
|
|
46
|
+
const ip = c.req.header('CF-Connecting-IP') ?? c.req.header('X-Forwarded-For');
|
|
47
|
+
const userAgent = c.req.header('User-Agent');
|
|
48
|
+
const service = new AuthService(c.var.db, c.var.config.JWT_SECRET);
|
|
49
|
+
const tokens = await service.login(email, password, ip, userAgent);
|
|
50
|
+
return c.json(ApiResponse.success(tokens, 'Login successful'));
|
|
51
|
+
});
|
|
52
|
+
authRouter.post('/refresh', zValidator('json', RefreshSchema), async (c) => {
|
|
53
|
+
const { refreshToken } = c.req.valid('json');
|
|
54
|
+
const service = new AuthService(c.var.db, c.var.config.JWT_SECRET);
|
|
55
|
+
const tokens = await service.refresh(refreshToken);
|
|
56
|
+
return c.json(ApiResponse.success(tokens, 'Token refreshed'));
|
|
57
|
+
});
|
|
58
|
+
authRouter.post('/logout', async (c) => {
|
|
59
|
+
const body = await c.req.json().catch(() => null);
|
|
60
|
+
const sessionId = body?.sessionId;
|
|
61
|
+
if (sessionId) {
|
|
62
|
+
const service = new AuthService(c.var.db, c.var.config.JWT_SECRET);
|
|
63
|
+
await service.logout(sessionId);
|
|
64
|
+
}
|
|
65
|
+
return c.json(ApiResponse.success(null, 'Logged out successfully'));
|
|
66
|
+
});
|
|
67
|
+
authRouter.post('/forgot-password', zValidator('json', ForgotPasswordSchema), async (c) => {
|
|
68
|
+
const { email } = c.req.valid('json');
|
|
69
|
+
const service = new AuthService(c.var.db, c.var.config.JWT_SECRET);
|
|
70
|
+
// OTP is returned — caller is responsible for sending it via email
|
|
71
|
+
await service.forgotPassword(email);
|
|
72
|
+
return c.json(ApiResponse.success(null, 'If that email exists, a reset code has been sent'));
|
|
73
|
+
});
|
|
74
|
+
authRouter.post('/reset-password', zValidator('json', ResetPasswordSchema), async (c) => {
|
|
75
|
+
const { email, otp, password } = c.req.valid('json');
|
|
76
|
+
const service = new AuthService(c.var.db, c.var.config.JWT_SECRET);
|
|
77
|
+
await service.resetPassword(email, otp, password);
|
|
78
|
+
return c.json(ApiResponse.success(null, 'Password reset successfully'));
|
|
79
|
+
});
|
|
80
|
+
export default authRouter;
|
|
81
|
+
//# sourceMappingURL=auth.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.routes.js","sourceRoot":"","sources":["../../src/routes/auth.routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
import { Hono } from 'hono';
|
|
11
|
+
import type { AppVariables } from 'vonosan/types';
|
|
12
|
+
declare const passkeyRoutes: Hono<{
|
|
13
|
+
Variables: AppVariables;
|
|
14
|
+
}, import("hono/types").BlankSchema, "/">;
|
|
15
|
+
export default passkeyRoutes;
|
|
16
|
+
//# sourceMappingURL=passkey.routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passkey.routes.d.ts","sourceRoot":"","sources":["../../src/routes/passkey.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAMjD,QAAA,MAAM,aAAa;eAAyB,YAAY;yCAAK,CAAA;AA6J7D,eAAe,aAAa,CAAA"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ──────────────────────────────────────────────────────────────────
|
|
3
|
+
* 🏢 Company Name: Bonifade Technologies
|
|
4
|
+
* 👨💻 Developer: Bowofade Oyerinde
|
|
5
|
+
* 🐙 GitHub: oyenet1
|
|
6
|
+
* 📅 Created Date: 2026-04-05
|
|
7
|
+
* 🔄 Updated Date: 2026-04-05
|
|
8
|
+
* ──────────────────────────────────────────────────────────────────
|
|
9
|
+
*/
|
|
10
|
+
import { Hono } from 'hono';
|
|
11
|
+
import { success, error } from 'vonosan/server';
|
|
12
|
+
import { PasskeyService } from '../service/passkey.service.js';
|
|
13
|
+
import { authMiddleware } from '../middleware/auth.middleware.js';
|
|
14
|
+
const passkeyRoutes = new Hono();
|
|
15
|
+
// ─── Helper to build PasskeyService from context ─────────────────────────────
|
|
16
|
+
function getService(c) {
|
|
17
|
+
const db = c.var.db;
|
|
18
|
+
const config = c.var.config;
|
|
19
|
+
const origin = config.CLIENT_URL || 'http://localhost:5173';
|
|
20
|
+
const rpId = new URL(origin).hostname;
|
|
21
|
+
return new PasskeyService(db, {
|
|
22
|
+
rpId,
|
|
23
|
+
rpName: 'Vono App',
|
|
24
|
+
origin,
|
|
25
|
+
jwtSecret: config.JWT_SECRET,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// ─── Registration ─────────────────────────────────────────────────────────────
|
|
29
|
+
/**
|
|
30
|
+
* POST /auth/passkey/register/begin
|
|
31
|
+
* Requires: authenticated user (JWT)
|
|
32
|
+
* Returns: PublicKeyCredentialCreationOptions
|
|
33
|
+
*/
|
|
34
|
+
passkeyRoutes.post('/register/begin', authMiddleware, async (c) => {
|
|
35
|
+
const account = c.var.account;
|
|
36
|
+
const service = getService(c);
|
|
37
|
+
const options = await service.beginRegistration(account.id, account.username || account.email, account.email);
|
|
38
|
+
return c.json(success('Registration challenge created', options));
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* POST /auth/passkey/register/finish
|
|
42
|
+
* Requires: authenticated user (JWT)
|
|
43
|
+
* Body: { response: RegistrationResponse, name?: string }
|
|
44
|
+
*/
|
|
45
|
+
passkeyRoutes.post('/register/finish', authMiddleware, async (c) => {
|
|
46
|
+
const account = c.var.account;
|
|
47
|
+
const body = await c.req.json();
|
|
48
|
+
if (!body.response) {
|
|
49
|
+
return c.json(error('Missing registration response'), 422);
|
|
50
|
+
}
|
|
51
|
+
const service = getService(c);
|
|
52
|
+
const result = await service.finishRegistration(account.id, body.response, body.name);
|
|
53
|
+
return c.json(success('Passkey registered successfully', result), 201);
|
|
54
|
+
});
|
|
55
|
+
// ─── Authentication ───────────────────────────────────────────────────────────
|
|
56
|
+
/**
|
|
57
|
+
* POST /auth/passkey/auth/begin
|
|
58
|
+
* Public endpoint — no JWT required
|
|
59
|
+
* Body: { accountId?: string } (omit for usernameless flow)
|
|
60
|
+
* Returns: PublicKeyCredentialRequestOptions
|
|
61
|
+
*/
|
|
62
|
+
passkeyRoutes.post('/auth/begin', async (c) => {
|
|
63
|
+
const body = await c.req.json().catch(() => ({}));
|
|
64
|
+
const service = getService(c);
|
|
65
|
+
const options = await service.beginAuthentication(body.accountId);
|
|
66
|
+
return c.json(success('Authentication challenge created', options));
|
|
67
|
+
});
|
|
68
|
+
/**
|
|
69
|
+
* POST /auth/passkey/auth/finish
|
|
70
|
+
* Public endpoint — no JWT required
|
|
71
|
+
* Body: { response: AuthenticationResponse }
|
|
72
|
+
* Returns: { accessToken, refreshToken }
|
|
73
|
+
*/
|
|
74
|
+
passkeyRoutes.post('/auth/finish', async (c) => {
|
|
75
|
+
const body = await c.req.json();
|
|
76
|
+
if (!body.response) {
|
|
77
|
+
return c.json(error('Missing authentication response'), 422);
|
|
78
|
+
}
|
|
79
|
+
const service = getService(c);
|
|
80
|
+
const result = await service.finishAuthentication(body.response);
|
|
81
|
+
return c.json(success('Authentication successful', {
|
|
82
|
+
accessToken: result.accessToken,
|
|
83
|
+
refreshToken: result.refreshToken,
|
|
84
|
+
accountId: result.accountId,
|
|
85
|
+
}));
|
|
86
|
+
});
|
|
87
|
+
// ─── Credential management ────────────────────────────────────────────────────
|
|
88
|
+
/**
|
|
89
|
+
* GET /auth/passkey/credentials
|
|
90
|
+
* Requires: authenticated user
|
|
91
|
+
* Returns: list of passkeys for the current user
|
|
92
|
+
*/
|
|
93
|
+
passkeyRoutes.get('/credentials', authMiddleware, async (c) => {
|
|
94
|
+
const account = c.var.account;
|
|
95
|
+
const service = getService(c);
|
|
96
|
+
const credentials = await service.listCredentials(account.id);
|
|
97
|
+
return c.json(success('Passkeys retrieved', credentials));
|
|
98
|
+
});
|
|
99
|
+
/**
|
|
100
|
+
* PATCH /auth/passkey/credentials/:credentialId
|
|
101
|
+
* Requires: authenticated user
|
|
102
|
+
* Body: { name: string }
|
|
103
|
+
*/
|
|
104
|
+
passkeyRoutes.patch('/credentials/:credentialId', authMiddleware, async (c) => {
|
|
105
|
+
const account = c.var.account;
|
|
106
|
+
const credentialId = c.req.param('credentialId');
|
|
107
|
+
const body = await c.req.json();
|
|
108
|
+
if (!body.name) {
|
|
109
|
+
return c.json(error('Name is required'), 422);
|
|
110
|
+
}
|
|
111
|
+
const service = getService(c);
|
|
112
|
+
await service.renameCredential(credentialId, account.id, body.name);
|
|
113
|
+
return c.json(success('Passkey renamed', null));
|
|
114
|
+
});
|
|
115
|
+
/**
|
|
116
|
+
* DELETE /auth/passkey/credentials/:credentialId
|
|
117
|
+
* Requires: authenticated user
|
|
118
|
+
*/
|
|
119
|
+
passkeyRoutes.delete('/credentials/:credentialId', authMiddleware, async (c) => {
|
|
120
|
+
const account = c.var.account;
|
|
121
|
+
const credentialId = c.req.param('credentialId');
|
|
122
|
+
const service = getService(c);
|
|
123
|
+
await service.deleteCredential(credentialId, account.id);
|
|
124
|
+
return c.json(success('Passkey deleted', null));
|
|
125
|
+
});
|
|
126
|
+
export default passkeyRoutes;
|
|
127
|
+
//# sourceMappingURL=passkey.routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passkey.routes.js","sourceRoot":"","sources":["../../src/routes/passkey.routes.ts"],"names":[],"mappings":"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"}
|