gablilli commited on
Commit
0c0701c
·
1 Parent(s): 66bef35

fix. minor tweak to endpoint

Browse files
Files changed (1) hide show
  1. server.js +126 -13
server.js CHANGED
@@ -344,28 +344,141 @@ async function hubscuolaInternalLogin({ username, password, platform }) {
344
  "Origin": appOrigin,
345
  "Referer": `${appOrigin}/`,
346
  "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0",
 
 
 
 
 
 
 
347
  };
348
 
349
- const accessPayload = {
350
- host: `${normalizedPlatform}.hubscuola.it`,
351
- loginToken,
352
- hubEncryptedUser,
353
- sessionId: loginSessionId,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
354
  };
355
 
356
- const internalRes = await fetch("https://ms-api.hubscuola.it/internalLogin", {
357
- method: "POST",
358
- headers: internalHeaders,
359
- body: JSON.stringify(accessPayload),
360
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
361
 
362
- const internalJson = await readJsonLoose(internalRes);
363
 
364
  if (!internalRes.ok) {
365
- throw new Error(internalJson?.message || internalJson?.error || `internalLogin failed (${internalRes.status})`);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
366
  }
367
 
368
- const tokenId = internalJson?.tokenId;
369
  if (!tokenId) {
370
  throw new Error("tokenId non presente nella risposta internalLogin");
371
  }
 
344
  "Origin": appOrigin,
345
  "Referer": `${appOrigin}/`,
346
  "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0",
347
+ "Accept-Language": "it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7",
348
+ "Sec-GPC": "1",
349
+ "Sec-Fetch-Dest": "empty",
350
+ "Sec-Fetch-Mode": "cors",
351
+ "Sec-Fetch-Site": "same-site",
352
+ "Connection": "keep-alive",
353
+ "TE": "trailers",
354
  };
355
 
356
+ function decodeJwtPayload(token) {
357
+ try {
358
+ const part = token.split(".")[1];
359
+ if (!part) return {};
360
+ const normalized = part.replace(/-/g, "+").replace(/_/g, "/");
361
+ const padded = normalized + "=".repeat((4 - (normalized.length % 4)) % 4);
362
+ return JSON.parse(Buffer.from(padded, "base64").toString("utf8"));
363
+ } catch {
364
+ return {};
365
+ }
366
+ }
367
+
368
+ const decodedUser = hubEncryptedUser ? decodeJwtPayload(hubEncryptedUser) : {};
369
+ const decodedLoginToken = decodeJwtPayload(loginToken);
370
+
371
+ const resolvedUsername =
372
+ decodedLoginToken?.username
373
+ || decodedUser?.username
374
+ || username;
375
+
376
+ const resolvedSessionId =
377
+ loginSessionId
378
+ || decodedLoginToken?.sessionId
379
+ || "";
380
+
381
+ if (!resolvedSessionId) {
382
+ throw new Error("sessionId non presente nella risposta hubLoginJsonp");
383
+ }
384
+
385
+ const resolvedEmail =
386
+ decodedLoginToken?.email
387
+ || decodedUser?.email
388
+ || username;
389
+
390
+ const resolvedFirstName =
391
+ decodedLoginToken?.nome
392
+ || decodedUser?.firstName
393
+ || decodedUser?.name
394
+ || "";
395
+
396
+ const resolvedLastName =
397
+ decodedLoginToken?.cognome
398
+ || decodedUser?.lastName
399
+ || decodedUser?.surname
400
+ || "";
401
+
402
+ const resolvedType =
403
+ decodedLoginToken?.tipoUtente
404
+ || decodedUser?.type
405
+ || "studente";
406
+
407
+ const resolvedUserId =
408
+ String(decodedLoginToken?.idUtente || decodedUser?.id || decodedUser?.userId || "");
409
+
410
+ const internalPayloadPrimary = {
411
+ jwt: hubEncryptedUser,
412
+ sessionId: resolvedSessionId,
413
+ userData: decodedUser,
414
+ app: {
415
+ name: normalizedPlatform === "kids" ? "HUB Kids" : "HUB Young",
416
+ type: normalizedPlatform,
417
+ version: "7.6",
418
+ },
419
+ browser: {
420
+ major: "148",
421
+ name: "Firefox",
422
+ version: "148.0",
423
+ platform: "web",
424
+ },
425
+ so: {
426
+ name: "Mac OS",
427
+ version: "10.15",
428
+ },
429
+ userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0",
430
+ username: resolvedUsername,
431
  };
432
 
433
+ const internalPayloadLegacy = {
434
+ username: resolvedUsername,
435
+ email: resolvedEmail,
436
+ type: resolvedType,
437
+ firstName: resolvedFirstName,
438
+ lastName: resolvedLastName,
439
+ tokenId: loginToken,
440
+ appData: {
441
+ name: normalizedPlatform === "kids" ? "Hub Kids" : "Hub Young",
442
+ id: normalizedPlatform,
443
+ version: "7.6",
444
+ },
445
+ id: resolvedUserId,
446
+ role: decodedUser?.role || "user",
447
+ };
448
+
449
+ async function doInternalLogin(payload) {
450
+ const res = await fetch("https://ms-api.hubscuola.it/user/internalLogin", {
451
+ method: "POST",
452
+ headers: internalHeaders,
453
+ body: JSON.stringify(payload),
454
+ });
455
+ const json = await readJsonLoose(res);
456
+ return { res, json };
457
+ }
458
 
459
+ let { res: internalRes, json: internalJson } = await doInternalLogin(internalPayloadPrimary);
460
 
461
  if (!internalRes.ok) {
462
+ ({ res: internalRes, json: internalJson } = await doInternalLogin(internalPayloadLegacy));
463
+ }
464
+
465
+ if (!internalRes.ok) {
466
+ const msg = internalJson?.message || internalJson?.error || internalJson?.response || `internalLogin failed (${internalRes.status})`;
467
+ console.error("[internalLogin] errore", {
468
+ status: internalRes.status,
469
+ statusText: internalRes.statusText,
470
+ platform: normalizedPlatform,
471
+ username,
472
+ resolvedUsername,
473
+ resolvedSessionIdPreview: resolvedSessionId ? `${resolvedSessionId.slice(0, 12)}...` : "",
474
+ jwtPreview: loginToken ? `${loginToken.slice(0, 16)}...` : "",
475
+ loginSessionIdPreview: loginSessionId ? `${String(loginSessionId).slice(0, 12)}...` : "",
476
+ sentPayload: JSON.stringify(internalPayloadPrimary),
477
+ });
478
+ throw new Error(msg);
479
  }
480
 
481
+ const tokenId = internalJson?.tokenId || internalJson?.data?.tokenId || internalJson?.session?.tokenId || internalJson?.response?.tokenId;
482
  if (!tokenId) {
483
  throw new Error("tokenId non presente nella risposta internalLogin");
484
  }