@boopkit/cap-users 0.1.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/capability.json +50 -0
- package/dist/account-management-service.d.ts +52 -0
- package/dist/account-management-service.d.ts.map +1 -0
- package/dist/account-management-service.js +140 -0
- package/dist/account-management-service.js.map +1 -0
- package/dist/account-property-service.d.ts +18 -0
- package/dist/account-property-service.d.ts.map +1 -0
- package/dist/account-property-service.js +19 -0
- package/dist/account-property-service.js.map +1 -0
- package/dist/account-service.d.ts +84 -0
- package/dist/account-service.d.ts.map +1 -0
- package/dist/account-service.js +136 -0
- package/dist/account-service.js.map +1 -0
- package/dist/auth-middleware.d.ts +50 -0
- package/dist/auth-middleware.d.ts.map +1 -0
- package/dist/auth-middleware.js +149 -0
- package/dist/auth-middleware.js.map +1 -0
- package/dist/auth-service.d.ts +112 -0
- package/dist/auth-service.d.ts.map +1 -0
- package/dist/auth-service.js +575 -0
- package/dist/auth-service.js.map +1 -0
- package/dist/identity-service.d.ts +48 -0
- package/dist/identity-service.d.ts.map +1 -0
- package/dist/identity-service.js +98 -0
- package/dist/identity-service.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/team-invitation-service.d.ts +61 -0
- package/dist/team-invitation-service.d.ts.map +1 -0
- package/dist/team-invitation-service.js +237 -0
- package/dist/team-invitation-service.js.map +1 -0
- package/dist/types.d.ts +92 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +24 -0
- package/dist/types.js.map +1 -0
- package/dist/user-property-service.d.ts +18 -0
- package/dist/user-property-service.d.ts.map +1 -0
- package/dist/user-property-service.js +19 -0
- package/dist/user-property-service.js.map +1 -0
- package/dist/user-service.d.ts +47 -0
- package/dist/user-service.d.ts.map +1 -0
- package/dist/user-service.js +39 -0
- package/dist/user-service.js.map +1 -0
- package/package.json +31 -0
- package/scaffold/prisma/schema/accounts.prisma +47 -0
- package/scaffold/prisma/schema/users.prisma +47 -0
- package/scaffold/reference/user-auth.ref.md +237 -0
- package/scaffold/src/controllers/auth.ts +158 -0
- package/scaffold/src/middleware/auth.ts +28 -0
- package/scaffold/src/routes/auth.ts +20 -0
- package/scaffold/src/services/accounts.service.ts +53 -0
- package/scaffold/src/services/users.service.ts +46 -0
- package/scaffold/styles/auth.css +120 -0
- package/scaffold/views/login.hbs +28 -0
- package/scaffold/views/partials/auth-nav.hbs +32 -0
- package/scaffold/views/signup.hbs +29 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Auth middleware factories for Express.
|
|
4
|
+
*
|
|
5
|
+
* Provides three middleware functions:
|
|
6
|
+
* - `ensureVisitor` — resolves session from auth_id cookie, creates anonymous visitor if missing
|
|
7
|
+
* - `requireAuth` — gates routes by trust tier, redirects web / 401s API
|
|
8
|
+
* - `addAuthContext` — populates res.locals.auth for view templates
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.createAuthMiddleware = createAuthMiddleware;
|
|
12
|
+
const auth_service_js_1 = require("./auth-service.js");
|
|
13
|
+
// ---------- Constants ----------
|
|
14
|
+
const ONE_YEAR_MS = 365 * 24 * 60 * 60 * 1000;
|
|
15
|
+
const TEN_YEARS_MS = 10 * ONE_YEAR_MS;
|
|
16
|
+
// ---------- Factory ----------
|
|
17
|
+
/**
|
|
18
|
+
* Create auth middleware functions wired to the auth, identity, and user services.
|
|
19
|
+
*/
|
|
20
|
+
function createAuthMiddleware(deps, options) {
|
|
21
|
+
const { authService, identityService, userService } = deps;
|
|
22
|
+
const cookieName = options?.cookieName ?? 'auth_id';
|
|
23
|
+
const cookieMaxAge = options?.cookieMaxAge ?? ONE_YEAR_MS;
|
|
24
|
+
const visitorCookieName = options?.visitorCookieName ?? 'visitor_id';
|
|
25
|
+
const visitorCookieMaxAge = options?.visitorCookieMaxAge ?? TEN_YEARS_MS;
|
|
26
|
+
const loginPath = options?.loginPath ?? '/login';
|
|
27
|
+
/**
|
|
28
|
+
* ensureVisitor — two-cookie pattern:
|
|
29
|
+
* 1. Resolve/create visitor_id cookie (long-lived tracking, never rotated)
|
|
30
|
+
* 2. Resolve/create auth_id cookie (session authentication, rotated on login)
|
|
31
|
+
* Sets req.user, req.sessionToken, and req.visitorToken.
|
|
32
|
+
*/
|
|
33
|
+
function ensureVisitor(req, res, next) {
|
|
34
|
+
resolveVisitor(req, res).then(() => next()).catch(next);
|
|
35
|
+
}
|
|
36
|
+
async function resolveVisitor(req, res) {
|
|
37
|
+
let user;
|
|
38
|
+
let sessionToken;
|
|
39
|
+
let visitorToken;
|
|
40
|
+
// --- Phase 1: Resolve user from existing cookies ---
|
|
41
|
+
// Try auth_id first (most authoritative for current session)
|
|
42
|
+
const rawAuthToken = req.cookies?.[cookieName];
|
|
43
|
+
if (rawAuthToken) {
|
|
44
|
+
const identity = await identityService.findByDomainAndKey('cookie', (0, auth_service_js_1.hashToken)(rawAuthToken));
|
|
45
|
+
if (identity) {
|
|
46
|
+
const u = await userService.findById(identity.userId);
|
|
47
|
+
if (u) {
|
|
48
|
+
user = u;
|
|
49
|
+
sessionToken = rawAuthToken;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Try visitor_id (fallback if auth_id missing/stale)
|
|
54
|
+
const rawVisitorToken = req.cookies?.[visitorCookieName];
|
|
55
|
+
if (rawVisitorToken) {
|
|
56
|
+
const identity = await identityService.findByDomainAndKey('cookie', (0, auth_service_js_1.hashToken)(rawVisitorToken));
|
|
57
|
+
if (identity) {
|
|
58
|
+
if (!user) {
|
|
59
|
+
user = await userService.findById(identity.userId) ?? undefined;
|
|
60
|
+
}
|
|
61
|
+
visitorToken = rawVisitorToken;
|
|
62
|
+
}
|
|
63
|
+
// If identity not found, visitor cookie is stale — will be replaced below
|
|
64
|
+
}
|
|
65
|
+
// --- Phase 2: Create missing resources ---
|
|
66
|
+
// Create user if neither cookie resolved one
|
|
67
|
+
if (!user) {
|
|
68
|
+
user = await userService.create({ type: 'user' });
|
|
69
|
+
}
|
|
70
|
+
// Ensure visitor_id cookie exists
|
|
71
|
+
if (!visitorToken) {
|
|
72
|
+
visitorToken = (0, auth_service_js_1.generateToken)();
|
|
73
|
+
await identityService.create(user.id, 'cookie', (0, auth_service_js_1.hashToken)(visitorToken));
|
|
74
|
+
res.cookie(visitorCookieName, visitorToken, { maxAge: visitorCookieMaxAge, httpOnly: true });
|
|
75
|
+
}
|
|
76
|
+
// Ensure auth_id session cookie exists
|
|
77
|
+
if (!sessionToken) {
|
|
78
|
+
sessionToken = await authService.generateSessionToken(user.id);
|
|
79
|
+
res.cookie(cookieName, sessionToken, { maxAge: cookieMaxAge, httpOnly: true });
|
|
80
|
+
}
|
|
81
|
+
req.user = user;
|
|
82
|
+
req.sessionToken = sessionToken;
|
|
83
|
+
req.visitorToken = visitorToken;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* requireAuth — middleware factory. Checks trust tier for the current session.
|
|
87
|
+
* Web routes: redirects to /login?next=<current_url>.
|
|
88
|
+
* API routes: returns 401 JSON.
|
|
89
|
+
*/
|
|
90
|
+
function requireAuth(requiredTrust = 'authenticated') {
|
|
91
|
+
return function requireAuthMiddleware(req, res, next) {
|
|
92
|
+
checkAuth(req, res, next, requiredTrust).catch(next);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async function checkAuth(req, res, next, requiredTrust) {
|
|
96
|
+
const user = req.user;
|
|
97
|
+
const sessionToken = req.sessionToken;
|
|
98
|
+
if (!user || !sessionToken) {
|
|
99
|
+
return denyAccess(req, res);
|
|
100
|
+
}
|
|
101
|
+
const authorized = await authService.isAuthorized(user.id, sessionToken, requiredTrust);
|
|
102
|
+
if (!authorized) {
|
|
103
|
+
return denyAccess(req, res);
|
|
104
|
+
}
|
|
105
|
+
next();
|
|
106
|
+
}
|
|
107
|
+
function isApiRequest(req) {
|
|
108
|
+
return req.path.startsWith('/api/') || req.path.startsWith('/api');
|
|
109
|
+
}
|
|
110
|
+
function denyAccess(req, res) {
|
|
111
|
+
if (isApiRequest(req)) {
|
|
112
|
+
res.status(401).json({ error: 'Unauthorized' });
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const next = encodeURIComponent(req.originalUrl);
|
|
116
|
+
res.redirect(`${loginPath}?next=${next}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* addAuthContext — populates res.locals.auth with trust tier and user info for views.
|
|
121
|
+
*/
|
|
122
|
+
function addAuthContext(req, res, next) {
|
|
123
|
+
populateAuthContext(req, res).then(() => next()).catch(next);
|
|
124
|
+
}
|
|
125
|
+
async function populateAuthContext(req, res) {
|
|
126
|
+
const user = req.user;
|
|
127
|
+
const sessionToken = req.sessionToken;
|
|
128
|
+
if (!user || !sessionToken) {
|
|
129
|
+
res.locals.auth = { trustTier: null, userName: null, userEmail: null, userInitial: null };
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const trustTier = await authService.getTrustTier(user.id, sessionToken);
|
|
133
|
+
const name = user.info.name ?? null;
|
|
134
|
+
const email = user.info.email ?? null;
|
|
135
|
+
const userInitial = (name ?? email ?? '?')[0].toUpperCase();
|
|
136
|
+
res.locals.auth = {
|
|
137
|
+
trustTier,
|
|
138
|
+
userName: name,
|
|
139
|
+
userEmail: email,
|
|
140
|
+
userInitial,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
ensureVisitor,
|
|
145
|
+
requireAuth,
|
|
146
|
+
addAuthContext,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=auth-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-middleware.js","sourceRoot":"","sources":["../src/auth-middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { PropertyRecord } from '@boopkit/cap-services';
|
|
2
|
+
import type { AuthorizationGrant, BaseUserInfo, TrustTier, User, UserAuthentication, UserIdentity } from './types.js';
|
|
3
|
+
import type { UserService } from './user-service.js';
|
|
4
|
+
import type { IdentityService } from './identity-service.js';
|
|
5
|
+
import type { UserPropertyService } from './user-property-service.js';
|
|
6
|
+
/** Thrown when signup/login input validation fails. */
|
|
7
|
+
export declare class AuthValidationError extends Error {
|
|
8
|
+
readonly field: string;
|
|
9
|
+
constructor(field: string, message: string);
|
|
10
|
+
}
|
|
11
|
+
/** Thrown on login failure — generic message to prevent user enumeration. */
|
|
12
|
+
export declare class AuthError extends Error {
|
|
13
|
+
constructor(message?: string);
|
|
14
|
+
}
|
|
15
|
+
/** Input shape for signup. */
|
|
16
|
+
export interface SignupInput {
|
|
17
|
+
email: string;
|
|
18
|
+
password: string;
|
|
19
|
+
passwordConfirmation: string;
|
|
20
|
+
name?: string;
|
|
21
|
+
}
|
|
22
|
+
/** Result of a successful signup. */
|
|
23
|
+
export interface SignupResult {
|
|
24
|
+
user: User<BaseUserInfo>;
|
|
25
|
+
sessionToken: string;
|
|
26
|
+
}
|
|
27
|
+
/** Result of a successful login. */
|
|
28
|
+
export interface LoginResult {
|
|
29
|
+
user: User<BaseUserInfo>;
|
|
30
|
+
sessionToken: string;
|
|
31
|
+
}
|
|
32
|
+
/** Dependencies injected into createAuthService. */
|
|
33
|
+
export interface AuthServiceDeps {
|
|
34
|
+
userService: UserService<BaseUserInfo>;
|
|
35
|
+
identityService: IdentityService;
|
|
36
|
+
userPropertyService: UserPropertyService;
|
|
37
|
+
}
|
|
38
|
+
/** Result of a successful email verification. */
|
|
39
|
+
export interface VerifyEmailResult {
|
|
40
|
+
userId: number;
|
|
41
|
+
email: string;
|
|
42
|
+
}
|
|
43
|
+
/** Options for createAuthService. */
|
|
44
|
+
export interface AuthServiceOptions {
|
|
45
|
+
onSignup?(result: SignupResult): void | Promise<void>;
|
|
46
|
+
onLogin?(result: LoginResult): void | Promise<void>;
|
|
47
|
+
defaultSessionDuration?: number;
|
|
48
|
+
hashRounds?: number;
|
|
49
|
+
verificationTokenTtl?: number;
|
|
50
|
+
}
|
|
51
|
+
/** Options for addAuthenticationMethod (OAuth tokens, etc.). */
|
|
52
|
+
export interface AddAuthMethodOptions {
|
|
53
|
+
refresh_token?: string;
|
|
54
|
+
access_token?: string;
|
|
55
|
+
access_token_expires_at?: number;
|
|
56
|
+
oauth_profile?: unknown;
|
|
57
|
+
}
|
|
58
|
+
/** The service object returned by createAuthService. */
|
|
59
|
+
export interface AuthService {
|
|
60
|
+
validateSignup(input: SignupInput): void;
|
|
61
|
+
createUser(input: Partial<BaseUserInfo> & {
|
|
62
|
+
name?: string;
|
|
63
|
+
}): Promise<User<BaseUserInfo>>;
|
|
64
|
+
createIdentity(userId: number, domain: string, key: string): Promise<UserIdentity>;
|
|
65
|
+
setProfile(userId: number, profileData: unknown): Promise<PropertyRecord>;
|
|
66
|
+
setCredentials(userId: number, strategy: string, secret: string): Promise<PropertyRecord>;
|
|
67
|
+
addAuthenticationMethod(userId: number, strategy: string, opts?: AddAuthMethodOptions): Promise<PropertyRecord>;
|
|
68
|
+
disableAuthenticationMethod(userId: number, strategy: string): Promise<PropertyRecord>;
|
|
69
|
+
setAuthorization(userId: number, identityKey: string, strategy: string, trust: TrustTier, expiresIn?: number): Promise<PropertyRecord>;
|
|
70
|
+
generateSessionToken(userId: number): Promise<string>;
|
|
71
|
+
validateCredentials(email: string, password: string): Promise<User<BaseUserInfo>>;
|
|
72
|
+
login(email: string, password: string, currentSessionToken?: string): Promise<LoginResult>;
|
|
73
|
+
rotateSession(userId: number, currentSessionToken?: string): Promise<string>;
|
|
74
|
+
getAuthenticationMethods(userId: number): Promise<UserAuthentication | null>;
|
|
75
|
+
getAuthorizationStatus(userId: number, identityKey: string): Promise<AuthorizationGrant | null>;
|
|
76
|
+
getTrustTier(userId: number, identityKey: string): Promise<TrustTier | null>;
|
|
77
|
+
isMethodAccepted(userId: number, strategy: string): Promise<boolean>;
|
|
78
|
+
isAuthorized(userId: number, identityKey: string, requiredTrust?: TrustTier): Promise<boolean>;
|
|
79
|
+
logout(userId: number, sessionToken: string): Promise<void>;
|
|
80
|
+
logoutAll(userId: number): Promise<void>;
|
|
81
|
+
forgetDevice(userId: number, sessionToken: string): Promise<void>;
|
|
82
|
+
forgetAllDevices(userId: number): Promise<void>;
|
|
83
|
+
setTrust(userId: number, identityKey: string, tier: TrustTier): Promise<PropertyRecord>;
|
|
84
|
+
createApiKey(userId: number): Promise<{
|
|
85
|
+
apiKey: string;
|
|
86
|
+
}>;
|
|
87
|
+
validateApiKey(apiKey: string): Promise<User<BaseUserInfo>>;
|
|
88
|
+
revokeApiKey(userId: number, apiKey: string): Promise<void>;
|
|
89
|
+
rotateApiKey(userId: number, currentApiKey: string): Promise<{
|
|
90
|
+
apiKey: string;
|
|
91
|
+
}>;
|
|
92
|
+
generateVerificationToken(userId: number): Promise<string>;
|
|
93
|
+
verifyEmail(token: string): Promise<VerifyEmailResult>;
|
|
94
|
+
signup(input: SignupInput): Promise<SignupResult>;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Generate a partitioned token with 128 bits of cryptographic randomness.
|
|
98
|
+
* Format: `XXXXXXXX-PP-YYYYYYYYYYYYYYYYY` (base36 uppercase).
|
|
99
|
+
* The partition segment is a data-routing hint (default '01').
|
|
100
|
+
*/
|
|
101
|
+
export declare function generateToken(partition?: string): string;
|
|
102
|
+
/**
|
|
103
|
+
* SHA-256 hash a token for storage. Input already has high entropy
|
|
104
|
+
* so a fast hash is sufficient (no need for bcrypt).
|
|
105
|
+
*/
|
|
106
|
+
export declare function hashToken(token: string): string;
|
|
107
|
+
/**
|
|
108
|
+
* Create an auth business service orchestrating signup, login, and
|
|
109
|
+
* session management on top of user data services.
|
|
110
|
+
*/
|
|
111
|
+
export declare function createAuthService(deps: AuthServiceDeps, options?: AuthServiceOptions): AuthService;
|
|
112
|
+
//# sourceMappingURL=auth-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-service.d.ts","sourceRoot":"","sources":["../src/auth-service.ts"],"names":[],"mappings":"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"}
|