@siriux/auth 1.0.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/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +56 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +171 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +18 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/types/index.d.ts +63 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +52 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './types';
|
|
2
|
+
export * from './middleware';
|
|
3
|
+
export { AuthenticationError, AuthMiddleware, createAuthMiddleware } from './middleware/auth';
|
|
4
|
+
export { UserRole, JwtPayload, AuthenticatedUser, AuthTokens, AuthConfig } from './types';
|
|
5
|
+
export declare const SIRIUX_AUTH_VERSION = "1.0.0";
|
|
6
|
+
import { AuthConfig } from './types';
|
|
7
|
+
export declare const createDefaultAuthConfig: (overrides: Partial<AuthConfig>) => AuthConfig;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAG7B,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1F,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAG3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,eAAO,MAAM,uBAAuB,GAAI,WAAW,OAAO,CAAC,UAAU,CAAC,KAAG,UAWxE,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.createDefaultAuthConfig = exports.SIRIUX_AUTH_VERSION = exports.UserRole = exports.createAuthMiddleware = exports.AuthMiddleware = exports.AuthenticationError = void 0;
|
|
18
|
+
// Core exports
|
|
19
|
+
__exportStar(require("./types"), exports);
|
|
20
|
+
__exportStar(require("./middleware"), exports);
|
|
21
|
+
// Re-export commonly used classes and functions
|
|
22
|
+
var auth_1 = require("./middleware/auth");
|
|
23
|
+
Object.defineProperty(exports, "AuthenticationError", { enumerable: true, get: function () { return auth_1.AuthenticationError; } });
|
|
24
|
+
Object.defineProperty(exports, "AuthMiddleware", { enumerable: true, get: function () { return auth_1.AuthMiddleware; } });
|
|
25
|
+
Object.defineProperty(exports, "createAuthMiddleware", { enumerable: true, get: function () { return auth_1.createAuthMiddleware; } });
|
|
26
|
+
var types_1 = require("./types");
|
|
27
|
+
Object.defineProperty(exports, "UserRole", { enumerable: true, get: function () { return types_1.UserRole; } });
|
|
28
|
+
// Version information
|
|
29
|
+
exports.SIRIUX_AUTH_VERSION = '1.0.0';
|
|
30
|
+
const createDefaultAuthConfig = (overrides) => {
|
|
31
|
+
const defaultConfig = {
|
|
32
|
+
jwtSecret: process.env.JWT_SECRET || 'your-super-secret-jwt-key',
|
|
33
|
+
jwtRefreshSecret: process.env.JWT_REFRESH_SECRET || 'your-super-secret-refresh-key',
|
|
34
|
+
tokenExpiry: '24h',
|
|
35
|
+
refreshExpiry: '7d',
|
|
36
|
+
issuer: 'siriux',
|
|
37
|
+
audience: 'siriux-users'
|
|
38
|
+
};
|
|
39
|
+
return { ...defaultConfig, ...overrides };
|
|
40
|
+
};
|
|
41
|
+
exports.createDefaultAuthConfig = createDefaultAuthConfig;
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,eAAe;AACf,0CAAwB;AACxB,+CAA6B;AAE7B,gDAAgD;AAChD,0CAA8F;AAArF,2GAAA,mBAAmB,OAAA;AAAE,sGAAA,cAAc,OAAA;AAAE,4GAAA,oBAAoB,OAAA;AAClE,iCAA0F;AAAjF,iGAAA,QAAQ,OAAA;AAEjB,sBAAsB;AACT,QAAA,mBAAmB,GAAG,OAAO,CAAC;AAKpC,MAAM,uBAAuB,GAAG,CAAC,SAA8B,EAAc,EAAE;IACpF,MAAM,aAAa,GAAe;QAChC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,2BAA2B;QAChE,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,+BAA+B;QACnF,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,cAAc;KACzB,CAAC;IAEF,OAAO,EAAE,GAAG,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;AAC5C,CAAC,CAAC;AAXW,QAAA,uBAAuB,2BAWlC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import { JwtPayload } from 'jsonwebtoken';
|
|
3
|
+
import { UserRole, AuthenticatedUser, AuthConfig } from '../types';
|
|
4
|
+
export interface AuthenticatedRequest extends Request {
|
|
5
|
+
user?: JwtPayload;
|
|
6
|
+
authenticatedUser?: AuthenticatedUser;
|
|
7
|
+
}
|
|
8
|
+
export declare class AuthenticationError extends Error {
|
|
9
|
+
code: string;
|
|
10
|
+
constructor(message: string, code: string);
|
|
11
|
+
}
|
|
12
|
+
export declare class AuthMiddleware {
|
|
13
|
+
private jwtSecret;
|
|
14
|
+
private config;
|
|
15
|
+
constructor(config: AuthConfig);
|
|
16
|
+
/**
|
|
17
|
+
* Middleware to verify JWT tokens
|
|
18
|
+
*/
|
|
19
|
+
tokenAuth: (req: AuthenticatedRequest, res: Response, next: NextFunction) => void | Response;
|
|
20
|
+
/**
|
|
21
|
+
* Middleware to require admin role
|
|
22
|
+
*/
|
|
23
|
+
adminAuth: (req: AuthenticatedRequest, res: Response, next: NextFunction) => void | Response;
|
|
24
|
+
/**
|
|
25
|
+
* Middleware to require specific role
|
|
26
|
+
*/
|
|
27
|
+
roleAuth: (requiredRole: UserRole) => (req: AuthenticatedRequest, res: Response, next: NextFunction) => void | Response;
|
|
28
|
+
/**
|
|
29
|
+
* Middleware for optional authentication (doesn't fail if no token)
|
|
30
|
+
*/
|
|
31
|
+
optionalAuth: (req: AuthenticatedRequest, res: Response, next: NextFunction) => void;
|
|
32
|
+
/**
|
|
33
|
+
* Generate JWT access token
|
|
34
|
+
*/
|
|
35
|
+
generateAccessToken(payload: Omit<JwtPayload, 'iat' | 'exp'>): string;
|
|
36
|
+
/**
|
|
37
|
+
* Generate JWT refresh token
|
|
38
|
+
*/
|
|
39
|
+
generateRefreshToken(userId: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Verify refresh token
|
|
42
|
+
*/
|
|
43
|
+
verifyRefreshToken(token: string): {
|
|
44
|
+
userId: string;
|
|
45
|
+
type: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Generate both access and refresh tokens
|
|
49
|
+
*/
|
|
50
|
+
generateTokenPair(user: AuthenticatedUser): {
|
|
51
|
+
accessToken: string;
|
|
52
|
+
refreshToken: string;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export declare const createAuthMiddleware: (config: AuthConfig) => AuthMiddleware;
|
|
56
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEnE,MAAM,WAAW,oBAAqB,SAAQ,OAAO;IACnD,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IACR,IAAI,EAAE,MAAM;gBAApC,OAAO,EAAE,MAAM,EAAS,IAAI,EAAE,MAAM;CAIjD;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAQ9B;;OAEG;IACI,SAAS,GAAI,KAAK,oBAAoB,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,GAAG,QAAQ,CAuDhG;IAEF;;OAEG;IACI,SAAS,GAAI,KAAK,oBAAoB,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,GAAG,QAAQ,CAShG;IAEF;;OAEG;IACI,QAAQ,GAAI,cAAc,QAAQ,MAC/B,KAAK,oBAAoB,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,GAAG,QAAQ,CAUtF;IAEF;;OAEG;IACI,YAAY,GAAI,KAAK,oBAAoB,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,UAcjF;IAEF;;OAEG;IACI,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG,MAAM;IAQ5E;;OAEG;IACI,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAQnD;;OAEG;IACI,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAI1E;;OAEG;IACI,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;CAYjG;AAGD,eAAO,MAAM,oBAAoB,GAAI,QAAQ,UAAU,KAAG,cAEzD,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createAuthMiddleware = exports.AuthMiddleware = exports.AuthenticationError = void 0;
|
|
7
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
|
+
const types_1 = require("../types");
|
|
9
|
+
class AuthenticationError extends Error {
|
|
10
|
+
constructor(message, code) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.name = 'AuthenticationError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.AuthenticationError = AuthenticationError;
|
|
17
|
+
class AuthMiddleware {
|
|
18
|
+
constructor(config) {
|
|
19
|
+
/**
|
|
20
|
+
* Middleware to verify JWT tokens
|
|
21
|
+
*/
|
|
22
|
+
this.tokenAuth = (req, res, next) => {
|
|
23
|
+
try {
|
|
24
|
+
const authHeader = req.headers.authorization;
|
|
25
|
+
const token = typeof authHeader === 'string' ? authHeader.split(' ')[1] : undefined;
|
|
26
|
+
if (!token) {
|
|
27
|
+
throw new AuthenticationError('No token provided', 'TOKEN_MISSING');
|
|
28
|
+
}
|
|
29
|
+
// Validate token format
|
|
30
|
+
if (typeof token !== 'string' || token.split('.').length !== 3) {
|
|
31
|
+
throw new AuthenticationError('Invalid token format', 'INVALID_FORMAT');
|
|
32
|
+
}
|
|
33
|
+
const decoded = jsonwebtoken_1.default.verify(token, this.jwtSecret);
|
|
34
|
+
req.user = decoded;
|
|
35
|
+
next();
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (error instanceof AuthenticationError) {
|
|
39
|
+
return res.status(401).json({
|
|
40
|
+
success: false,
|
|
41
|
+
error: error.message,
|
|
42
|
+
code: error.code
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
// Handle specific JWT errors
|
|
46
|
+
if (error instanceof Error) {
|
|
47
|
+
if (error.name === 'JsonWebTokenError') {
|
|
48
|
+
return res.status(401).json({
|
|
49
|
+
success: false,
|
|
50
|
+
error: 'Invalid token specified',
|
|
51
|
+
code: 'INVALID_TOKEN'
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
else if (error.name === 'TokenExpiredError') {
|
|
55
|
+
return res.status(401).json({
|
|
56
|
+
success: false,
|
|
57
|
+
error: 'Token expired',
|
|
58
|
+
code: 'TOKEN_EXPIRED'
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
else if (error.name === 'NotBeforeError') {
|
|
62
|
+
return res.status(401).json({
|
|
63
|
+
success: false,
|
|
64
|
+
error: 'Token not active',
|
|
65
|
+
code: 'TOKEN_NOT_ACTIVE'
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return res.status(401).json({
|
|
70
|
+
success: false,
|
|
71
|
+
error: 'Token verification failed',
|
|
72
|
+
code: 'VERIFICATION_FAILED'
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Middleware to require admin role
|
|
78
|
+
*/
|
|
79
|
+
this.adminAuth = (req, res, next) => {
|
|
80
|
+
if (!req.user || req.user.role !== types_1.UserRole.ADMIN) {
|
|
81
|
+
return res.status(403).json({
|
|
82
|
+
success: false,
|
|
83
|
+
error: 'Admin access required',
|
|
84
|
+
code: 'ADMIN_REQUIRED'
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
next();
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Middleware to require specific role
|
|
91
|
+
*/
|
|
92
|
+
this.roleAuth = (requiredRole) => {
|
|
93
|
+
return (req, res, next) => {
|
|
94
|
+
if (!req.user || req.user.role !== requiredRole) {
|
|
95
|
+
return res.status(403).json({
|
|
96
|
+
success: false,
|
|
97
|
+
error: `${requiredRole} access required`,
|
|
98
|
+
code: 'ROLE_REQUIRED'
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
next();
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Middleware for optional authentication (doesn't fail if no token)
|
|
106
|
+
*/
|
|
107
|
+
this.optionalAuth = (req, res, next) => {
|
|
108
|
+
try {
|
|
109
|
+
const authHeader = req.headers.authorization;
|
|
110
|
+
const token = typeof authHeader === 'string' ? authHeader.split(' ')[1] : undefined;
|
|
111
|
+
if (token) {
|
|
112
|
+
const decoded = jsonwebtoken_1.default.verify(token, this.jwtSecret);
|
|
113
|
+
req.user = decoded;
|
|
114
|
+
}
|
|
115
|
+
next();
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
// Optional auth - continue without user if token is invalid
|
|
119
|
+
next();
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
this.config = config;
|
|
123
|
+
this.jwtSecret = config.jwtSecret;
|
|
124
|
+
if (!this.jwtSecret) {
|
|
125
|
+
throw new AuthenticationError('JWT_SECRET is required', 'MISSING_SECRET');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Generate JWT access token
|
|
130
|
+
*/
|
|
131
|
+
generateAccessToken(payload) {
|
|
132
|
+
return jsonwebtoken_1.default.sign(payload, this.jwtSecret, {
|
|
133
|
+
expiresIn: '24h',
|
|
134
|
+
issuer: 'siriux',
|
|
135
|
+
audience: 'siriux-users'
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Generate JWT refresh token
|
|
140
|
+
*/
|
|
141
|
+
generateRefreshToken(userId) {
|
|
142
|
+
return jsonwebtoken_1.default.sign({ userId, type: 'refresh' }, this.config.jwtRefreshSecret || this.jwtSecret, { expiresIn: '7d' });
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Verify refresh token
|
|
146
|
+
*/
|
|
147
|
+
verifyRefreshToken(token) {
|
|
148
|
+
return jsonwebtoken_1.default.verify(token, this.config.jwtRefreshSecret || this.jwtSecret);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Generate both access and refresh tokens
|
|
152
|
+
*/
|
|
153
|
+
generateTokenPair(user) {
|
|
154
|
+
const payload = {
|
|
155
|
+
userId: user.id,
|
|
156
|
+
email: user.email,
|
|
157
|
+
role: user.role
|
|
158
|
+
};
|
|
159
|
+
return {
|
|
160
|
+
accessToken: this.generateAccessToken(payload),
|
|
161
|
+
refreshToken: this.generateRefreshToken(user.id)
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
exports.AuthMiddleware = AuthMiddleware;
|
|
166
|
+
// Factory function to create middleware instance
|
|
167
|
+
const createAuthMiddleware = (config) => {
|
|
168
|
+
return new AuthMiddleware(config);
|
|
169
|
+
};
|
|
170
|
+
exports.createAuthMiddleware = createAuthMiddleware;
|
|
171
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./auth"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export declare enum UserRole {
|
|
2
|
+
USER = "user",
|
|
3
|
+
ADMIN = "admin"
|
|
4
|
+
}
|
|
5
|
+
export interface JwtPayload {
|
|
6
|
+
userId: string;
|
|
7
|
+
email: string;
|
|
8
|
+
role: UserRole;
|
|
9
|
+
iat?: number;
|
|
10
|
+
exp?: number;
|
|
11
|
+
iss?: string;
|
|
12
|
+
aud?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface AuthenticatedUser {
|
|
15
|
+
id: string;
|
|
16
|
+
email: string;
|
|
17
|
+
role: UserRole;
|
|
18
|
+
createdAt: Date;
|
|
19
|
+
updatedAt: Date;
|
|
20
|
+
}
|
|
21
|
+
export interface LoginCredentials {
|
|
22
|
+
email: string;
|
|
23
|
+
password: string;
|
|
24
|
+
}
|
|
25
|
+
export interface RegisterData {
|
|
26
|
+
email: string;
|
|
27
|
+
password: string;
|
|
28
|
+
firstName?: string;
|
|
29
|
+
lastName?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface AuthTokens {
|
|
32
|
+
accessToken: string;
|
|
33
|
+
refreshToken: string;
|
|
34
|
+
}
|
|
35
|
+
export interface AuthResponse {
|
|
36
|
+
success: boolean;
|
|
37
|
+
user?: AuthenticatedUser;
|
|
38
|
+
tokens?: AuthTokens;
|
|
39
|
+
error?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface AuthConfig {
|
|
42
|
+
jwtSecret: string;
|
|
43
|
+
jwtRefreshSecret: string;
|
|
44
|
+
tokenExpiry?: string;
|
|
45
|
+
refreshExpiry?: string;
|
|
46
|
+
issuer?: string;
|
|
47
|
+
audience?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface AuthMiddlewareConfig {
|
|
50
|
+
jwtSecret: string;
|
|
51
|
+
jwtRefreshSecret: string;
|
|
52
|
+
database?: {
|
|
53
|
+
type: 'sqlite' | 'postgresql' | 'mysql';
|
|
54
|
+
connection: string;
|
|
55
|
+
options?: Record<string, any>;
|
|
56
|
+
};
|
|
57
|
+
features?: {
|
|
58
|
+
mfa?: boolean;
|
|
59
|
+
sso?: boolean;
|
|
60
|
+
emailVerification?: boolean;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,OAAO,CAAC;QACxC,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC/B,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,CAAC;CACH"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UserRole = void 0;
|
|
4
|
+
var UserRole;
|
|
5
|
+
(function (UserRole) {
|
|
6
|
+
UserRole["USER"] = "user";
|
|
7
|
+
UserRole["ADMIN"] = "admin";
|
|
8
|
+
})(UserRole || (exports.UserRole = UserRole = {}));
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;AAAA,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,yBAAa,CAAA;IACb,2BAAe,CAAA;AACjB,CAAC,EAHW,QAAQ,wBAAR,QAAQ,QAGnB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@siriux/auth",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Siriux Authentication - JWT authentication and session management",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"dev": "tsc --watch",
|
|
10
|
+
"test": "jest",
|
|
11
|
+
"clean": "rm -rf dist",
|
|
12
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"siriux",
|
|
16
|
+
"authentication",
|
|
17
|
+
"jwt",
|
|
18
|
+
"express",
|
|
19
|
+
"session",
|
|
20
|
+
"login",
|
|
21
|
+
"register"
|
|
22
|
+
],
|
|
23
|
+
"author": "jawwad@alsirius.co.uk",
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"express": "^4.18.2",
|
|
27
|
+
"jsonwebtoken": "^9.0.2",
|
|
28
|
+
"bcryptjs": "^2.4.3",
|
|
29
|
+
"joi": "^17.11.0",
|
|
30
|
+
"cors": "^2.8.5",
|
|
31
|
+
"dotenv": "^16.3.1",
|
|
32
|
+
"uuid": "^9.0.1",
|
|
33
|
+
"winston": "^3.11.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^20.10.5",
|
|
37
|
+
"@types/express": "^4.17.21",
|
|
38
|
+
"@types/jsonwebtoken": "^9.0.5",
|
|
39
|
+
"@types/bcryptjs": "^2.4.6",
|
|
40
|
+
"@types/cors": "^2.8.17",
|
|
41
|
+
"@types/uuid": "^9.0.7",
|
|
42
|
+
"typescript": "^5.3.3",
|
|
43
|
+
"jest": "^29.7.0",
|
|
44
|
+
"@types/jest": "^29.5.8"
|
|
45
|
+
},
|
|
46
|
+
"files": [
|
|
47
|
+
"dist/**/*"
|
|
48
|
+
],
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public"
|
|
51
|
+
}
|
|
52
|
+
}
|