couchloop-eq-mcp 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/LICENSE +21 -0
- package/README.md +358 -0
- package/assets/logo/README.md +12 -0
- package/assets/logo/couchloop_EQ-IconLogo.png +0 -0
- package/dist/auth/middleware.d.ts +8 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +59 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/clients/shrinkChatClient.d.ts +195 -0
- package/dist/clients/shrinkChatClient.d.ts.map +1 -0
- package/dist/clients/shrinkChatClient.js +349 -0
- package/dist/clients/shrinkChatClient.js.map +1 -0
- package/dist/db/client.d.ts +23 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +78 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/migrate.d.ts +4 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +34 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/migrations/schema.d.ts +1074 -0
- package/dist/db/migrations/schema.d.ts.map +1 -0
- package/dist/db/migrations/schema.js +160 -0
- package/dist/db/migrations/schema.js.map +1 -0
- package/dist/db/schema.d.ts +1213 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +157 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/seed.d.ts +4 -0
- package/dist/db/seed.d.ts.map +1 -0
- package/dist/db/seed.js +57 -0
- package/dist/db/seed.js.map +1 -0
- package/dist/db/seedOAuth.d.ts +4 -0
- package/dist/db/seedOAuth.d.ts.map +1 -0
- package/dist/db/seedOAuth.js +76 -0
- package/dist/db/seedOAuth.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/index.d.ts +11 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +56 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/journey-status.d.ts +2 -0
- package/dist/resources/journey-status.d.ts.map +1 -0
- package/dist/resources/journey-status.js +42 -0
- package/dist/resources/journey-status.js.map +1 -0
- package/dist/resources/session-summary.d.ts +2 -0
- package/dist/resources/session-summary.d.ts.map +1 -0
- package/dist/resources/session-summary.js +85 -0
- package/dist/resources/session-summary.js.map +1 -0
- package/dist/resources/user-context.d.ts +2 -0
- package/dist/resources/user-context.d.ts.map +1 -0
- package/dist/resources/user-context.js +79 -0
- package/dist/resources/user-context.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +385 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware/auth.d.ts +30 -0
- package/dist/server/middleware/auth.d.ts.map +1 -0
- package/dist/server/middleware/auth.js +157 -0
- package/dist/server/middleware/auth.js.map +1 -0
- package/dist/server/oauth/anomalyDetection.d.ts +146 -0
- package/dist/server/oauth/anomalyDetection.d.ts.map +1 -0
- package/dist/server/oauth/anomalyDetection.js +405 -0
- package/dist/server/oauth/anomalyDetection.js.map +1 -0
- package/dist/server/oauth/authServer.d.ts +61 -0
- package/dist/server/oauth/authServer.d.ts.map +1 -0
- package/dist/server/oauth/authServer.js +283 -0
- package/dist/server/oauth/authServer.js.map +1 -0
- package/dist/server/oauth/dpop.d.ts +135 -0
- package/dist/server/oauth/dpop.d.ts.map +1 -0
- package/dist/server/oauth/dpop.js +338 -0
- package/dist/server/oauth/dpop.js.map +1 -0
- package/dist/server/oauth/gdpr/consent.d.ts +173 -0
- package/dist/server/oauth/gdpr/consent.d.ts.map +1 -0
- package/dist/server/oauth/gdpr/consent.js +388 -0
- package/dist/server/oauth/gdpr/consent.js.map +1 -0
- package/dist/server/oauth/gdpr/dataPortability.d.ts +214 -0
- package/dist/server/oauth/gdpr/dataPortability.d.ts.map +1 -0
- package/dist/server/oauth/gdpr/dataPortability.js +486 -0
- package/dist/server/oauth/gdpr/dataPortability.js.map +1 -0
- package/dist/server/oauth/gdpr/index.d.ts +103 -0
- package/dist/server/oauth/gdpr/index.d.ts.map +1 -0
- package/dist/server/oauth/gdpr/index.js +273 -0
- package/dist/server/oauth/gdpr/index.js.map +1 -0
- package/dist/server/oauth/gdpr/rightToErasure.d.ts +184 -0
- package/dist/server/oauth/gdpr/rightToErasure.d.ts.map +1 -0
- package/dist/server/oauth/gdpr/rightToErasure.js +527 -0
- package/dist/server/oauth/gdpr/rightToErasure.js.map +1 -0
- package/dist/server/oauth/monitoring/securityMonitor.d.ts +218 -0
- package/dist/server/oauth/monitoring/securityMonitor.d.ts.map +1 -0
- package/dist/server/oauth/monitoring/securityMonitor.js +615 -0
- package/dist/server/oauth/monitoring/securityMonitor.js.map +1 -0
- package/dist/server/oauth/pkce.d.ts +61 -0
- package/dist/server/oauth/pkce.d.ts.map +1 -0
- package/dist/server/oauth/pkce.js +157 -0
- package/dist/server/oauth/pkce.js.map +1 -0
- package/dist/server/oauth/providers/base.d.ts +147 -0
- package/dist/server/oauth/providers/base.d.ts.map +1 -0
- package/dist/server/oauth/providers/base.js +312 -0
- package/dist/server/oauth/providers/base.js.map +1 -0
- package/dist/server/oauth/providers/github.d.ts +55 -0
- package/dist/server/oauth/providers/github.d.ts.map +1 -0
- package/dist/server/oauth/providers/github.js +225 -0
- package/dist/server/oauth/providers/github.js.map +1 -0
- package/dist/server/oauth/providers/google.d.ts +49 -0
- package/dist/server/oauth/providers/google.d.ts.map +1 -0
- package/dist/server/oauth/providers/google.js +153 -0
- package/dist/server/oauth/providers/google.js.map +1 -0
- package/dist/server/oauth/providers/index.d.ts +9 -0
- package/dist/server/oauth/providers/index.d.ts.map +1 -0
- package/dist/server/oauth/providers/index.js +24 -0
- package/dist/server/oauth/providers/index.js.map +1 -0
- package/dist/server/oauth/refreshTokenRotation.d.ts +114 -0
- package/dist/server/oauth/refreshTokenRotation.d.ts.map +1 -0
- package/dist/server/oauth/refreshTokenRotation.js +344 -0
- package/dist/server/oauth/refreshTokenRotation.js.map +1 -0
- package/dist/server/oauth/security.d.ts +101 -0
- package/dist/server/oauth/security.d.ts.map +1 -0
- package/dist/server/oauth/security.js +268 -0
- package/dist/server/oauth/security.js.map +1 -0
- package/dist/server/oauth/tokenEncryption.d.ts +80 -0
- package/dist/server/oauth/tokenEncryption.d.ts.map +1 -0
- package/dist/server/oauth/tokenEncryption.js +218 -0
- package/dist/server/oauth/tokenEncryption.js.map +1 -0
- package/dist/tools/checkpoint.d.ts +35 -0
- package/dist/tools/checkpoint.d.ts.map +1 -0
- package/dist/tools/checkpoint.js +125 -0
- package/dist/tools/checkpoint.js.map +1 -0
- package/dist/tools/index.d.ts +412 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +262 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/insight.d.ts +65 -0
- package/dist/tools/insight.d.ts.map +1 -0
- package/dist/tools/insight.js +190 -0
- package/dist/tools/insight.js.map +1 -0
- package/dist/tools/journey.d.ts +45 -0
- package/dist/tools/journey.d.ts.map +1 -0
- package/dist/tools/journey.js +115 -0
- package/dist/tools/journey.js.map +1 -0
- package/dist/tools/sendMessage.d.ts +6 -0
- package/dist/tools/sendMessage.d.ts.map +1 -0
- package/dist/tools/sendMessage.js +278 -0
- package/dist/tools/sendMessage.js.map +1 -0
- package/dist/tools/session.d.ts +106 -0
- package/dist/tools/session.d.ts.map +1 -0
- package/dist/tools/session.js +161 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/types/auth.d.ts +37 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +44 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/checkpoint.d.ts +25 -0
- package/dist/types/checkpoint.d.ts.map +1 -0
- package/dist/types/checkpoint.js +8 -0
- package/dist/types/checkpoint.js.map +1 -0
- package/dist/types/insight.d.ts +83 -0
- package/dist/types/insight.d.ts.map +1 -0
- package/dist/types/insight.js +14 -0
- package/dist/types/insight.js.map +1 -0
- package/dist/types/journey.d.ts +155 -0
- package/dist/types/journey.d.ts.map +1 -0
- package/dist/types/journey.js +29 -0
- package/dist/types/journey.js.map +1 -0
- package/dist/types/session.d.ts +82 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +13 -0
- package/dist/types/session.js.map +1 -0
- package/dist/utils/circuitBreaker.d.ts +86 -0
- package/dist/utils/circuitBreaker.d.ts.map +1 -0
- package/dist/utils/circuitBreaker.js +234 -0
- package/dist/utils/circuitBreaker.js.map +1 -0
- package/dist/utils/errorHandler.d.ts +101 -0
- package/dist/utils/errorHandler.d.ts.map +1 -0
- package/dist/utils/errorHandler.js +348 -0
- package/dist/utils/errorHandler.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +77 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +49 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/performanceMonitor.d.ts +106 -0
- package/dist/utils/performanceMonitor.d.ts.map +1 -0
- package/dist/utils/performanceMonitor.js +312 -0
- package/dist/utils/performanceMonitor.js.map +1 -0
- package/dist/utils/responseCache.d.ts +88 -0
- package/dist/utils/responseCache.d.ts.map +1 -0
- package/dist/utils/responseCache.js +245 -0
- package/dist/utils/responseCache.js.map +1 -0
- package/dist/utils/retryStrategy.d.ts +49 -0
- package/dist/utils/retryStrategy.d.ts.map +1 -0
- package/dist/utils/retryStrategy.js +167 -0
- package/dist/utils/retryStrategy.js.map +1 -0
- package/dist/workflows/definitions/daily-reflection.d.ts +3 -0
- package/dist/workflows/definitions/daily-reflection.d.ts.map +1 -0
- package/dist/workflows/definitions/daily-reflection.js +52 -0
- package/dist/workflows/definitions/daily-reflection.js.map +1 -0
- package/dist/workflows/definitions/gratitude-practice.d.ts +3 -0
- package/dist/workflows/definitions/gratitude-practice.d.ts.map +1 -0
- package/dist/workflows/definitions/gratitude-practice.js +52 -0
- package/dist/workflows/definitions/gratitude-practice.js.map +1 -0
- package/dist/workflows/definitions/weekly-review.d.ts +3 -0
- package/dist/workflows/definitions/weekly-review.d.ts.map +1 -0
- package/dist/workflows/definitions/weekly-review.js +74 -0
- package/dist/workflows/definitions/weekly-review.js.map +1 -0
- package/dist/workflows/engine.d.ts +21 -0
- package/dist/workflows/engine.d.ts.map +1 -0
- package/dist/workflows/engine.js +149 -0
- package/dist/workflows/engine.js.map +1 -0
- package/dist/workflows/index.d.ts +26 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +14 -0
- package/dist/workflows/index.js.map +1 -0
- package/package.json +98 -0
- package/run-mcp-server.sh +16 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { config } from 'dotenv';
|
|
2
|
+
// Load environment variables before class initialization
|
|
3
|
+
config({ path: '.env.local' });
|
|
4
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
5
|
+
import jwt from 'jsonwebtoken';
|
|
6
|
+
import bcrypt from 'bcryptjs';
|
|
7
|
+
import { getDb } from '../../db/client.js';
|
|
8
|
+
import { users, oauthClients, oauthTokens, authorizationCodes } from '../../db/schema.js';
|
|
9
|
+
import { eq, and } from 'drizzle-orm';
|
|
10
|
+
import { logger } from '../../utils/logger.js';
|
|
11
|
+
export class OAuthServer {
|
|
12
|
+
jwtSecret;
|
|
13
|
+
jwtExpiresIn;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.jwtSecret = process.env.JWT_SECRET || 'dev-secret-change-in-production';
|
|
16
|
+
this.jwtExpiresIn = process.env.JWT_EXPIRES_IN || '24h';
|
|
17
|
+
if (!process.env.JWT_SECRET) {
|
|
18
|
+
logger.warn('Using default JWT secret - CHANGE IN PRODUCTION!');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Validate client credentials
|
|
23
|
+
*/
|
|
24
|
+
async validateClient(clientId, clientSecret) {
|
|
25
|
+
const db = getDb();
|
|
26
|
+
try {
|
|
27
|
+
const [client] = await db
|
|
28
|
+
.select()
|
|
29
|
+
.from(oauthClients)
|
|
30
|
+
.where(eq(oauthClients.clientId, clientId))
|
|
31
|
+
.limit(1);
|
|
32
|
+
if (!client) {
|
|
33
|
+
logger.warn(`Invalid client ID: ${clientId}`);
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
// If secret provided, verify it
|
|
37
|
+
if (clientSecret) {
|
|
38
|
+
const validSecret = await bcrypt.compare(clientSecret, client.clientSecret);
|
|
39
|
+
if (!validSecret) {
|
|
40
|
+
logger.warn(`Invalid client secret for client: ${clientId}`);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
logger.error('Error validating client:', error);
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Generate authorization code for OAuth flow
|
|
53
|
+
*/
|
|
54
|
+
async generateAuthCode(clientId, userId, redirectUri, scope = 'read write') {
|
|
55
|
+
const db = getDb();
|
|
56
|
+
const code = uuidv4();
|
|
57
|
+
const expiresAt = new Date(Date.now() + 10 * 60 * 1000); // 10 minutes
|
|
58
|
+
try {
|
|
59
|
+
await db.insert(authorizationCodes).values({
|
|
60
|
+
code,
|
|
61
|
+
userId,
|
|
62
|
+
clientId,
|
|
63
|
+
redirectUri,
|
|
64
|
+
scope,
|
|
65
|
+
expiresAt,
|
|
66
|
+
used: false,
|
|
67
|
+
});
|
|
68
|
+
logger.info(`Generated auth code for user ${userId}, client ${clientId}`);
|
|
69
|
+
return code;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
logger.error('Error generating auth code:', error);
|
|
73
|
+
throw new Error('Failed to generate authorization code');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Exchange authorization code for access token
|
|
78
|
+
*/
|
|
79
|
+
async exchangeCodeForToken(code, clientId, clientSecret, redirectUri) {
|
|
80
|
+
const db = getDb();
|
|
81
|
+
try {
|
|
82
|
+
// Validate client
|
|
83
|
+
const validClient = await this.validateClient(clientId, clientSecret);
|
|
84
|
+
if (!validClient) {
|
|
85
|
+
throw new Error('Invalid client credentials');
|
|
86
|
+
}
|
|
87
|
+
// Get and validate auth code
|
|
88
|
+
const [authCode] = await db
|
|
89
|
+
.select()
|
|
90
|
+
.from(authorizationCodes)
|
|
91
|
+
.where(and(eq(authorizationCodes.code, code), eq(authorizationCodes.clientId, clientId)))
|
|
92
|
+
.limit(1);
|
|
93
|
+
if (!authCode) {
|
|
94
|
+
throw new Error('Invalid authorization code');
|
|
95
|
+
}
|
|
96
|
+
// Check if code is expired
|
|
97
|
+
if (new Date() > authCode.expiresAt) {
|
|
98
|
+
throw new Error('Authorization code expired');
|
|
99
|
+
}
|
|
100
|
+
// Check if code was already used
|
|
101
|
+
if (authCode.used) {
|
|
102
|
+
throw new Error('Authorization code already used');
|
|
103
|
+
}
|
|
104
|
+
// Validate redirect URI
|
|
105
|
+
if (authCode.redirectUri !== redirectUri) {
|
|
106
|
+
throw new Error('Redirect URI mismatch');
|
|
107
|
+
}
|
|
108
|
+
// Mark code as used
|
|
109
|
+
await db
|
|
110
|
+
.update(authorizationCodes)
|
|
111
|
+
.set({ used: true })
|
|
112
|
+
.where(eq(authorizationCodes.code, code));
|
|
113
|
+
// Generate tokens
|
|
114
|
+
const accessToken = this.generateAccessToken(authCode.userId, clientId, authCode.scope || 'read write');
|
|
115
|
+
const refreshToken = this.generateRefreshToken(authCode.userId, clientId, authCode.scope || 'read write');
|
|
116
|
+
// Store tokens in database
|
|
117
|
+
const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 hours
|
|
118
|
+
await db.insert(oauthTokens).values({
|
|
119
|
+
userId: authCode.userId,
|
|
120
|
+
accessToken,
|
|
121
|
+
refreshToken,
|
|
122
|
+
expiresAt,
|
|
123
|
+
scope: authCode.scope,
|
|
124
|
+
tokenType: 'Bearer',
|
|
125
|
+
});
|
|
126
|
+
logger.info(`Issued tokens for user ${authCode.userId}, client ${clientId}`);
|
|
127
|
+
return {
|
|
128
|
+
access_token: accessToken,
|
|
129
|
+
refresh_token: refreshToken,
|
|
130
|
+
token_type: 'Bearer',
|
|
131
|
+
expires_in: 86400, // 24 hours in seconds
|
|
132
|
+
scope: authCode.scope || 'read write',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
logger.error('Error exchanging code for token:', error);
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Generate access token (JWT)
|
|
142
|
+
*/
|
|
143
|
+
generateAccessToken(userId, clientId, scope) {
|
|
144
|
+
const payload = {
|
|
145
|
+
sub: userId,
|
|
146
|
+
client_id: clientId,
|
|
147
|
+
scope,
|
|
148
|
+
};
|
|
149
|
+
return jwt.sign(payload, this.jwtSecret, {
|
|
150
|
+
expiresIn: this.jwtExpiresIn,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Generate refresh token
|
|
155
|
+
*/
|
|
156
|
+
generateRefreshToken(userId, clientId, scope) {
|
|
157
|
+
const payload = {
|
|
158
|
+
sub: userId,
|
|
159
|
+
client_id: clientId,
|
|
160
|
+
scope,
|
|
161
|
+
};
|
|
162
|
+
return jwt.sign(payload, this.jwtSecret, {
|
|
163
|
+
expiresIn: '30d', // Refresh tokens last longer
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Validate access token
|
|
168
|
+
*/
|
|
169
|
+
async validateAccessToken(token) {
|
|
170
|
+
try {
|
|
171
|
+
// Verify JWT signature
|
|
172
|
+
const decoded = jwt.verify(token, this.jwtSecret);
|
|
173
|
+
// Check if token exists in database and is not expired
|
|
174
|
+
const db = getDb();
|
|
175
|
+
const [dbToken] = await db
|
|
176
|
+
.select()
|
|
177
|
+
.from(oauthTokens)
|
|
178
|
+
.where(eq(oauthTokens.accessToken, token))
|
|
179
|
+
.limit(1);
|
|
180
|
+
if (!dbToken || new Date() > dbToken.expiresAt) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
return decoded;
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
logger.debug('Invalid access token:', error);
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Refresh access token using refresh token
|
|
192
|
+
*/
|
|
193
|
+
async refreshAccessToken(refreshToken) {
|
|
194
|
+
const db = getDb();
|
|
195
|
+
try {
|
|
196
|
+
// Verify refresh token
|
|
197
|
+
const decoded = jwt.verify(refreshToken, this.jwtSecret);
|
|
198
|
+
// Find existing token
|
|
199
|
+
const [existingToken] = await db
|
|
200
|
+
.select()
|
|
201
|
+
.from(oauthTokens)
|
|
202
|
+
.where(eq(oauthTokens.refreshToken, refreshToken))
|
|
203
|
+
.limit(1);
|
|
204
|
+
if (!existingToken) {
|
|
205
|
+
throw new Error('Invalid refresh token');
|
|
206
|
+
}
|
|
207
|
+
// Generate new access token
|
|
208
|
+
const newAccessToken = this.generateAccessToken(decoded.sub, decoded.client_id, decoded.scope);
|
|
209
|
+
// Update token in database
|
|
210
|
+
const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000);
|
|
211
|
+
await db
|
|
212
|
+
.update(oauthTokens)
|
|
213
|
+
.set({
|
|
214
|
+
accessToken: newAccessToken,
|
|
215
|
+
expiresAt,
|
|
216
|
+
updatedAt: new Date(),
|
|
217
|
+
})
|
|
218
|
+
.where(eq(oauthTokens.id, existingToken.id));
|
|
219
|
+
logger.info(`Refreshed token for user ${decoded.sub}`);
|
|
220
|
+
return {
|
|
221
|
+
access_token: newAccessToken,
|
|
222
|
+
token_type: 'Bearer',
|
|
223
|
+
expires_in: 86400,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
logger.error('Error refreshing token:', error);
|
|
228
|
+
throw new Error('Failed to refresh token');
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Revoke token
|
|
233
|
+
*/
|
|
234
|
+
async revokeToken(token) {
|
|
235
|
+
const db = getDb();
|
|
236
|
+
try {
|
|
237
|
+
await db
|
|
238
|
+
.delete(oauthTokens)
|
|
239
|
+
.where(eq(oauthTokens.accessToken, token));
|
|
240
|
+
logger.info('Revoked token');
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
logger.error('Error revoking token:', error);
|
|
244
|
+
throw new Error('Failed to revoke token');
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Create or get user from external ID
|
|
249
|
+
*/
|
|
250
|
+
async getOrCreateUser(externalId) {
|
|
251
|
+
const db = getDb();
|
|
252
|
+
try {
|
|
253
|
+
// Check if user exists
|
|
254
|
+
const [existingUser] = await db
|
|
255
|
+
.select()
|
|
256
|
+
.from(users)
|
|
257
|
+
.where(eq(users.externalId, externalId))
|
|
258
|
+
.limit(1);
|
|
259
|
+
if (existingUser) {
|
|
260
|
+
return existingUser.id;
|
|
261
|
+
}
|
|
262
|
+
// Create new user
|
|
263
|
+
const [newUser] = await db
|
|
264
|
+
.insert(users)
|
|
265
|
+
.values({
|
|
266
|
+
externalId,
|
|
267
|
+
})
|
|
268
|
+
.returning();
|
|
269
|
+
if (!newUser) {
|
|
270
|
+
throw new Error('Failed to create user');
|
|
271
|
+
}
|
|
272
|
+
logger.info(`Created new user with external ID: ${externalId}`);
|
|
273
|
+
return newUser.id;
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
logger.error('Error getting/creating user:', error);
|
|
277
|
+
throw new Error('Failed to get or create user');
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// Export singleton instance
|
|
282
|
+
export const oauthServer = new OAuthServer();
|
|
283
|
+
//# sourceMappingURL=authServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authServer.js","sourceRoot":"","sources":["../../../src/server/oauth/authServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { KeyObject } from 'crypto';
|
|
2
|
+
import { JWK } from 'jose';
|
|
3
|
+
/**
|
|
4
|
+
* DPoP Proof structure according to RFC draft
|
|
5
|
+
*/
|
|
6
|
+
export interface DPoPProof {
|
|
7
|
+
typ: 'dpop+jwt';
|
|
8
|
+
alg: 'RS256' | 'ES256';
|
|
9
|
+
jwk: JWK;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* DPoP Proof payload
|
|
13
|
+
*/
|
|
14
|
+
export interface DPoPPayload {
|
|
15
|
+
jti: string;
|
|
16
|
+
htm: string;
|
|
17
|
+
htu: string;
|
|
18
|
+
iat: number;
|
|
19
|
+
ath?: string;
|
|
20
|
+
nonce?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* DPoP Token binding
|
|
24
|
+
*/
|
|
25
|
+
export interface DPoPBinding {
|
|
26
|
+
jkt: string;
|
|
27
|
+
cnf?: {
|
|
28
|
+
jkt: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* DPoP Manager for Demonstration of Proof of Possession
|
|
33
|
+
* Implements sender-constrained tokens to prevent token theft
|
|
34
|
+
* Based on OAuth 2.0 DPoP draft specification
|
|
35
|
+
*/
|
|
36
|
+
export declare class DPoPManager {
|
|
37
|
+
private readonly jtiCache;
|
|
38
|
+
private readonly nonceCache;
|
|
39
|
+
private readonly JTI_TTL;
|
|
40
|
+
private readonly NONCE_TTL;
|
|
41
|
+
private readonly MAX_TIME_SKEW;
|
|
42
|
+
/**
|
|
43
|
+
* Generate a DPoP key pair for client
|
|
44
|
+
*/
|
|
45
|
+
generateKeyPair(algorithm?: 'RS256' | 'ES256'): {
|
|
46
|
+
publicKey: KeyObject;
|
|
47
|
+
privateKey: KeyObject;
|
|
48
|
+
jwk: JWK;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Create a DPoP proof JWT
|
|
52
|
+
*/
|
|
53
|
+
createDPoPProof(privateKey: KeyObject, httpMethod: string, httpUri: string, options?: {
|
|
54
|
+
accessToken?: string;
|
|
55
|
+
nonce?: string;
|
|
56
|
+
algorithm?: 'RS256' | 'ES256';
|
|
57
|
+
}): Promise<string>;
|
|
58
|
+
/**
|
|
59
|
+
* Validate a DPoP proof
|
|
60
|
+
*/
|
|
61
|
+
validateDPoPProof(dpopProof: string, httpMethod: string, httpUri: string, options?: {
|
|
62
|
+
accessToken?: string;
|
|
63
|
+
expectedNonce?: string;
|
|
64
|
+
requireNonce?: boolean;
|
|
65
|
+
}): Promise<{
|
|
66
|
+
valid: boolean;
|
|
67
|
+
jkt?: string;
|
|
68
|
+
error?: string;
|
|
69
|
+
}>;
|
|
70
|
+
/**
|
|
71
|
+
* Generate a server nonce for enhanced security
|
|
72
|
+
*/
|
|
73
|
+
generateNonce(): string;
|
|
74
|
+
/**
|
|
75
|
+
* Validate a nonce
|
|
76
|
+
*/
|
|
77
|
+
validateNonce(nonce: string): Promise<boolean>;
|
|
78
|
+
/**
|
|
79
|
+
* Bind an access token to a DPoP key
|
|
80
|
+
*/
|
|
81
|
+
createDPoPBoundToken(token: any, jkt: string): any;
|
|
82
|
+
/**
|
|
83
|
+
* Validate that a token is bound to the correct DPoP key
|
|
84
|
+
*/
|
|
85
|
+
validateTokenBinding(token: any, dpopJkt: string): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Hash a token for the 'ath' claim
|
|
88
|
+
*/
|
|
89
|
+
private hashToken;
|
|
90
|
+
/**
|
|
91
|
+
* Calculate JWK thumbprint (RFC 7638)
|
|
92
|
+
*/
|
|
93
|
+
private calculateJwkThumbprint;
|
|
94
|
+
/**
|
|
95
|
+
* Normalize URI for comparison
|
|
96
|
+
*/
|
|
97
|
+
private normalizeUri;
|
|
98
|
+
/**
|
|
99
|
+
* Generate unique JTI
|
|
100
|
+
*/
|
|
101
|
+
private generateJti;
|
|
102
|
+
/**
|
|
103
|
+
* Check if JTI has been used
|
|
104
|
+
*/
|
|
105
|
+
private isJtiUsed;
|
|
106
|
+
/**
|
|
107
|
+
* Store JTI to prevent replay
|
|
108
|
+
*/
|
|
109
|
+
private storeJti;
|
|
110
|
+
/**
|
|
111
|
+
* Clean up expired JTIs
|
|
112
|
+
*/
|
|
113
|
+
private cleanupExpiredJtis;
|
|
114
|
+
/**
|
|
115
|
+
* Clean up expired nonces
|
|
116
|
+
*/
|
|
117
|
+
private cleanupExpiredNonces;
|
|
118
|
+
/**
|
|
119
|
+
* Middleware for Express to validate DPoP proofs
|
|
120
|
+
*/
|
|
121
|
+
middleware(options?: {
|
|
122
|
+
requireDPoP?: boolean;
|
|
123
|
+
requireNonce?: boolean;
|
|
124
|
+
}): (req: any, res: any, next: any) => Promise<any>;
|
|
125
|
+
/**
|
|
126
|
+
* Get statistics about DPoP usage
|
|
127
|
+
*/
|
|
128
|
+
getStats(): {
|
|
129
|
+
activeJtis: number;
|
|
130
|
+
activeNonces: number;
|
|
131
|
+
totalValidations: number;
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export declare const dpopManager: DPoPManager;
|
|
135
|
+
//# sourceMappingURL=dpop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dpop.d.ts","sourceRoot":"","sources":["../../../src/server/oauth/dpop.ts"],"names":[],"mappings":"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"}
|