@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/dist/auth/user-auth.js
CHANGED
|
@@ -19,7 +19,7 @@ export class UserAuth {
|
|
|
19
19
|
clientId: config.clientId,
|
|
20
20
|
clientSecret: config.clientSecret,
|
|
21
21
|
redirectUri: config.redirectUri,
|
|
22
|
-
|
|
22
|
+
usePKCE: config.usePKCE ?? false, // Default to false for TribeCRM compatibility
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
@@ -58,9 +58,22 @@ export class UserAuth {
|
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
// No valid tokens - user needs to authenticate
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
'
|
|
61
|
+
const tokenPath = this.tokenManager.getTokenPath();
|
|
62
|
+
throw new Error('š User Authentication Required\n\n' +
|
|
63
|
+
'No valid authentication tokens found. You need to authenticate first.\n\n' +
|
|
64
|
+
'⨠EASY WAY - Authenticate directly from Claude:\n\n' +
|
|
65
|
+
' Ask me: "Can you authenticate with TribeCRM?"\n' +
|
|
66
|
+
' I\'ll use the tribecrm_authenticate tool to generate a login link for you!\n\n' +
|
|
67
|
+
'š Alternative - Manual authentication:\n\n' +
|
|
68
|
+
'1. Open your terminal/command prompt\n' +
|
|
69
|
+
'2. Navigate to your TribeCRM MCP server directory\n' +
|
|
70
|
+
'3. Run: npm run authenticate\n' +
|
|
71
|
+
'4. Your browser will open for TribeCRM login\n' +
|
|
72
|
+
'5. After successful login, tokens will be saved to:\n' +
|
|
73
|
+
` ${tokenPath}\n\n` +
|
|
74
|
+
'š” Or switch to app authentication by setting:\n' +
|
|
75
|
+
' TRIBECRM_AUTH=app (in your Claude Desktop config)\n\n' +
|
|
76
|
+
'For more help, see: https://github.com/efficy-sa/tribecrm-mcp-server#user-authentication');
|
|
64
77
|
}
|
|
65
78
|
/**
|
|
66
79
|
* Perform interactive OAuth authentication flow
|
|
@@ -69,11 +82,11 @@ export class UserAuth {
|
|
|
69
82
|
async authenticate() {
|
|
70
83
|
const callbackPort = this.config.callbackPort || 3000;
|
|
71
84
|
console.error('\nš Starting TribeCRM User Authentication...\n');
|
|
72
|
-
// Generate PKCE pair
|
|
73
|
-
const pkce = this.oauthFlow.generatePKCE();
|
|
85
|
+
// Generate PKCE pair (only if usePKCE is enabled)
|
|
86
|
+
const pkce = this.config.usePKCE ? this.oauthFlow.generatePKCE() : null;
|
|
74
87
|
const state = OAuthFlow.generateState();
|
|
75
88
|
// Generate consent URL
|
|
76
|
-
const consentUrl = this.oauthFlow.generateConsentUrl(state, pkce
|
|
89
|
+
const consentUrl = this.oauthFlow.generateConsentUrl(state, pkce?.challenge);
|
|
77
90
|
// Start callback server
|
|
78
91
|
const callbackServer = new CallbackServer(callbackPort);
|
|
79
92
|
console.error('š Step 1: Opening your browser for authentication...');
|
|
@@ -93,7 +106,7 @@ export class UserAuth {
|
|
|
93
106
|
console.error('');
|
|
94
107
|
console.error('š Step 4: Exchanging code for access token...');
|
|
95
108
|
// Exchange code for tokens
|
|
96
|
-
const tokens = await this.oauthFlow.exchangeCodeForTokens(result.code, pkce
|
|
109
|
+
const tokens = await this.oauthFlow.exchangeCodeForTokens(result.code, pkce?.verifier);
|
|
97
110
|
// Save tokens
|
|
98
111
|
this.tokenManager.saveTokens(tokens);
|
|
99
112
|
// Update in-memory tokens
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-auth.js","sourceRoot":"","sources":["../../src/auth/user-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgB,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"user-auth.js","sourceRoot":"","sources":["../../src/auth/user-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-auth.test.d.ts","sourceRoot":"","sources":["../../src/auth/user-auth.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { UserAuth } from './user-auth.js';
|
|
3
|
+
import { TokenManager } from './token-manager.js';
|
|
4
|
+
import { OAuthFlow } from './oauth-flow.js';
|
|
5
|
+
import { CallbackServer } from './callback-server.js';
|
|
6
|
+
// Mock modules
|
|
7
|
+
vi.mock('./token-manager.js');
|
|
8
|
+
vi.mock('./oauth-flow.js');
|
|
9
|
+
vi.mock('./callback-server.js');
|
|
10
|
+
describe('UserAuth', () => {
|
|
11
|
+
let userAuth;
|
|
12
|
+
let mockTokenManager;
|
|
13
|
+
let mockOAuthFlow;
|
|
14
|
+
let mockCallbackServer;
|
|
15
|
+
const testConfig = {
|
|
16
|
+
authUrl: 'https://auth.test.com',
|
|
17
|
+
clientId: 'test-client-id',
|
|
18
|
+
clientSecret: 'test-client-secret',
|
|
19
|
+
redirectUri: 'http://localhost:3000/callback',
|
|
20
|
+
organizationId: 'test-org-id',
|
|
21
|
+
callbackPort: 3000,
|
|
22
|
+
tokenFilePath: '/test/tokens.json'
|
|
23
|
+
};
|
|
24
|
+
const mockTokens = {
|
|
25
|
+
access_token: 'test-access-token',
|
|
26
|
+
token_type: 'Bearer',
|
|
27
|
+
expires_in: 86400,
|
|
28
|
+
scope: 'read write offline',
|
|
29
|
+
refresh_token: 'test-refresh-token'
|
|
30
|
+
};
|
|
31
|
+
const mockStoredTokens = {
|
|
32
|
+
...mockTokens,
|
|
33
|
+
expires_at: Date.now() + 3600000 // 1 hour from now
|
|
34
|
+
};
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
vi.clearAllMocks();
|
|
37
|
+
// Setup TokenManager mock
|
|
38
|
+
mockTokenManager = {
|
|
39
|
+
loadTokens: vi.fn(),
|
|
40
|
+
saveTokens: vi.fn(),
|
|
41
|
+
deleteTokens: vi.fn(),
|
|
42
|
+
areTokensValid: vi.fn(),
|
|
43
|
+
getTokenPath: vi.fn().mockReturnValue('/test/tokens.json')
|
|
44
|
+
};
|
|
45
|
+
vi.mocked(TokenManager).mockImplementation(() => mockTokenManager);
|
|
46
|
+
// Setup OAuthFlow mock
|
|
47
|
+
mockOAuthFlow = {
|
|
48
|
+
generatePKCE: vi.fn().mockReturnValue({
|
|
49
|
+
verifier: 'test-verifier',
|
|
50
|
+
challenge: 'test-challenge'
|
|
51
|
+
}),
|
|
52
|
+
generateConsentUrl: vi.fn().mockReturnValue('https://auth.test.com/consent'),
|
|
53
|
+
exchangeCodeForTokens: vi.fn().mockResolvedValue(mockTokens),
|
|
54
|
+
refreshAccessToken: vi.fn().mockResolvedValue(mockTokens)
|
|
55
|
+
};
|
|
56
|
+
vi.mocked(OAuthFlow).mockImplementation(() => mockOAuthFlow);
|
|
57
|
+
vi.mocked(OAuthFlow.generateState).mockReturnValue('test-state');
|
|
58
|
+
// Setup CallbackServer mock
|
|
59
|
+
mockCallbackServer = {
|
|
60
|
+
waitForCallback: vi.fn().mockResolvedValue({
|
|
61
|
+
code: 'test-auth-code',
|
|
62
|
+
state: 'test-state'
|
|
63
|
+
}),
|
|
64
|
+
stop: vi.fn(),
|
|
65
|
+
getPort: vi.fn().mockReturnValue(3000)
|
|
66
|
+
};
|
|
67
|
+
vi.mocked(CallbackServer).mockImplementation(() => mockCallbackServer);
|
|
68
|
+
userAuth = new UserAuth(testConfig);
|
|
69
|
+
});
|
|
70
|
+
afterEach(() => {
|
|
71
|
+
vi.restoreAllMocks();
|
|
72
|
+
});
|
|
73
|
+
describe('constructor', () => {
|
|
74
|
+
it('should initialize with provided config', () => {
|
|
75
|
+
expect(TokenManager).toHaveBeenCalledWith('/test/tokens.json');
|
|
76
|
+
expect(OAuthFlow).toHaveBeenCalledWith({
|
|
77
|
+
authUrl: testConfig.authUrl,
|
|
78
|
+
clientId: testConfig.clientId,
|
|
79
|
+
clientSecret: testConfig.clientSecret,
|
|
80
|
+
redirectUri: testConfig.redirectUri,
|
|
81
|
+
organizationId: testConfig.organizationId
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
it('should work without optional config parameters', () => {
|
|
85
|
+
const minimalConfig = {
|
|
86
|
+
authUrl: 'https://auth.test.com',
|
|
87
|
+
clientId: 'test-client-id',
|
|
88
|
+
clientSecret: 'test-client-secret',
|
|
89
|
+
redirectUri: 'http://localhost:3000/callback'
|
|
90
|
+
};
|
|
91
|
+
const minimalUserAuth = new UserAuth(minimalConfig);
|
|
92
|
+
expect(minimalUserAuth).toBeDefined();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('getAccessToken', () => {
|
|
96
|
+
it('should return current token if still valid', async () => {
|
|
97
|
+
// Simulate having a valid token in memory
|
|
98
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
99
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
100
|
+
const token1 = await userAuth.getAccessToken();
|
|
101
|
+
const token2 = await userAuth.getAccessToken(); // Should use cached token
|
|
102
|
+
expect(token1).toBe(mockTokens.access_token);
|
|
103
|
+
expect(token2).toBe(mockTokens.access_token);
|
|
104
|
+
expect(mockTokenManager.loadTokens).toHaveBeenCalledTimes(1); // Only loaded once
|
|
105
|
+
});
|
|
106
|
+
it('should load tokens from disk if not in memory', async () => {
|
|
107
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
108
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
109
|
+
const token = await userAuth.getAccessToken();
|
|
110
|
+
expect(token).toBe(mockTokens.access_token);
|
|
111
|
+
expect(mockTokenManager.loadTokens).toHaveBeenCalled();
|
|
112
|
+
expect(mockTokenManager.areTokensValid).toHaveBeenCalled();
|
|
113
|
+
});
|
|
114
|
+
it('should refresh expired tokens using refresh_token', async () => {
|
|
115
|
+
const expiredTokens = {
|
|
116
|
+
...mockStoredTokens,
|
|
117
|
+
expires_at: Date.now() - 1000 // Expired 1 second ago
|
|
118
|
+
};
|
|
119
|
+
const newTokens = {
|
|
120
|
+
...mockTokens,
|
|
121
|
+
access_token: 'new-access-token',
|
|
122
|
+
expires_at: Date.now() + 3600000
|
|
123
|
+
};
|
|
124
|
+
mockTokenManager.loadTokens.mockReturnValue(expiredTokens);
|
|
125
|
+
mockTokenManager.areTokensValid.mockReturnValue(false);
|
|
126
|
+
mockOAuthFlow.refreshAccessToken.mockResolvedValue(newTokens);
|
|
127
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
128
|
+
const token = await userAuth.getAccessToken();
|
|
129
|
+
expect(token).toBe('new-access-token');
|
|
130
|
+
expect(mockOAuthFlow.refreshAccessToken).toHaveBeenCalledWith('test-refresh-token');
|
|
131
|
+
expect(mockTokenManager.saveTokens).toHaveBeenCalledWith(newTokens);
|
|
132
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Access token expired, refreshing...');
|
|
133
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Access token refreshed successfully');
|
|
134
|
+
consoleErrorSpy.mockRestore();
|
|
135
|
+
});
|
|
136
|
+
it('should throw error if no valid tokens and refresh fails', async () => {
|
|
137
|
+
const expiredTokens = {
|
|
138
|
+
...mockStoredTokens,
|
|
139
|
+
expires_at: Date.now() - 1000
|
|
140
|
+
};
|
|
141
|
+
mockTokenManager.loadTokens.mockReturnValue(expiredTokens);
|
|
142
|
+
mockTokenManager.areTokensValid.mockReturnValue(false);
|
|
143
|
+
mockOAuthFlow.refreshAccessToken.mockRejectedValue(new Error('Refresh failed'));
|
|
144
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
145
|
+
await expect(userAuth.getAccessToken()).rejects.toThrow('No valid authentication tokens found');
|
|
146
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Token refresh failed:', 'Refresh failed');
|
|
147
|
+
consoleErrorSpy.mockRestore();
|
|
148
|
+
});
|
|
149
|
+
it('should throw error if no tokens exist on disk', async () => {
|
|
150
|
+
mockTokenManager.loadTokens.mockReturnValue(null);
|
|
151
|
+
await expect(userAuth.getAccessToken()).rejects.toThrow('No valid authentication tokens found. Please run the authentication process');
|
|
152
|
+
});
|
|
153
|
+
it('should throw error with helpful message about authentication', async () => {
|
|
154
|
+
mockTokenManager.loadTokens.mockReturnValue(null);
|
|
155
|
+
try {
|
|
156
|
+
await userAuth.getAccessToken();
|
|
157
|
+
expect.fail('Should have thrown error');
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
expect(error.message).toContain('npx @efficy/tribecrm-mcp-server authenticate');
|
|
161
|
+
expect(error.message).toContain('TRIBECRM_AUTH=app');
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
it('should use in-memory token if expiry is more than 60 seconds away', async () => {
|
|
165
|
+
// First call loads from disk
|
|
166
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
167
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
168
|
+
await userAuth.getAccessToken();
|
|
169
|
+
// Second call should use in-memory token (not load from disk again)
|
|
170
|
+
mockTokenManager.loadTokens.mockClear();
|
|
171
|
+
const token = await userAuth.getAccessToken();
|
|
172
|
+
expect(token).toBe(mockTokens.access_token);
|
|
173
|
+
expect(mockTokenManager.loadTokens).not.toHaveBeenCalled();
|
|
174
|
+
});
|
|
175
|
+
it('should reload token if expiry is less than 60 seconds away', async () => {
|
|
176
|
+
const soonToExpireTokens = {
|
|
177
|
+
...mockStoredTokens,
|
|
178
|
+
expires_at: Date.now() + 30000 // 30 seconds from now
|
|
179
|
+
};
|
|
180
|
+
// First call
|
|
181
|
+
mockTokenManager.loadTokens.mockReturnValueOnce(soonToExpireTokens);
|
|
182
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
183
|
+
await userAuth.getAccessToken();
|
|
184
|
+
// Second call should reload because expiry is soon
|
|
185
|
+
const freshTokens = {
|
|
186
|
+
...mockStoredTokens,
|
|
187
|
+
expires_at: Date.now() + 3600000
|
|
188
|
+
};
|
|
189
|
+
mockTokenManager.loadTokens.mockReturnValue(freshTokens);
|
|
190
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
191
|
+
const token = await userAuth.getAccessToken();
|
|
192
|
+
expect(token).toBe(mockTokens.access_token);
|
|
193
|
+
expect(mockTokenManager.loadTokens).toHaveBeenCalledTimes(2);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
describe('authenticate', () => {
|
|
197
|
+
it('should complete full OAuth flow successfully', async () => {
|
|
198
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
199
|
+
// Mock browser opening
|
|
200
|
+
const mockExec = vi.fn().mockResolvedValue({ stdout: '', stderr: '' });
|
|
201
|
+
vi.doMock('child_process', () => ({
|
|
202
|
+
exec: mockExec
|
|
203
|
+
}));
|
|
204
|
+
vi.doMock('util', () => ({
|
|
205
|
+
promisify: (fn) => mockExec
|
|
206
|
+
}));
|
|
207
|
+
await userAuth.authenticate();
|
|
208
|
+
// Verify PKCE generation
|
|
209
|
+
expect(mockOAuthFlow.generatePKCE).toHaveBeenCalled();
|
|
210
|
+
expect(OAuthFlow.generateState).toHaveBeenCalled();
|
|
211
|
+
// Verify consent URL generation
|
|
212
|
+
expect(mockOAuthFlow.generateConsentUrl).toHaveBeenCalledWith('test-state', 'test-challenge');
|
|
213
|
+
// Verify callback server was started
|
|
214
|
+
expect(CallbackServer).toHaveBeenCalledWith(3000);
|
|
215
|
+
expect(mockCallbackServer.waitForCallback).toHaveBeenCalledWith('test-state');
|
|
216
|
+
// Verify code exchange
|
|
217
|
+
expect(mockOAuthFlow.exchangeCodeForTokens).toHaveBeenCalledWith('test-auth-code', 'test-verifier');
|
|
218
|
+
// Verify tokens were saved
|
|
219
|
+
expect(mockTokenManager.saveTokens).toHaveBeenCalledWith(mockTokens);
|
|
220
|
+
// Verify success messages
|
|
221
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Starting TribeCRM User Authentication'));
|
|
222
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Authentication successful'));
|
|
223
|
+
consoleErrorSpy.mockRestore();
|
|
224
|
+
});
|
|
225
|
+
it('should use custom callback port if configured', async () => {
|
|
226
|
+
const customConfig = {
|
|
227
|
+
...testConfig,
|
|
228
|
+
callbackPort: 4567
|
|
229
|
+
};
|
|
230
|
+
const customUserAuth = new UserAuth(customConfig);
|
|
231
|
+
vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
232
|
+
await customUserAuth.authenticate();
|
|
233
|
+
expect(CallbackServer).toHaveBeenCalledWith(4567);
|
|
234
|
+
});
|
|
235
|
+
it('should throw error if callback fails', async () => {
|
|
236
|
+
mockCallbackServer.waitForCallback.mockRejectedValue(new Error('Callback timeout'));
|
|
237
|
+
vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
238
|
+
await expect(userAuth.authenticate()).rejects.toThrow('Authentication failed: Callback timeout');
|
|
239
|
+
expect(mockCallbackServer.stop).toHaveBeenCalled();
|
|
240
|
+
});
|
|
241
|
+
it('should throw error if token exchange fails', async () => {
|
|
242
|
+
mockOAuthFlow.exchangeCodeForTokens.mockRejectedValue(new Error('Invalid authorization code'));
|
|
243
|
+
vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
244
|
+
await expect(userAuth.authenticate()).rejects.toThrow('Authentication failed: Invalid authorization code');
|
|
245
|
+
});
|
|
246
|
+
it('should display consent URL in console', async () => {
|
|
247
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
248
|
+
await userAuth.authenticate();
|
|
249
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('https://auth.test.com/consent'));
|
|
250
|
+
consoleErrorSpy.mockRestore();
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
describe('isAuthenticated', () => {
|
|
254
|
+
it('should return true if valid token in memory', () => {
|
|
255
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
256
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
257
|
+
// Load token into memory
|
|
258
|
+
userAuth.getAccessToken();
|
|
259
|
+
expect(userAuth.isAuthenticated()).toBe(true);
|
|
260
|
+
});
|
|
261
|
+
it('should return true if stored tokens are valid', () => {
|
|
262
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
263
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
264
|
+
expect(userAuth.isAuthenticated()).toBe(true);
|
|
265
|
+
});
|
|
266
|
+
it('should return true if tokens expired but refresh_token exists', () => {
|
|
267
|
+
const expiredTokens = {
|
|
268
|
+
...mockStoredTokens,
|
|
269
|
+
expires_at: Date.now() - 1000
|
|
270
|
+
};
|
|
271
|
+
mockTokenManager.loadTokens.mockReturnValue(expiredTokens);
|
|
272
|
+
mockTokenManager.areTokensValid.mockReturnValue(false);
|
|
273
|
+
expect(userAuth.isAuthenticated()).toBe(true); // Can refresh
|
|
274
|
+
});
|
|
275
|
+
it('should return false if no tokens exist', () => {
|
|
276
|
+
mockTokenManager.loadTokens.mockReturnValue(null);
|
|
277
|
+
expect(userAuth.isAuthenticated()).toBe(false);
|
|
278
|
+
});
|
|
279
|
+
it('should return false if tokens expired and no refresh_token', () => {
|
|
280
|
+
const expiredTokensNoRefresh = {
|
|
281
|
+
access_token: 'old-token',
|
|
282
|
+
token_type: 'Bearer',
|
|
283
|
+
expires_in: 3600,
|
|
284
|
+
expires_at: Date.now() - 1000
|
|
285
|
+
// No refresh_token
|
|
286
|
+
};
|
|
287
|
+
mockTokenManager.loadTokens.mockReturnValue(expiredTokensNoRefresh);
|
|
288
|
+
mockTokenManager.areTokensValid.mockReturnValue(false);
|
|
289
|
+
expect(userAuth.isAuthenticated()).toBe(false);
|
|
290
|
+
});
|
|
291
|
+
it('should check in-memory token before disk', () => {
|
|
292
|
+
// Set up valid in-memory token
|
|
293
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
294
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
295
|
+
userAuth.getAccessToken();
|
|
296
|
+
// Clear mock to verify it's not called again
|
|
297
|
+
mockTokenManager.loadTokens.mockClear();
|
|
298
|
+
expect(userAuth.isAuthenticated()).toBe(true);
|
|
299
|
+
expect(mockTokenManager.loadTokens).not.toHaveBeenCalled();
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
describe('logout', () => {
|
|
303
|
+
it('should delete tokens and clear memory', async () => {
|
|
304
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
305
|
+
// First authenticate
|
|
306
|
+
mockTokenManager.loadTokens.mockReturnValue(mockStoredTokens);
|
|
307
|
+
mockTokenManager.areTokensValid.mockReturnValue(true);
|
|
308
|
+
await userAuth.getAccessToken();
|
|
309
|
+
expect(userAuth.isAuthenticated()).toBe(true);
|
|
310
|
+
// Logout
|
|
311
|
+
userAuth.logout();
|
|
312
|
+
expect(mockTokenManager.deleteTokens).toHaveBeenCalled();
|
|
313
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Logged out successfully');
|
|
314
|
+
// After logout, should need to load from disk again
|
|
315
|
+
mockTokenManager.loadTokens.mockReturnValue(null);
|
|
316
|
+
expect(userAuth.isAuthenticated()).toBe(false);
|
|
317
|
+
consoleErrorSpy.mockRestore();
|
|
318
|
+
});
|
|
319
|
+
it('should handle logout when not authenticated', () => {
|
|
320
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
321
|
+
userAuth.logout();
|
|
322
|
+
expect(mockTokenManager.deleteTokens).toHaveBeenCalled();
|
|
323
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Logged out successfully');
|
|
324
|
+
consoleErrorSpy.mockRestore();
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
describe('getTokenPath', () => {
|
|
328
|
+
it('should return token file path from token manager', () => {
|
|
329
|
+
const path = userAuth.getTokenPath();
|
|
330
|
+
expect(path).toBe('/test/tokens.json');
|
|
331
|
+
expect(mockTokenManager.getTokenPath).toHaveBeenCalled();
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
describe('edge cases and error handling', () => {
|
|
335
|
+
it('should handle token manager errors gracefully', async () => {
|
|
336
|
+
mockTokenManager.loadTokens.mockImplementation(() => {
|
|
337
|
+
throw new Error('Disk read error');
|
|
338
|
+
});
|
|
339
|
+
await expect(userAuth.getAccessToken()).rejects.toThrow();
|
|
340
|
+
});
|
|
341
|
+
it('should handle OAuth flow errors gracefully', async () => {
|
|
342
|
+
mockOAuthFlow.exchangeCodeForTokens.mockRejectedValue(new Error('Network error'));
|
|
343
|
+
vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
344
|
+
await expect(userAuth.authenticate()).rejects.toThrow('Authentication failed: Network error');
|
|
345
|
+
});
|
|
346
|
+
it('should handle callback server errors gracefully', async () => {
|
|
347
|
+
mockCallbackServer.waitForCallback.mockRejectedValue(new Error('Port in use'));
|
|
348
|
+
vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
349
|
+
await expect(userAuth.authenticate()).rejects.toThrow('Authentication failed: Port in use');
|
|
350
|
+
expect(mockCallbackServer.stop).toHaveBeenCalled();
|
|
351
|
+
});
|
|
352
|
+
it('should handle missing refresh_token during refresh', async () => {
|
|
353
|
+
const tokensWithoutRefresh = {
|
|
354
|
+
access_token: 'old-token',
|
|
355
|
+
token_type: 'Bearer',
|
|
356
|
+
expires_in: 3600,
|
|
357
|
+
expires_at: Date.now() - 1000
|
|
358
|
+
// No refresh_token
|
|
359
|
+
};
|
|
360
|
+
mockTokenManager.loadTokens.mockReturnValue(tokensWithoutRefresh);
|
|
361
|
+
mockTokenManager.areTokensValid.mockReturnValue(false);
|
|
362
|
+
await expect(userAuth.getAccessToken()).rejects.toThrow('No valid authentication tokens found');
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
//# sourceMappingURL=user-auth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-auth.test.js","sourceRoot":"","sources":["../../src/auth/user-auth.test.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAa,MAAM,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAGpG,qBAAa,cAAc;IACzB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,MAAM,EAAE,cAAc;IAyBlC;;OAEG;IACH,OAAO,CAAC,kBAAkB;YASZ,mBAAmB;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAa,MAAM,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAGpG,qBAAa,cAAc;IACzB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,MAAM,EAAE,cAAc;IAyBlC;;OAEG;IACH,OAAO,CAAC,kBAAkB;YASZ,mBAAmB;IAoDjC;;;;;;OAMG;IACG,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;IAUlB;;;;OAIG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAMlF;;;;;OAKG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAOpG;;;;OAIG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvE;;;;OAIG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,GACA,OAAO,CAAC,GAAG,CAAC;IAgBf;;OAEG;IACG,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IASvD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAoB/C"}
|
package/dist/client.js
CHANGED
|
@@ -23,8 +23,8 @@ export class TribeCRMClient {
|
|
|
23
23
|
clientId: config.clientId,
|
|
24
24
|
clientSecret: config.clientSecret,
|
|
25
25
|
redirectUri: redirectUri,
|
|
26
|
-
organizationId: config.organizationId,
|
|
27
26
|
callbackPort: callbackPort,
|
|
27
|
+
usePKCE: false, // TribeCRM doesn't use PKCE for user auth
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -71,7 +71,6 @@ export class TribeCRMClient {
|
|
|
71
71
|
client_id: this.config.clientId,
|
|
72
72
|
client_secret: this.config.clientSecret,
|
|
73
73
|
scope: 'read write offline',
|
|
74
|
-
...(this.config.organizationId && { organization_id: this.config.organizationId }),
|
|
75
74
|
}), {
|
|
76
75
|
headers: {
|
|
77
76
|
'Content-Type': 'application/x-www-form-urlencoded',
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,OAAO,cAAc;IACjB,aAAa,CAAgB;IAC7B,MAAM,CAAiB;IACvB,KAAK,GAAqB,IAAI,CAAC;IAC/B,WAAW,GAAW,CAAC,CAAC;IACxB,QAAQ,GAAoB,IAAI,CAAC;IAEzC,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;YAChC,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;QAEH,yDAAyD;QACzD,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,gCAAgC,CAAC;YAC1F,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAE1D,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC;gBAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,WAAW,EAAE,WAAW;gBACxB,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.test.js
CHANGED
|
@@ -16,7 +16,6 @@ describe('TribeCRMClient', () => {
|
|
|
16
16
|
authUrl: 'https://auth-test.tribecrm.nl',
|
|
17
17
|
clientId: 'test-client-id',
|
|
18
18
|
clientSecret: 'test-client-secret',
|
|
19
|
-
organizationId: 'test-org-id',
|
|
20
19
|
mode: 'read-write',
|
|
21
20
|
};
|
|
22
21
|
// Mock axios.create to return a mocked instance
|