slek-ai-cli 1.1.7 → 1.1.9
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/.env +7 -0
- package/auth.js +45 -47
- package/cli.js +1 -1
- package/package.json +2 -2
package/.env
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
FIREBASE_PROJECT_ID="charm-f004f"
|
|
2
|
+
FIREBASE_CLIENT_EMAIL="firebase-adminsdk-fbsvc@charm-f004f.iam.gserviceaccount.com"
|
|
3
|
+
FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDPq0be+jDD2xzZ\nHfWTD3QhZK9/vSZAah4hBN6mozeJMkeY4HF7PH8q6e/14AcLK8NtOiYOGDW0fQNX\nR4khT/DBtkEt+BR6CqGS38u+0ahhua9hw5ea8c6+8Zu9elUWHJ1mdYnt96IGf4Tj\nrJcBe5CKxJb8YvHLd1pUvjDcwxzG46qar0shr2yJJo7z8XyQImwtXjqNd7P9FnfE\nIlBZsMGbSnW+tv/ryCoPAaQJW4A/80qDLctUuKp1nSw3Hm8r/jqPmzBEt72beCxX\nPoR4RSKWZ4Pm8yFZgw2xwU41s7loIhHQeFYN1pE5OaIhZLpGedhgEST51MaIM62I\nrhCDS85VAgMBAAECgf829V0MJapCKvq3evZCtRRGwh6v757v7SWMF33VG9zWsjfA\nfaWKt7fv43ld2KwEiNBvV7Q6hq2v1mXL82KXLlDI8zLMt5qzsZyRAikpltK5Cisf\n9GNq3hOY9NgCjR13fJsrQm/+SkrW7Wh92G8eNVVLZDuRD55t+mgthSfpRLmY6K1G\nGNhwtzwJkNHMh5ZgRFhKHwCjR7s14Lt72TIak2jDn9Fdwn5f5oF/7RoQx5Y5D9sD\ngMlWshdmmi40jjsa8Kvepun0dwmnh3CWjEB3E1DoKWjVKbSaYSryrWKA9uXYiOh3\nPZe7T5pv2OfvoORpsWwI/hOb+2yJ4gv/22b5mvECgYEA81BAAbCgqA121JExnuHP\ndoTO5gdzpc6YoHYAp2cyuyEm1yA+CwamoFglSkiwpq/odnNMo/SfOxgkoIurDtn0\n3J7ARFKOK4pHZkTAvL2jqkuvh1dJc5+NC/i3SgQq8t1df/dkZ//LNycAwPZQDNuv\nV44eG68xdrC9pHY+W5NIVhECgYEA2n8+qLXJJcUt6D2Ij6GmMtjdk8gEjMzHvWC4\nICdPsCyNHEsM2e/sJQOiV+UDEjtoDWZgfe/A5vibMMQQbeHr+3ibgMvjsbvrdVWb\nq1cmjDI94D4mOms71QgH0H+QtF2t4iQWiviudIeLqF0EUpMWsvgO9B/oJUEL6WXt\nt3YgIAUCgYEAxEKEDpjpTgTmSBoB23WrgZ8owJVcLG9T34KvjliIrDbWfIouYXhw\n6T+QfLXbf+i+auUf+dQ0qFcWHEXsqeMXRunqjnHE6cv1QcHNcbDKFnBMWrAGuHQH\nMpPhTJvGBPaYF8N2wwiqY4dbbUqBUY3WhppFIPGUxXdU0Rbrv7QykfECgYEAvVTn\nod+sBkufZQ/1BqkHUCY1kroOn0dPiV2HD22hEsL4H900rKDG2qgUg99RUvohRwNA\nd8BKQpqIN7Cdn+nVx5mR/gAvNLLm7EybUNR69Z8PmQGhtJt5RDbqNpRjerd2Vm/5\nDMFCwn012lWHylnkoH5szsPbMHT18nA9le0JF1UCgYEAlJNW/WqqTETu1JciGn3o\nIeG2jbdcUjHpnd8fKVUNm4yRCtwLsHRQar0/DI1FNUAqpi/wEU9CB5YVjyyTKWQX\nOyidG32VtkB6yTmlLKxnxY2+VxL4Vfk6ka9K/6tcLfFpy+LYgAzEbeRR32kz6upu\nLudPjkoiArV7RQZE/G7ySH4=\n-----END PRIVATE KEY-----\n"
|
|
4
|
+
FIREBASE_API_KEY="AIzaSyBoQHn_adTTj1ZaYZBMHCMSAblCGCIbQG4"
|
|
5
|
+
FIREBASE_AUTH_DOMAIN="charm-f004f.firebaseapp.com"
|
|
6
|
+
GOOGLE_CLIENT_ID="763614479011-v2m44ees6jhjaprj5ndoa0up83gf1qah.apps.googleusercontent.com"
|
|
7
|
+
GOOGLE_CLIENT_SECRET="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"
|
package/auth.js
CHANGED
|
@@ -10,9 +10,14 @@ const axios = require('axios');
|
|
|
10
10
|
const chalk = require('chalk');
|
|
11
11
|
const boxen = require('boxen');
|
|
12
12
|
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
// Load environment variables from .env
|
|
14
|
+
require('dotenv').config({ path: path.join(__dirname, '.env') });
|
|
15
|
+
|
|
16
|
+
// ─── Firebase / Google config ────────────────────────────────────────────────
|
|
17
|
+
const FIREBASE_API_KEY = process.env.FIREBASE_API_KEY || 'AIzaSyBoQHn_adTTj1ZaYZBMHCMSAblCGCIbQG4';
|
|
18
|
+
const FIREBASE_AUTH_DOMAIN = process.env.FIREBASE_AUTH_DOMAIN || 'charm-f004f.firebaseapp.com';
|
|
19
|
+
const GOOGLE_CLIENT_ID = process.env.GOOGLE_CLIENT_ID || '763614479011-v2m44ees6jhjaprj5ndoa0up83gf1qah.apps.googleusercontent.com';
|
|
20
|
+
const GOOGLE_CLIENT_SECRET = process.env.GOOGLE_CLIENT_SECRET || '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';
|
|
16
21
|
|
|
17
22
|
const REDIRECT_URI = 'http://localhost:9876/callback';
|
|
18
23
|
const AUTH_PORT = 9876;
|
|
@@ -70,72 +75,64 @@ function openBrowser(targetUrl) {
|
|
|
70
75
|
}
|
|
71
76
|
}
|
|
72
77
|
|
|
73
|
-
// ───
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
scopes: 'profile,email',
|
|
84
|
-
v: '10',
|
|
85
|
-
});
|
|
86
|
-
return `${base}?${params.toString()}`;
|
|
78
|
+
// ─── Google OAuth URL ────────────────────────────────────────────────────────
|
|
79
|
+
function buildGoogleAuthUrl() {
|
|
80
|
+
const authUrl = new URL('https://accounts.google.com/o/oauth2/v2/auth');
|
|
81
|
+
authUrl.searchParams.set('client_id', GOOGLE_CLIENT_ID);
|
|
82
|
+
authUrl.searchParams.set('redirect_uri', REDIRECT_URI);
|
|
83
|
+
authUrl.searchParams.set('response_type', 'code');
|
|
84
|
+
authUrl.searchParams.set('scope', 'openid email profile');
|
|
85
|
+
authUrl.searchParams.set('access_type', 'offline');
|
|
86
|
+
authUrl.searchParams.set('prompt', 'select_account');
|
|
87
|
+
return authUrl.toString();
|
|
87
88
|
}
|
|
88
89
|
|
|
89
|
-
// ─── Exchange Firebase
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
`https://identitytoolkit.googleapis.com/v1/accounts:lookup?key=${FIREBASE_API_KEY}`,
|
|
99
|
-
{ idToken }
|
|
100
|
-
);
|
|
101
|
-
const user = res.data.users?.[0];
|
|
102
|
-
if (!user) throw new Error('User not found');
|
|
103
|
-
return {
|
|
104
|
-
name: user.displayName || user.email,
|
|
105
|
-
email: user.email,
|
|
106
|
-
photo: user.photoUrl || '',
|
|
107
|
-
idToken,
|
|
108
|
-
expiresAt: Date.now() + 3600 * 1000, // 1 hour
|
|
109
|
-
};
|
|
110
|
-
}
|
|
90
|
+
// ─── Exchange Google code to Firebase token ──────────────────────────────────
|
|
91
|
+
async function exchangeCodeForToken(code) {
|
|
92
|
+
const tokenRes = await axios.post('https://oauth2.googleapis.com/token', {
|
|
93
|
+
code,
|
|
94
|
+
client_id: GOOGLE_CLIENT_ID,
|
|
95
|
+
client_secret: GOOGLE_CLIENT_SECRET,
|
|
96
|
+
redirect_uri: REDIRECT_URI,
|
|
97
|
+
grant_type: 'authorization_code',
|
|
98
|
+
});
|
|
111
99
|
|
|
112
|
-
|
|
113
|
-
const code = queryParams.code;
|
|
114
|
-
if (!code) throw new Error('No token or code received from Firebase');
|
|
100
|
+
const { id_token } = tokenRes.data;
|
|
115
101
|
|
|
116
102
|
const firebaseRes = await axios.post(
|
|
117
103
|
`https://identitytoolkit.googleapis.com/v1/accounts:signInWithIdp?key=${FIREBASE_API_KEY}`,
|
|
118
104
|
{
|
|
119
|
-
postBody: `id_token=${
|
|
105
|
+
postBody: `id_token=${id_token}&providerId=google.com`,
|
|
120
106
|
requestUri: REDIRECT_URI,
|
|
121
107
|
returnIdpCredential: true,
|
|
122
108
|
returnSecureToken: true,
|
|
123
109
|
}
|
|
124
110
|
);
|
|
125
111
|
|
|
126
|
-
const { displayName, email, idToken
|
|
112
|
+
const { displayName, email, idToken, expiresIn, photoUrl } = firebaseRes.data;
|
|
127
113
|
return {
|
|
128
114
|
name: displayName,
|
|
129
115
|
email,
|
|
130
116
|
photo: photoUrl || '',
|
|
131
|
-
idToken
|
|
117
|
+
idToken,
|
|
132
118
|
expiresAt: Date.now() + parseInt(expiresIn) * 1000,
|
|
133
119
|
};
|
|
134
120
|
}
|
|
135
121
|
|
|
136
122
|
// ─── Login ────────────────────────────────────────────────────────────────────
|
|
137
123
|
async function login() {
|
|
138
|
-
|
|
124
|
+
if (!GOOGLE_CLIENT_ID || !GOOGLE_CLIENT_SECRET) {
|
|
125
|
+
console.log(
|
|
126
|
+
boxen(
|
|
127
|
+
chalk.red('✗ Google OAuth Client configuration missing!\n\n') +
|
|
128
|
+
chalk.white('Add GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET to .env'),
|
|
129
|
+
{ padding: 1, margin: { left: 2 }, borderStyle: 'round', borderColor: 'red' }
|
|
130
|
+
)
|
|
131
|
+
);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const authUrl = buildGoogleAuthUrl();
|
|
139
136
|
|
|
140
137
|
return new Promise((resolve, reject) => {
|
|
141
138
|
const server = http.createServer(async (req, res) => {
|
|
@@ -166,6 +163,7 @@ async function login() {
|
|
|
166
163
|
|
|
167
164
|
server.close();
|
|
168
165
|
|
|
166
|
+
const code = parsed.query.code;
|
|
169
167
|
const error = parsed.query.error;
|
|
170
168
|
if (error) {
|
|
171
169
|
console.log(chalk.red('\n ✗ Login cancelled.\n'));
|
|
@@ -175,7 +173,7 @@ async function login() {
|
|
|
175
173
|
|
|
176
174
|
try {
|
|
177
175
|
process.stdout.write(chalk.cyan('\n ⏳ Verifying with Firebase...\n'));
|
|
178
|
-
const userData = await
|
|
176
|
+
const userData = await exchangeCodeForToken(code);
|
|
179
177
|
saveToken(userData);
|
|
180
178
|
|
|
181
179
|
console.log(
|
package/cli.js
CHANGED
package/package.json
CHANGED