@efficy/tribecrm-mcp-server 0.4.3 → 0.5.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/README.md +73 -20
- package/dist/auth/callback-server.test.d.ts +2 -0
- package/dist/auth/callback-server.test.d.ts.map +1 -0
- package/dist/auth/callback-server.test.js +233 -0
- package/dist/auth/callback-server.test.js.map +1 -0
- package/dist/auth/oauth-flow.d.ts +6 -6
- package/dist/auth/oauth-flow.d.ts.map +1 -1
- package/dist/auth/oauth-flow.js +27 -13
- package/dist/auth/oauth-flow.js.map +1 -1
- package/dist/auth/oauth-flow.test.js +1 -7
- package/dist/auth/oauth-flow.test.js.map +1 -1
- package/dist/auth/user-auth.d.ts +6 -2
- package/dist/auth/user-auth.d.ts.map +1 -1
- package/dist/auth/user-auth.js +21 -8
- package/dist/auth/user-auth.js.map +1 -1
- package/dist/auth/user-auth.test.d.ts +2 -0
- package/dist/auth/user-auth.test.d.ts.map +1 -0
- package/dist/auth/user-auth.test.js +366 -0
- package/dist/auth/user-auth.test.js.map +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1 -2
- package/dist/client.js.map +1 -1
- package/dist/client.test.js +0 -1
- package/dist/client.test.js.map +1 -1
- package/dist/index.js +100 -5
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +5 -3
- package/dist/index.test.js.map +1 -1
- package/dist/scripts/authenticate.js +10 -12
- package/dist/scripts/authenticate.js.map +1 -1
- package/dist/types.d.ts +0 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.test.js +0 -11
- package/dist/types.test.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -47,26 +47,40 @@ TRIBECRM_AUTH=app # Default - can be omitted
|
|
|
47
47
|
|
|
48
48
|
**Use case**: Personal AI assistants, user-specific operations
|
|
49
49
|
|
|
50
|
-
**
|
|
51
|
-
1. Run the authentication helper:
|
|
52
|
-
```bash
|
|
53
|
-
npx @efficy/tribecrm-mcp-server authenticate
|
|
54
|
-
# or if installed locally:
|
|
55
|
-
npm run authenticate
|
|
56
|
-
```
|
|
50
|
+
**✨ Recommended: Authenticate directly from Claude**
|
|
57
51
|
|
|
58
|
-
|
|
52
|
+
The easiest way to authenticate is directly from your conversation with Claude:
|
|
59
53
|
|
|
60
|
-
|
|
54
|
+
1. Configure your MCP client with `TRIBECRM_AUTH=user` (see Configuration section)
|
|
55
|
+
2. Restart Claude Desktop
|
|
56
|
+
3. Ask Claude: **"Can you authenticate with TribeCRM?"**
|
|
57
|
+
4. Claude will use the `tribecrm_authenticate` tool to generate an authentication link
|
|
58
|
+
5. Click the link, log in to TribeCRM, and accept the consent
|
|
59
|
+
6. Tokens are saved automatically - no restart needed!
|
|
61
60
|
|
|
62
|
-
|
|
61
|
+
**Alternative: CLI Authentication**
|
|
62
|
+
|
|
63
|
+
For testing, debugging, or pre-authentication, you can use the CLI command:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
npx @efficy/tribecrm-mcp-server authenticate
|
|
67
|
+
# or if installed locally:
|
|
68
|
+
npm run authenticate
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Your browser will open for TribeCRM login, and tokens will be saved to `~/.tribecrm/tokens.json`
|
|
63
72
|
|
|
64
73
|
**Features**:
|
|
65
|
-
-
|
|
66
|
-
-
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
-
- ✅
|
|
74
|
+
- ✨ **No terminal needed** - authenticate directly from Claude
|
|
75
|
+
- 🔄 Automatic token refresh (tokens valid for 24 hours)
|
|
76
|
+
- 💾 Secure local token storage (`~/.tribecrm/tokens.json`)
|
|
77
|
+
- ⚡ No restart required after authentication
|
|
78
|
+
- ✅ Standard OAuth2 Authorization Code flow
|
|
79
|
+
- 🔐 User-specific access rights respected
|
|
80
|
+
|
|
81
|
+
**Requirements**:
|
|
82
|
+
- Both `TRIBECRM_CLIENT_ID` and `TRIBECRM_CLIENT_SECRET` are required for the authentication flow
|
|
83
|
+
- Redirect URI must be pre-registered in your OAuth client configuration (default: `http://localhost:3001/callback`)
|
|
70
84
|
|
|
71
85
|
## 📋 Prerequisites
|
|
72
86
|
|
|
@@ -110,7 +124,6 @@ Add to your Claude Desktop config file:
|
|
|
110
124
|
"TRIBECRM_AUTH_URL": "https://auth.tribecrm.nl",
|
|
111
125
|
"TRIBECRM_CLIENT_ID": "your_client_id",
|
|
112
126
|
"TRIBECRM_CLIENT_SECRET": "your_client_secret",
|
|
113
|
-
"TRIBECRM_ORGANIZATION_ID": "your_org_id",
|
|
114
127
|
"TRIBECRM_MODE": "read-only",
|
|
115
128
|
"TRIBECRM_AUTH": "app"
|
|
116
129
|
}
|
|
@@ -136,7 +149,6 @@ Add to your Claude Desktop config file:
|
|
|
136
149
|
"TRIBECRM_AUTH_URL": "https://auth.tribecrm.nl",
|
|
137
150
|
"TRIBECRM_CLIENT_ID": "your_client_id",
|
|
138
151
|
"TRIBECRM_CLIENT_SECRET": "your_client_secret",
|
|
139
|
-
"TRIBECRM_ORGANIZATION_ID": "your_org_id",
|
|
140
152
|
"TRIBECRM_MODE": "read-only",
|
|
141
153
|
"TRIBECRM_AUTH": "app"
|
|
142
154
|
}
|
|
@@ -158,8 +170,9 @@ Add to your Claude Desktop config file:
|
|
|
158
170
|
- `TRIBECRM_API_URL` (required): Your TribeCRM API URL (e.g., https://api.tribecrm.nl or https://api-staging.tribecrm.nl)
|
|
159
171
|
- `TRIBECRM_AUTH_URL` (required): Your TribeCRM OAuth2 authentication URL (e.g., https://auth.tribecrm.nl or https://auth-staging.tribecrm.nl)
|
|
160
172
|
- `TRIBECRM_CLIENT_ID` (required): OAuth2 Client ID
|
|
161
|
-
- `TRIBECRM_CLIENT_SECRET` (required): OAuth2 Client Secret
|
|
162
|
-
- `
|
|
173
|
+
- `TRIBECRM_CLIENT_SECRET` (required for both auth methods): OAuth2 Client Secret
|
|
174
|
+
- Required when using `TRIBECRM_AUTH=app` (default) - for Client Credentials flow
|
|
175
|
+
- Required when using `TRIBECRM_AUTH=user` - for Authorization Code token exchange
|
|
163
176
|
- `TRIBECRM_MODE` (optional): Server operation mode - `read-only` (default) or `read-write`
|
|
164
177
|
- `read-only`: Only allows queries and data retrieval (get, query operations). Write tools are hidden.
|
|
165
178
|
- `read-write`: Allows full access including create, update, and delete operations.
|
|
@@ -167,11 +180,51 @@ Add to your Claude Desktop config file:
|
|
|
167
180
|
- `app`: OAuth2 Client Credentials flow for service account authentication
|
|
168
181
|
- `user`: OAuth2 Authorization Code flow for user-specific authentication
|
|
169
182
|
- `TRIBECRM_REDIRECT_URI` (optional): Redirect URI for user authentication (only needed when `TRIBECRM_AUTH=user`)
|
|
170
|
-
- Default: `http://localhost:
|
|
183
|
+
- Default: `http://localhost:3001/callback`
|
|
171
184
|
- Must match the redirect URI configured in your TribeCRM OAuth application
|
|
172
185
|
|
|
173
186
|
## 📚 Available Tools
|
|
174
187
|
|
|
188
|
+
### Authentication Operations
|
|
189
|
+
|
|
190
|
+
#### `tribecrm_authenticate`
|
|
191
|
+
Start user authentication flow (only available when `TRIBECRM_AUTH=user`)
|
|
192
|
+
|
|
193
|
+
**Use case**: When user authentication is required but no valid tokens are found, this tool generates an authentication URL and starts a background callback server to handle the OAuth flow.
|
|
194
|
+
|
|
195
|
+
**Parameters:** None
|
|
196
|
+
|
|
197
|
+
**Returns**: Authentication URL and step-by-step instructions
|
|
198
|
+
|
|
199
|
+
**Features**:
|
|
200
|
+
- ✨ Authenticate directly from Claude without using the terminal
|
|
201
|
+
- 🔄 Background callback server automatically handles OAuth redirects
|
|
202
|
+
- 💾 Tokens saved automatically to `~/.tribecrm/tokens.json`
|
|
203
|
+
- ⚡ No restart required - tokens work immediately after authentication
|
|
204
|
+
|
|
205
|
+
**Example workflow**:
|
|
206
|
+
1. User asks: "Can you authenticate with TribeCRM?"
|
|
207
|
+
2. Claude calls `tribecrm_authenticate` tool
|
|
208
|
+
3. User clicks the provided authentication link
|
|
209
|
+
4. User logs in to TribeCRM and accepts consent
|
|
210
|
+
5. Tokens are saved automatically
|
|
211
|
+
6. User can immediately use TribeCRM tools
|
|
212
|
+
|
|
213
|
+
**Error messages**: If authentication is needed, other TribeCRM tools will display a helpful error message suggesting to use this tool or run `npm run authenticate` manually.
|
|
214
|
+
|
|
215
|
+
#### `tribecrm_get_current_employee`
|
|
216
|
+
Get information about the currently authenticated employee
|
|
217
|
+
|
|
218
|
+
**Parameters:**
|
|
219
|
+
- `expand` (string, optional): OData $expand parameter (e.g., "Person")
|
|
220
|
+
|
|
221
|
+
**Example:**
|
|
222
|
+
```json
|
|
223
|
+
{
|
|
224
|
+
"expand": "Person"
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
175
228
|
### Entity Operations
|
|
176
229
|
|
|
177
230
|
#### `tribecrm_get_entity`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback-server.test.d.ts","sourceRoot":"","sources":["../../src/auth/callback-server.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { CallbackServer } from './callback-server.js';
|
|
3
|
+
import http from 'http';
|
|
4
|
+
describe('CallbackServer', () => {
|
|
5
|
+
let callbackServer;
|
|
6
|
+
const testPort = 3456; // Use non-standard port to avoid conflicts
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
callbackServer = new CallbackServer(testPort);
|
|
9
|
+
});
|
|
10
|
+
afterEach(() => {
|
|
11
|
+
callbackServer.stop();
|
|
12
|
+
});
|
|
13
|
+
describe('constructor', () => {
|
|
14
|
+
it('should create instance with default port', () => {
|
|
15
|
+
const server = new CallbackServer();
|
|
16
|
+
expect(server.getPort()).toBe(3000);
|
|
17
|
+
});
|
|
18
|
+
it('should create instance with custom port', () => {
|
|
19
|
+
const server = new CallbackServer(4567);
|
|
20
|
+
expect(server.getPort()).toBe(4567);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
describe('getPort', () => {
|
|
24
|
+
it('should return configured port', () => {
|
|
25
|
+
expect(callbackServer.getPort()).toBe(testPort);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('waitForCallback - success scenarios', () => {
|
|
29
|
+
it('should resolve with code and state on successful callback', async () => {
|
|
30
|
+
const expectedState = 'test-state-123';
|
|
31
|
+
const authCode = 'auth-code-456';
|
|
32
|
+
// Start waiting for callback
|
|
33
|
+
const callbackPromise = callbackServer.waitForCallback(expectedState, 5000);
|
|
34
|
+
// Give server time to start
|
|
35
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
36
|
+
// Simulate OAuth callback
|
|
37
|
+
const response = await fetch(`http://localhost:${testPort}/callback?code=${authCode}&state=${expectedState}`);
|
|
38
|
+
const result = await callbackPromise;
|
|
39
|
+
expect(result.code).toBe(authCode);
|
|
40
|
+
expect(result.state).toBe(expectedState);
|
|
41
|
+
expect(response.status).toBe(200);
|
|
42
|
+
const html = await response.text();
|
|
43
|
+
expect(html).toContain('Authentication Successful');
|
|
44
|
+
});
|
|
45
|
+
it('should serve success HTML page', async () => {
|
|
46
|
+
const expectedState = 'state-abc';
|
|
47
|
+
const authCode = 'code-xyz';
|
|
48
|
+
const callbackPromise = callbackServer.waitForCallback(expectedState, 5000);
|
|
49
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
50
|
+
const response = await fetch(`http://localhost:${testPort}/callback?code=${authCode}&state=${expectedState}`);
|
|
51
|
+
await callbackPromise;
|
|
52
|
+
const html = await response.text();
|
|
53
|
+
expect(html).toContain('<!DOCTYPE html>');
|
|
54
|
+
expect(html).toContain('Authentication Successful!');
|
|
55
|
+
expect(html).toContain('close this window');
|
|
56
|
+
expect(html).toContain('✓');
|
|
57
|
+
}, 10000);
|
|
58
|
+
});
|
|
59
|
+
describe('waitForCallback - error scenarios', () => {
|
|
60
|
+
it('should reject on timeout', async () => {
|
|
61
|
+
const expectedState = 'test-state';
|
|
62
|
+
const shortTimeout = 100; // 100ms timeout
|
|
63
|
+
await expect(callbackServer.waitForCallback(expectedState, shortTimeout)).rejects.toThrow('OAuth callback timeout');
|
|
64
|
+
});
|
|
65
|
+
it('should reject when OAuth error parameter is present', async () => {
|
|
66
|
+
const expectedState = 'state-123';
|
|
67
|
+
const callbackPromise = callbackServer.waitForCallback(expectedState, 5000);
|
|
68
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
69
|
+
// Make fetch request and wait for rejection before checking response
|
|
70
|
+
const fetchPromise = fetch(`http://localhost:${testPort}/callback?error=access_denied&error_description=User%20cancelled`);
|
|
71
|
+
// Wait for callback promise to reject first
|
|
72
|
+
await expect(callbackPromise).rejects.toThrow('OAuth error: User cancelled');
|
|
73
|
+
// Then check the response
|
|
74
|
+
const response = await fetchPromise;
|
|
75
|
+
expect(response.status).toBe(400);
|
|
76
|
+
const html = await response.text();
|
|
77
|
+
expect(html).toContain('Authentication Failed');
|
|
78
|
+
expect(html).toContain('User cancelled');
|
|
79
|
+
});
|
|
80
|
+
it('should reject when OAuth error without description', async () => {
|
|
81
|
+
const expectedState = 'state-456';
|
|
82
|
+
const callbackPromise = callbackServer.waitForCallback(expectedState, 5000);
|
|
83
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
84
|
+
const fetchPromise = fetch(`http://localhost:${testPort}/callback?error=server_error`);
|
|
85
|
+
await expect(callbackPromise).rejects.toThrow('OAuth error: server_error');
|
|
86
|
+
const response = await fetchPromise;
|
|
87
|
+
expect(response.status).toBe(400);
|
|
88
|
+
}, 10000);
|
|
89
|
+
it('should reject when code parameter is missing', async () => {
|
|
90
|
+
const expectedState = 'state-789';
|
|
91
|
+
const callbackPromise = callbackServer.waitForCallback(expectedState, 5000);
|
|
92
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
93
|
+
const fetchPromise = fetch(`http://localhost:${testPort}/callback?state=${expectedState}`);
|
|
94
|
+
await expect(callbackPromise).rejects.toThrow('Invalid callback: missing code or state');
|
|
95
|
+
const response = await fetchPromise;
|
|
96
|
+
expect(response.status).toBe(400);
|
|
97
|
+
const html = await response.text();
|
|
98
|
+
expect(html).toContain('Missing code or state parameter');
|
|
99
|
+
});
|
|
100
|
+
it('should reject when state parameter is missing', async () => {
|
|
101
|
+
const expectedState = 'state-abc';
|
|
102
|
+
const callbackPromise = callbackServer.waitForCallback(expectedState, 5000);
|
|
103
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
104
|
+
const fetchPromise = fetch(`http://localhost:${testPort}/callback?code=some-code`);
|
|
105
|
+
await expect(callbackPromise).rejects.toThrow('Invalid callback: missing code or state');
|
|
106
|
+
const response = await fetchPromise;
|
|
107
|
+
expect(response.status).toBe(400);
|
|
108
|
+
}, 10000);
|
|
109
|
+
it('should reject when state does not match (CSRF protection)', async () => {
|
|
110
|
+
const expectedState = 'correct-state';
|
|
111
|
+
const wrongState = 'wrong-state';
|
|
112
|
+
const callbackPromise = callbackServer.waitForCallback(expectedState, 5000);
|
|
113
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
114
|
+
const fetchPromise = fetch(`http://localhost:${testPort}/callback?code=auth-code&state=${wrongState}`);
|
|
115
|
+
await expect(callbackPromise).rejects.toThrow('State validation failed - possible CSRF attack');
|
|
116
|
+
const response = await fetchPromise;
|
|
117
|
+
expect(response.status).toBe(400);
|
|
118
|
+
const html = await response.text();
|
|
119
|
+
expect(html).toContain('Invalid state parameter');
|
|
120
|
+
expect(html).toContain('CSRF attack');
|
|
121
|
+
});
|
|
122
|
+
it('should return 404 for non-callback paths', async () => {
|
|
123
|
+
const expectedState = 'state-def';
|
|
124
|
+
const callbackPromise = callbackServer.waitForCallback(expectedState, 1000);
|
|
125
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
126
|
+
const response = await fetch(`http://localhost:${testPort}/other-path`);
|
|
127
|
+
expect(response.status).toBe(404);
|
|
128
|
+
const html = await response.text();
|
|
129
|
+
expect(html).toContain('404 Not Found');
|
|
130
|
+
// Clean up - don't wait for timeout, just stop
|
|
131
|
+
callbackServer.stop();
|
|
132
|
+
}, 10000);
|
|
133
|
+
it('should handle port already in use error', async () => {
|
|
134
|
+
// Start first server
|
|
135
|
+
const server1 = new CallbackServer(testPort + 1);
|
|
136
|
+
const promise1 = server1.waitForCallback('state1', 1000);
|
|
137
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
138
|
+
// Try to start second server on same port
|
|
139
|
+
const server2 = new CallbackServer(testPort + 1);
|
|
140
|
+
await expect(server2.waitForCallback('state2', 1000)).rejects.toThrow(`Port ${testPort + 1} is already in use`);
|
|
141
|
+
// Clean up
|
|
142
|
+
server1.stop();
|
|
143
|
+
}, 10000);
|
|
144
|
+
});
|
|
145
|
+
describe('stop', () => {
|
|
146
|
+
it('should stop the server gracefully', async () => {
|
|
147
|
+
const expectedState = 'state-ghi';
|
|
148
|
+
const callbackPromise = callbackServer.waitForCallback(expectedState, 1000);
|
|
149
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
150
|
+
// Stop server before callback arrives
|
|
151
|
+
callbackServer.stop();
|
|
152
|
+
// Give server time to shut down
|
|
153
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
154
|
+
// Server should be stopped, fetch should fail with connection error
|
|
155
|
+
try {
|
|
156
|
+
await fetch(`http://localhost:${testPort}/callback?code=code&state=${expectedState}`);
|
|
157
|
+
expect.fail('Fetch should have failed');
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
// Connection error expected (ECONNREFUSED or similar)
|
|
161
|
+
expect(error.cause?.code).toMatch(/ECONNREFUSED|ECONNRESET/);
|
|
162
|
+
}
|
|
163
|
+
}, 10000);
|
|
164
|
+
it('should handle multiple stop calls safely', () => {
|
|
165
|
+
callbackServer.stop();
|
|
166
|
+
callbackServer.stop(); // Should not throw
|
|
167
|
+
callbackServer.stop(); // Should not throw
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('HTML escaping', () => {
|
|
171
|
+
it('should escape HTML in error messages to prevent XSS', async () => {
|
|
172
|
+
const expectedState = 'state-xss';
|
|
173
|
+
const callbackPromise = callbackServer.waitForCallback(expectedState, 5000);
|
|
174
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
175
|
+
// Try XSS attack via error_description
|
|
176
|
+
const xssAttempt = '<script>alert("xss")</script>';
|
|
177
|
+
const fetchPromise = fetch(`http://localhost:${testPort}/callback?error=test&error_description=${encodeURIComponent(xssAttempt)}`);
|
|
178
|
+
await expect(callbackPromise).rejects.toThrow();
|
|
179
|
+
const response = await fetchPromise;
|
|
180
|
+
const html = await response.text();
|
|
181
|
+
// Check that script tags are escaped
|
|
182
|
+
expect(html).not.toContain('<script>');
|
|
183
|
+
expect(html).toContain('<script>');
|
|
184
|
+
expect(html).toContain('</script>');
|
|
185
|
+
}, 10000);
|
|
186
|
+
it('should escape special characters in error messages', async () => {
|
|
187
|
+
const expectedState = 'state-special';
|
|
188
|
+
const callbackPromise = callbackServer.waitForCallback(expectedState, 5000);
|
|
189
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
190
|
+
const specialChars = '& < > " \'';
|
|
191
|
+
const fetchPromise = fetch(`http://localhost:${testPort}/callback?error=test&error_description=${encodeURIComponent(specialChars)}`);
|
|
192
|
+
await expect(callbackPromise).rejects.toThrow();
|
|
193
|
+
const response = await fetchPromise;
|
|
194
|
+
const html = await response.text();
|
|
195
|
+
expect(html).toContain('&');
|
|
196
|
+
expect(html).toContain('<');
|
|
197
|
+
expect(html).toContain('>');
|
|
198
|
+
expect(html).toContain('"');
|
|
199
|
+
expect(html).toContain(''');
|
|
200
|
+
}, 10000);
|
|
201
|
+
});
|
|
202
|
+
describe('edge cases', () => {
|
|
203
|
+
it('should handle empty callback URL', async () => {
|
|
204
|
+
const expectedState = 'state-empty';
|
|
205
|
+
const callbackPromise = callbackServer.waitForCallback(expectedState, 1000);
|
|
206
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
207
|
+
// Create a manual HTTP request with empty URL
|
|
208
|
+
const req = http.request({
|
|
209
|
+
hostname: 'localhost',
|
|
210
|
+
port: testPort,
|
|
211
|
+
path: '',
|
|
212
|
+
method: 'GET'
|
|
213
|
+
});
|
|
214
|
+
req.end();
|
|
215
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
216
|
+
// Should still be waiting (404 response doesn't reject)
|
|
217
|
+
callbackServer.stop();
|
|
218
|
+
}, 10000);
|
|
219
|
+
it('should handle callback with extra parameters', async () => {
|
|
220
|
+
const expectedState = 'state-extra';
|
|
221
|
+
const authCode = 'code-extra';
|
|
222
|
+
const callbackPromise = callbackServer.waitForCallback(expectedState, 5000);
|
|
223
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
224
|
+
// Include extra parameters that should be ignored
|
|
225
|
+
const response = await fetch(`http://localhost:${testPort}/callback?code=${authCode}&state=${expectedState}&extra=ignored&foo=bar`);
|
|
226
|
+
const result = await callbackPromise;
|
|
227
|
+
expect(result.code).toBe(authCode);
|
|
228
|
+
expect(result.state).toBe(expectedState);
|
|
229
|
+
expect(response.status).toBe(200);
|
|
230
|
+
}, 10000);
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
//# sourceMappingURL=callback-server.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback-server.test.js","sourceRoot":"","sources":["../../src/auth/callback-server.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@ import { AuthToken } from '../types.js';
|
|
|
2
2
|
export interface OAuthConfig {
|
|
3
3
|
authUrl: string;
|
|
4
4
|
clientId: string;
|
|
5
|
-
clientSecret
|
|
5
|
+
clientSecret?: string;
|
|
6
6
|
redirectUri: string;
|
|
7
|
-
|
|
7
|
+
usePKCE?: boolean;
|
|
8
8
|
}
|
|
9
9
|
export interface PKCEPair {
|
|
10
10
|
verifier: string;
|
|
@@ -25,17 +25,17 @@ export declare class OAuthFlow {
|
|
|
25
25
|
/**
|
|
26
26
|
* Generate OAuth consent URL
|
|
27
27
|
* @param state Random state parameter for CSRF protection
|
|
28
|
-
* @param codeChallenge PKCE code challenge
|
|
28
|
+
* @param codeChallenge PKCE code challenge (optional, only used if usePKCE is true)
|
|
29
29
|
* @returns Consent URL for user to visit
|
|
30
30
|
*/
|
|
31
|
-
generateConsentUrl(state: string, codeChallenge
|
|
31
|
+
generateConsentUrl(state: string, codeChallenge?: string): string;
|
|
32
32
|
/**
|
|
33
33
|
* Exchange authorization code for tokens
|
|
34
34
|
* @param code Authorization code from OAuth callback
|
|
35
|
-
* @param codeVerifier PKCE code verifier
|
|
35
|
+
* @param codeVerifier PKCE code verifier (optional, only used if usePKCE is true)
|
|
36
36
|
* @returns Token response with access_token, refresh_token, etc.
|
|
37
37
|
*/
|
|
38
|
-
exchangeCodeForTokens(code: string, codeVerifier
|
|
38
|
+
exchangeCodeForTokens(code: string, codeVerifier?: string): Promise<AuthToken & {
|
|
39
39
|
refresh_token?: string;
|
|
40
40
|
}>;
|
|
41
41
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-flow.d.ts","sourceRoot":"","sources":["../../src/auth/oauth-flow.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth-flow.d.ts","sourceRoot":"","sources":["../../src/auth/oauth-flow.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,WAAW;IAI/B;;;OAGG;IACH,YAAY,IAAI,QAAQ;IAaxB;;;;;OAKG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM;IAsBjE;;;;;OAKG;IACG,qBAAqB,CACzB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,SAAS,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAoClD;;;;OAIG;IACG,kBAAkB,CACtB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,SAAS,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA8BlD;;;OAGG;IACH,MAAM,CAAC,aAAa,IAAI,MAAM;CAG/B"}
|
package/dist/auth/oauth-flow.js
CHANGED
|
@@ -26,7 +26,7 @@ export class OAuthFlow {
|
|
|
26
26
|
/**
|
|
27
27
|
* Generate OAuth consent URL
|
|
28
28
|
* @param state Random state parameter for CSRF protection
|
|
29
|
-
* @param codeChallenge PKCE code challenge
|
|
29
|
+
* @param codeChallenge PKCE code challenge (optional, only used if usePKCE is true)
|
|
30
30
|
* @returns Consent URL for user to visit
|
|
31
31
|
*/
|
|
32
32
|
generateConsentUrl(state, codeChallenge) {
|
|
@@ -36,30 +36,40 @@ export class OAuthFlow {
|
|
|
36
36
|
state: state,
|
|
37
37
|
response_type: 'code',
|
|
38
38
|
scope: 'read write offline',
|
|
39
|
-
code_challenge: codeChallenge,
|
|
40
|
-
code_challenge_method: 'S256',
|
|
41
39
|
});
|
|
42
|
-
if
|
|
43
|
-
|
|
40
|
+
// Only add PKCE parameters if usePKCE is enabled
|
|
41
|
+
if (this.config.usePKCE && codeChallenge) {
|
|
42
|
+
params.append('code_challenge', codeChallenge);
|
|
43
|
+
params.append('code_challenge_method', 'S256');
|
|
44
44
|
}
|
|
45
|
+
// NOTE: organization_id is NOT included in the authorization URL
|
|
46
|
+
// Including it causes HTTP 500 errors at the consent endpoint
|
|
47
|
+
// It can be used in API calls after authentication, but not in the OAuth flow
|
|
45
48
|
return `${this.config.authUrl}/oauth2/auth?${params.toString()}`;
|
|
46
49
|
}
|
|
47
50
|
/**
|
|
48
51
|
* Exchange authorization code for tokens
|
|
49
52
|
* @param code Authorization code from OAuth callback
|
|
50
|
-
* @param codeVerifier PKCE code verifier
|
|
53
|
+
* @param codeVerifier PKCE code verifier (optional, only used if usePKCE is true)
|
|
51
54
|
* @returns Token response with access_token, refresh_token, etc.
|
|
52
55
|
*/
|
|
53
56
|
async exchangeCodeForTokens(code, codeVerifier) {
|
|
54
57
|
try {
|
|
55
|
-
const
|
|
58
|
+
const params = {
|
|
56
59
|
grant_type: 'authorization_code',
|
|
57
60
|
client_id: this.config.clientId,
|
|
58
|
-
client_secret: this.config.clientSecret,
|
|
59
61
|
redirect_uri: this.config.redirectUri,
|
|
60
62
|
code: code,
|
|
61
|
-
|
|
62
|
-
|
|
63
|
+
};
|
|
64
|
+
// Only include code_verifier if usePKCE is enabled
|
|
65
|
+
if (this.config.usePKCE && codeVerifier) {
|
|
66
|
+
params.code_verifier = codeVerifier;
|
|
67
|
+
}
|
|
68
|
+
// Include client_secret (required for traditional OAuth2, optional for PKCE)
|
|
69
|
+
if (this.config.clientSecret) {
|
|
70
|
+
params.client_secret = this.config.clientSecret;
|
|
71
|
+
}
|
|
72
|
+
const response = await axios.post(`${this.config.authUrl}/oauth2/token`, new URLSearchParams(params), {
|
|
63
73
|
headers: {
|
|
64
74
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
65
75
|
},
|
|
@@ -78,12 +88,16 @@ export class OAuthFlow {
|
|
|
78
88
|
*/
|
|
79
89
|
async refreshAccessToken(refreshToken) {
|
|
80
90
|
try {
|
|
81
|
-
const
|
|
91
|
+
const params = {
|
|
82
92
|
grant_type: 'refresh_token',
|
|
83
93
|
client_id: this.config.clientId,
|
|
84
|
-
client_secret: this.config.clientSecret,
|
|
85
94
|
refresh_token: refreshToken,
|
|
86
|
-
}
|
|
95
|
+
};
|
|
96
|
+
// Only include client_secret if provided (optional for PKCE flow)
|
|
97
|
+
if (this.config.clientSecret) {
|
|
98
|
+
params.client_secret = this.config.clientSecret;
|
|
99
|
+
}
|
|
100
|
+
const response = await axios.post(`${this.config.authUrl}/oauth2/token`, new URLSearchParams(params), {
|
|
87
101
|
headers: {
|
|
88
102
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
89
103
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-flow.js","sourceRoot":"","sources":["../../src/auth/oauth-flow.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAgB1B;;;GAGG;AACH,MAAM,OAAO,SAAS;IACZ,MAAM,CAAc;IAE5B,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,YAAY;QACV,wDAAwD;QACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE9D,+DAA+D;QAC/D,MAAM,SAAS,GAAG,MAAM;aACrB,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,QAAQ,CAAC;aAChB,MAAM,CAAC,WAAW,CAAC,CAAC;QAEvB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,KAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"oauth-flow.js","sourceRoot":"","sources":["../../src/auth/oauth-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,6 @@ describe('OAuthFlow', () => {
|
|
|
14
14
|
clientId: 'test-client-id',
|
|
15
15
|
clientSecret: 'test-client-secret',
|
|
16
16
|
redirectUri: 'http://localhost:3000/callback',
|
|
17
|
-
organizationId: 'test-org-id',
|
|
18
17
|
};
|
|
19
18
|
oauthFlow = new OAuthFlow(config);
|
|
20
19
|
});
|
|
@@ -54,12 +53,7 @@ describe('OAuthFlow', () => {
|
|
|
54
53
|
expect(url).toContain('scope=read+write+offline');
|
|
55
54
|
expect(url).toContain(`code_challenge=${codeChallenge}`);
|
|
56
55
|
expect(url).toContain('code_challenge_method=S256');
|
|
57
|
-
|
|
58
|
-
});
|
|
59
|
-
it('should not include organization_id if not provided', () => {
|
|
60
|
-
const configWithoutOrg = { ...config, organizationId: undefined };
|
|
61
|
-
const oauthFlowWithoutOrg = new OAuthFlow(configWithoutOrg);
|
|
62
|
-
const url = oauthFlowWithoutOrg.generateConsentUrl('state', 'challenge');
|
|
56
|
+
// organization_id is NOT included (removed as it causes HTTP 500 errors)
|
|
63
57
|
expect(url).not.toContain('organization_id');
|
|
64
58
|
});
|
|
65
59
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-flow.test.js","sourceRoot":"","sources":["../../src/auth/oauth-flow.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAC;AAEzD,aAAa;AACb,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjB,MAAM,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAE3C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,SAAoB,CAAC;IACzB,IAAI,MAAmB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QAEnB,MAAM,GAAG;YACP,OAAO,EAAE,+BAA+B;YACxC,QAAQ,EAAE,gBAAgB;YAC1B,YAAY,EAAE,oBAAoB;YAClC,WAAW,EAAE,gCAAgC;
|
|
1
|
+
{"version":3,"file":"oauth-flow.test.js","sourceRoot":"","sources":["../../src/auth/oauth-flow.test.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/user-auth.d.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export interface UserAuthConfig {
|
|
2
|
+
authUrl: string;
|
|
3
|
+
clientId: string;
|
|
4
|
+
clientSecret?: string;
|
|
5
|
+
redirectUri: string;
|
|
3
6
|
callbackPort?: number;
|
|
4
7
|
tokenFilePath?: string;
|
|
8
|
+
usePKCE?: boolean;
|
|
5
9
|
}
|
|
6
10
|
/**
|
|
7
11
|
* User Authentication Coordinator
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-auth.d.ts","sourceRoot":"","sources":["../../src/auth/user-auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"user-auth.d.ts","sourceRoot":"","sources":["../../src/auth/user-auth.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,YAAY,CAAyD;IAC7E,OAAO,CAAC,WAAW,CAAa;gBAEpB,MAAM,EAAE,cAAc;IAYlC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAwDvC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA2DnC;;OAEG;IACH,eAAe,IAAI,OAAO;IAgB1B;;OAEG;IACH,MAAM,IAAI,IAAI;IAOd;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;YACW,WAAW;CAuB1B"}
|