vibehub-cli 1.1.3 → 1.1.5
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/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +3 -4
- package/dist/commands/whoami.js.map +1 -1
- package/dist/lib/supabase-auth.d.ts +1 -1
- package/dist/lib/supabase-auth.d.ts.map +1 -1
- package/dist/lib/supabase-auth.js +78 -61
- package/dist/lib/supabase-auth.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,aAAa,SA+GtB,CAAC"}
|
package/dist/commands/whoami.js
CHANGED
|
@@ -29,7 +29,6 @@ export const whoamiCommand = new Command('whoami')
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
const finalStatus = profileManager.getProfileStatus(displayProfile);
|
|
32
|
-
const expiryStr = profileManager.getTokenExpiryString(displayProfile);
|
|
33
32
|
// Get project info
|
|
34
33
|
const projectProfile = await profileManager.getProjectProfile();
|
|
35
34
|
const globalConfig = await profileManager.getGlobalConfig();
|
|
@@ -65,13 +64,13 @@ export const whoamiCommand = new Command('whoami')
|
|
|
65
64
|
let statusText;
|
|
66
65
|
switch (finalStatus) {
|
|
67
66
|
case 'active':
|
|
68
|
-
statusText = chalk.green(`✓ Valid (
|
|
67
|
+
statusText = chalk.green(`✓ Valid`) + chalk.gray(` (auto-refreshes)`);
|
|
69
68
|
break;
|
|
70
69
|
case 'expiring':
|
|
71
|
-
statusText = chalk.yellow(`⚠
|
|
70
|
+
statusText = chalk.yellow(`⚠ Refreshing soon`) + chalk.gray(` (auto-refreshes)`);
|
|
72
71
|
break;
|
|
73
72
|
case 'expired':
|
|
74
|
-
statusText = chalk.red('✗
|
|
73
|
+
statusText = chalk.red('✗ Session expired');
|
|
75
74
|
break;
|
|
76
75
|
}
|
|
77
76
|
console.log(chalk.gray(' Token: ') + statusText);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,gDAAgD,CAAC;KAC7D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,qBAAqB;IACrB,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,gBAAgB,EAAE,CAAC;IAExD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,oDAAoD;IACpD,MAAM,MAAM,GAAG,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,cAAc,GAAG,OAAO,CAAC;IAE7B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,cAAc,GAAG,MAAM,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import type { ProfileData } from './profile-manager.js';
|
|
|
8
8
|
* 3. Open browser to Supabase OAuth URL with Google provider
|
|
9
9
|
* 4. User authenticates with Google
|
|
10
10
|
* 5. Supabase redirects to localhost:54321/callback with code
|
|
11
|
-
* 6. CLI exchanges code for session tokens
|
|
11
|
+
* 6. CLI exchanges code for session tokens using PKCE
|
|
12
12
|
* 7. Return tokens to caller
|
|
13
13
|
*/
|
|
14
14
|
export declare class SupabaseAuth {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-auth.d.ts","sourceRoot":"","sources":["../../src/lib/supabase-auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"supabase-auth.d.ts","sourceRoot":"","sources":["../../src/lib/supabase-auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AA4DxD;;;;;;;;;;;GAWG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAiB;;IAMjC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAyI3D;;OAEG;IACG,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAuB9E;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;OAEG;IACH,OAAO,CAAC,cAAc;IA+FtB;;OAEG;IACH,OAAO,CAAC,YAAY;CAqFrB;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAGpC"}
|
|
@@ -21,10 +21,27 @@ function generateCodeChallenge(verifier) {
|
|
|
21
21
|
return crypto.createHash('sha256').update(verifier).digest('base64url');
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
24
|
+
* Exchange authorization code for tokens using Supabase token endpoint
|
|
25
25
|
*/
|
|
26
|
-
function
|
|
27
|
-
|
|
26
|
+
async function exchangeCodeForTokens(code, codeVerifier, redirectUri) {
|
|
27
|
+
const tokenUrl = `${SUPABASE_URL}/auth/v1/token?grant_type=pkce`;
|
|
28
|
+
const response = await fetch(tokenUrl, {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
headers: {
|
|
31
|
+
'Content-Type': 'application/json',
|
|
32
|
+
'apikey': SUPABASE_ANON_KEY,
|
|
33
|
+
},
|
|
34
|
+
body: JSON.stringify({
|
|
35
|
+
auth_code: code,
|
|
36
|
+
code_verifier: codeVerifier,
|
|
37
|
+
redirect_uri: redirectUri,
|
|
38
|
+
}),
|
|
39
|
+
});
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
const errorText = await response.text();
|
|
42
|
+
throw new Error(`Token exchange failed: ${errorText}`);
|
|
43
|
+
}
|
|
44
|
+
return response.json();
|
|
28
45
|
}
|
|
29
46
|
/**
|
|
30
47
|
* SupabaseAuth handles browser-based Google OAuth authentication for CLI.
|
|
@@ -35,7 +52,7 @@ function generateState() {
|
|
|
35
52
|
* 3. Open browser to Supabase OAuth URL with Google provider
|
|
36
53
|
* 4. User authenticates with Google
|
|
37
54
|
* 5. Supabase redirects to localhost:54321/callback with code
|
|
38
|
-
* 6. CLI exchanges code for session tokens
|
|
55
|
+
* 6. CLI exchanges code for session tokens using PKCE
|
|
39
56
|
* 7. Return tokens to caller
|
|
40
57
|
*/
|
|
41
58
|
export class SupabaseAuth {
|
|
@@ -49,68 +66,69 @@ export class SupabaseAuth {
|
|
|
49
66
|
return new Promise(async (resolve, reject) => {
|
|
50
67
|
const codeVerifier = generateCodeVerifier();
|
|
51
68
|
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
52
|
-
const
|
|
69
|
+
const redirectUri = `http://${CALLBACK_HOST}:${CALLBACK_PORT}/callback`;
|
|
70
|
+
let timeoutId = null;
|
|
71
|
+
let isResolved = false;
|
|
72
|
+
// Helper to close server properly
|
|
73
|
+
const closeServer = (server) => {
|
|
74
|
+
if (timeoutId) {
|
|
75
|
+
clearTimeout(timeoutId);
|
|
76
|
+
timeoutId = null;
|
|
77
|
+
}
|
|
78
|
+
server.closeAllConnections?.();
|
|
79
|
+
server.close();
|
|
80
|
+
};
|
|
53
81
|
// Create callback server
|
|
54
82
|
const server = http.createServer(async (req, res) => {
|
|
83
|
+
if (isResolved)
|
|
84
|
+
return;
|
|
55
85
|
try {
|
|
56
86
|
const reqUrl = new URL(req.url || '', `http://${CALLBACK_HOST}:${CALLBACK_PORT}`);
|
|
57
87
|
// Handle the OAuth callback
|
|
58
88
|
if (reqUrl.pathname === '/callback' || reqUrl.pathname === '/') {
|
|
59
89
|
const code = reqUrl.searchParams.get('code');
|
|
60
|
-
const returnedState = reqUrl.searchParams.get('state');
|
|
61
90
|
const error = reqUrl.searchParams.get('error');
|
|
62
91
|
const errorDescription = reqUrl.searchParams.get('error_description');
|
|
63
|
-
//
|
|
92
|
+
// Handle errors
|
|
64
93
|
if (error) {
|
|
65
94
|
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
66
95
|
res.end(this.getErrorHtml(errorDescription || error));
|
|
67
|
-
|
|
96
|
+
isResolved = true;
|
|
97
|
+
closeServer(server);
|
|
68
98
|
reject(new Error(errorDescription || error));
|
|
69
99
|
return;
|
|
70
100
|
}
|
|
71
101
|
if (!code) {
|
|
72
102
|
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
73
103
|
res.end(this.getErrorHtml('No authorization code received'));
|
|
74
|
-
|
|
104
|
+
isResolved = true;
|
|
105
|
+
closeServer(server);
|
|
75
106
|
reject(new Error('No authorization code received'));
|
|
76
107
|
return;
|
|
77
108
|
}
|
|
78
|
-
//
|
|
79
|
-
if (returnedState !== state) {
|
|
80
|
-
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
81
|
-
res.end(this.getErrorHtml('State mismatch - possible CSRF attack'));
|
|
82
|
-
server.close();
|
|
83
|
-
reject(new Error('State mismatch - possible CSRF attack'));
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
// Send success page to browser
|
|
109
|
+
// Send success page to browser immediately
|
|
87
110
|
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
88
111
|
res.end(this.getSuccessHtml());
|
|
89
|
-
// Exchange code for
|
|
112
|
+
// Exchange code for tokens using PKCE
|
|
90
113
|
try {
|
|
91
|
-
const
|
|
92
|
-
if (exchangeError || !data.session) {
|
|
93
|
-
server.close();
|
|
94
|
-
reject(new Error(exchangeError?.message || 'Failed to exchange code for session'));
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
const session = data.session;
|
|
98
|
-
const user = data.user;
|
|
114
|
+
const tokenData = await exchangeCodeForTokens(code, codeVerifier, redirectUri);
|
|
99
115
|
// Create profile data
|
|
100
116
|
const profileData = {
|
|
101
|
-
email: user.email || '',
|
|
102
|
-
userId: user.id,
|
|
103
|
-
accessToken:
|
|
104
|
-
refreshToken:
|
|
105
|
-
tokenExpiresAt: new Date(
|
|
117
|
+
email: tokenData.user.email || '',
|
|
118
|
+
userId: tokenData.user.id,
|
|
119
|
+
accessToken: tokenData.access_token,
|
|
120
|
+
refreshToken: tokenData.refresh_token || '',
|
|
121
|
+
tokenExpiresAt: new Date(Date.now() + tokenData.expires_in * 1000).toISOString(),
|
|
106
122
|
createdAt: new Date().toISOString(),
|
|
107
123
|
lastUsedAt: new Date().toISOString()
|
|
108
124
|
};
|
|
109
|
-
|
|
125
|
+
isResolved = true;
|
|
126
|
+
closeServer(server);
|
|
110
127
|
resolve(profileData);
|
|
111
128
|
}
|
|
112
129
|
catch (exchangeErr) {
|
|
113
|
-
|
|
130
|
+
isResolved = true;
|
|
131
|
+
closeServer(server);
|
|
114
132
|
reject(exchangeErr);
|
|
115
133
|
}
|
|
116
134
|
}
|
|
@@ -123,12 +141,18 @@ export class SupabaseAuth {
|
|
|
123
141
|
catch (err) {
|
|
124
142
|
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
|
125
143
|
res.end('Internal server error');
|
|
126
|
-
|
|
127
|
-
|
|
144
|
+
if (!isResolved) {
|
|
145
|
+
isResolved = true;
|
|
146
|
+
closeServer(server);
|
|
147
|
+
reject(err);
|
|
148
|
+
}
|
|
128
149
|
}
|
|
129
150
|
});
|
|
130
151
|
// Handle server errors
|
|
131
152
|
server.on('error', (err) => {
|
|
153
|
+
if (isResolved)
|
|
154
|
+
return;
|
|
155
|
+
isResolved = true;
|
|
132
156
|
if (err.code === 'EADDRINUSE') {
|
|
133
157
|
reject(new Error(`Port ${CALLBACK_PORT} is already in use. Please close any applications using this port and try again.`));
|
|
134
158
|
}
|
|
@@ -139,37 +163,30 @@ export class SupabaseAuth {
|
|
|
139
163
|
// Start server
|
|
140
164
|
server.listen(CALLBACK_PORT, CALLBACK_HOST, async () => {
|
|
141
165
|
try {
|
|
142
|
-
// Build OAuth URL with PKCE
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
queryParams: {
|
|
149
|
-
code_challenge: codeChallenge,
|
|
150
|
-
code_challenge_method: 'S256',
|
|
151
|
-
state: state
|
|
152
|
-
},
|
|
153
|
-
skipBrowserRedirect: true
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
if (error || !data.url) {
|
|
157
|
-
server.close();
|
|
158
|
-
reject(new Error(error?.message || 'Failed to generate OAuth URL'));
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
166
|
+
// Build OAuth URL with PKCE parameters
|
|
167
|
+
const authUrl = new URL(`${SUPABASE_URL}/auth/v1/authorize`);
|
|
168
|
+
authUrl.searchParams.set('provider', 'google');
|
|
169
|
+
authUrl.searchParams.set('redirect_to', redirectUri);
|
|
170
|
+
authUrl.searchParams.set('code_challenge', codeChallenge);
|
|
171
|
+
authUrl.searchParams.set('code_challenge_method', 'S256');
|
|
161
172
|
// Open browser
|
|
162
173
|
const { default: open } = await import('open');
|
|
163
|
-
await open(
|
|
174
|
+
await open(authUrl.toString());
|
|
164
175
|
// Set timeout for authentication (5 minutes)
|
|
165
|
-
setTimeout(() => {
|
|
166
|
-
|
|
167
|
-
|
|
176
|
+
timeoutId = setTimeout(() => {
|
|
177
|
+
if (!isResolved) {
|
|
178
|
+
isResolved = true;
|
|
179
|
+
closeServer(server);
|
|
180
|
+
reject(new Error('Authentication timed out. Please try again.'));
|
|
181
|
+
}
|
|
168
182
|
}, 5 * 60 * 1000);
|
|
169
183
|
}
|
|
170
184
|
catch (err) {
|
|
171
|
-
|
|
172
|
-
|
|
185
|
+
if (!isResolved) {
|
|
186
|
+
isResolved = true;
|
|
187
|
+
closeServer(server);
|
|
188
|
+
reject(err);
|
|
189
|
+
}
|
|
173
190
|
}
|
|
174
191
|
});
|
|
175
192
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase-auth.js","sourceRoot":"","sources":["../../src/lib/supabase-auth.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAkB,MAAM,uBAAuB,CAAC;AAGrE,yBAAyB;AACzB,MAAM,YAAY,GAAG,0CAA0C,CAAC;AAChE,MAAM,iBAAiB,GAAG,kNAAkN,CAAC;AAE7O,gCAAgC;AAChC,MAAM,aAAa,GAAG,KAAK,CAAC;AAC5B,MAAM,aAAa,GAAG,WAAW,CAAC;AAElC;;GAEG;AACH,SAAS,oBAAoB;IAC3B,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,QAAgB;IAC7C,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"supabase-auth.js","sourceRoot":"","sources":["../../src/lib/supabase-auth.ts"],"names":[],"mappings":"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"}
|