@mojaksebastian/allegro-client 1.0.1
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.
Potentially problematic release.
This version of @mojaksebastian/allegro-client might be problematic. Click here for more details.
- package/README.md +1 -0
- package/dist/auth/helpers/TokenStorage.d.ts +12 -0
- package/dist/auth/helpers/TokenStorage.d.ts.map +1 -0
- package/dist/auth/helpers/TokenStorage.js +43 -0
- package/dist/auth/helpers/TokenStorage.js.map +1 -0
- package/dist/auth/helpers/refreshTokens.d.ts +3 -0
- package/dist/auth/helpers/refreshTokens.d.ts.map +1 -0
- package/dist/auth/helpers/refreshTokens.js +27 -0
- package/dist/auth/helpers/refreshTokens.js.map +1 -0
- package/dist/auth/index.d.ts +13 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +51 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/strategies/DeviceFlow.d.ts +5 -0
- package/dist/auth/strategies/DeviceFlow.d.ts.map +1 -0
- package/dist/auth/strategies/DeviceFlow.js +72 -0
- package/dist/auth/strategies/DeviceFlow.js.map +1 -0
- package/dist/client/index.d.ts +11 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +34 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/modules.d.ts +2 -0
- package/dist/client/modules.d.ts.map +1 -0
- package/dist/client/modules.js +4 -0
- package/dist/client/modules.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
test
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ITokenStorage, IAllegroTokens } from "../types.js";
|
|
2
|
+
import { TEnv } from "../../client/types.js";
|
|
3
|
+
export declare class FileTokenStorage implements ITokenStorage {
|
|
4
|
+
private readonly fileName;
|
|
5
|
+
private readonly devFileName;
|
|
6
|
+
private readonly filePath;
|
|
7
|
+
constructor(env: TEnv, customPath?: string);
|
|
8
|
+
save(tokens: IAllegroTokens): Promise<void>;
|
|
9
|
+
read(): Promise<IAllegroTokens | null>;
|
|
10
|
+
clear(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=TokenStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenStorage.d.ts","sourceRoot":"","sources":["../../../src/auth/helpers/TokenStorage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAE7C,qBAAa,gBAAiB,YAAW,aAAa;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM;IAWpC,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C,IAAI,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAUtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { writeFile, readFile, unlink } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export class FileTokenStorage {
|
|
4
|
+
fileName = ".allegro_sessionon";
|
|
5
|
+
devFileName = ".allegro_sessionon_dev";
|
|
6
|
+
filePath;
|
|
7
|
+
constructor(env, customPath) {
|
|
8
|
+
// Domyślnie zapisujemy w folderze głównym projektu
|
|
9
|
+
this.filePath = customPath
|
|
10
|
+
? join(customPath, env === "sandbox" ? this.devFileName : this.fileName)
|
|
11
|
+
: join(process.cwd(), env === "sandbox" ? this.devFileName : this.fileName);
|
|
12
|
+
console.log(`env: ${env}, filepath: ${this.filePath}`);
|
|
13
|
+
}
|
|
14
|
+
async save(tokens) {
|
|
15
|
+
try {
|
|
16
|
+
const data = JSON.stringify(tokens, null, 2);
|
|
17
|
+
console.log(data);
|
|
18
|
+
await writeFile(this.filePath, data, "utf-8");
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
throw new Error(`Nie udało się zapisać tokenów: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async read() {
|
|
25
|
+
try {
|
|
26
|
+
const data = await readFile(this.filePath, "utf-8");
|
|
27
|
+
return JSON.parse(data);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
// Jeśli plik nie istnieje, po prostu zwracamy null
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async clear() {
|
|
35
|
+
try {
|
|
36
|
+
await unlink(this.filePath);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// Ignorujemy błąd, jeśli plik już nie istnieje
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=TokenStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenStorage.js","sourceRoot":"","sources":["../../../src/auth/helpers/TokenStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,OAAO,gBAAgB;IACV,QAAQ,GAAG,oBAAoB,CAAC;IAChC,WAAW,GAAG,wBAAwB,CAAC;IACvC,QAAQ,CAAS;IAElC,YAAY,GAAS,EAAE,UAAmB;QACxC,mDAAmD;QACnD,IAAI,CAAC,QAAQ,GAAG,UAAU;YACxB,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;YACxE,CAAC,CAAC,IAAI,CACF,OAAO,CAAC,GAAG,EAAE,EACb,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CACrD,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAsB;QAC/B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAC7F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mDAAmD;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+CAA+C;QACjD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refreshTokens.d.ts","sourceRoot":"","sources":["../../../src/auth/helpers/refreshTokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,OAAO,GAClB,UAAU,GAAG,EACb,aAAa,gBAAgB,EAC7B,cAAc,MAAM,KACnB,OAAO,CAAC,cAAc,CA+BxB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const refresh = async (tokenUrl, credentials, refreshToken) => {
|
|
2
|
+
const { clientId, clientSecret } = credentials;
|
|
3
|
+
const basicAuth = Buffer.from(`${clientId}:${clientSecret}`).toString("base64");
|
|
4
|
+
console.log(`[DeviceFlow] Refreshing access token...`);
|
|
5
|
+
const response = await fetch(`${tokenUrl}`, {
|
|
6
|
+
method: "POST",
|
|
7
|
+
headers: {
|
|
8
|
+
Authorization: `Basic ${basicAuth}`,
|
|
9
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
10
|
+
},
|
|
11
|
+
body: new URLSearchParams({
|
|
12
|
+
grant_type: "refresh_token",
|
|
13
|
+
refresh_token: refreshToken,
|
|
14
|
+
}),
|
|
15
|
+
});
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
throw new Error(`Błąd odświeżania tokena: ${await response.text()}`);
|
|
18
|
+
}
|
|
19
|
+
console.log(`Access token successfully refreshed!`);
|
|
20
|
+
const data = await response.json();
|
|
21
|
+
return {
|
|
22
|
+
accessToken: data.access_token,
|
|
23
|
+
refreshToken: data.refresh_token,
|
|
24
|
+
expiresAt: Date.now() + data.expires_in * 1000,
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=refreshTokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refreshTokens.js","sourceRoot":"","sources":["../../../src/auth/helpers/refreshTokens.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,QAAa,EACb,WAA6B,EAC7B,YAAoB,EACK,EAAE;IAC3B,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC;IAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,YAAY,EAAE,CAAC,CAAC,QAAQ,CACnE,QAAQ,CACT,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAQ,MAAM,KAAK,CAAC,GAAG,QAAQ,EAAE,EAAE;QAC/C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,SAAS,SAAS,EAAE;YACnC,cAAc,EAAE,mCAAmC;SACpD;QACD,IAAI,EAAE,IAAI,eAAe,CAAC;YACxB,UAAU,EAAE,eAAe;YAC3B,aAAa,EAAE,YAAY;SAC5B,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,MAAM,IAAI,GAA2B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE3D,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,YAAY;QAC9B,YAAY,EAAE,IAAI,CAAC,aAAa;QAChC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI;KAC/C,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IAuthStrategy, ITokenStorage, IAuthCredentials, IAuthConfig } from "./types.js";
|
|
2
|
+
export declare class AllegroAuth implements IAuthConfig {
|
|
3
|
+
private baseUrl;
|
|
4
|
+
private strategy;
|
|
5
|
+
private storage;
|
|
6
|
+
private credentials;
|
|
7
|
+
private readonly tokenUrl;
|
|
8
|
+
private readonly authUrl;
|
|
9
|
+
constructor(baseUrl: URL, strategy: IAuthStrategy, storage: ITokenStorage, credentials: IAuthCredentials);
|
|
10
|
+
getToken(): Promise<string>;
|
|
11
|
+
clearToken(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,WAAW,EACZ,MAAM,YAAY,CAAC;AAGpB,qBAAa,WAAY,YAAW,WAAW;IAK3C,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;IAPrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAM;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAM;gBAGpB,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,gBAAgB;IAMjC,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IA0C3B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { refresh } from "./helpers/refreshTokens.js";
|
|
2
|
+
export class AllegroAuth {
|
|
3
|
+
baseUrl;
|
|
4
|
+
strategy;
|
|
5
|
+
storage;
|
|
6
|
+
credentials;
|
|
7
|
+
tokenUrl;
|
|
8
|
+
authUrl;
|
|
9
|
+
constructor(baseUrl, strategy, storage, credentials) {
|
|
10
|
+
this.baseUrl = baseUrl;
|
|
11
|
+
this.strategy = strategy;
|
|
12
|
+
this.storage = storage;
|
|
13
|
+
this.credentials = credentials;
|
|
14
|
+
this.authUrl = new URL(`${this.baseUrl}auth/oauth`);
|
|
15
|
+
this.tokenUrl = new URL(`${this.baseUrl}auth/oauth/token`);
|
|
16
|
+
}
|
|
17
|
+
async getToken() {
|
|
18
|
+
let tokens = await this.storage.read();
|
|
19
|
+
// Brak jakichkolwiek tokenów
|
|
20
|
+
if (!tokens) {
|
|
21
|
+
console.log("[Auth] Brak tokenów w magazynie. Inicjuję pełną autoryzację...");
|
|
22
|
+
tokens = await this.strategy.authorize(this.authUrl, this.credentials);
|
|
23
|
+
await this.storage.save(tokens);
|
|
24
|
+
return tokens.accessToken;
|
|
25
|
+
}
|
|
26
|
+
// Sprawdzenie ważności
|
|
27
|
+
// Jeśli obecny czas + 5 min jest większy niż czas wygaśnięcia, odświeżanie
|
|
28
|
+
const safetyMargin = 5 * 60 * 1000;
|
|
29
|
+
const isExpired = Date.now() + safetyMargin >= tokens.expiresAt;
|
|
30
|
+
if (isExpired) {
|
|
31
|
+
console.log("[Auth] Token wygasł lub zaraz wygaśnie. Odświeżam...");
|
|
32
|
+
try {
|
|
33
|
+
const newTokens = await refresh(this.tokenUrl, this.credentials, tokens.refreshToken);
|
|
34
|
+
await this.storage.save(newTokens);
|
|
35
|
+
return newTokens.accessToken;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error("[Auth] Odświeżanie nieudane:", error);
|
|
39
|
+
// Jeśli refresh token wygasł (np. po 3 miesiącach), ponowna autoryzacja
|
|
40
|
+
await this.clearToken();
|
|
41
|
+
throw new Error("Sesja wygasła. Wymagana ponowna autoryzacja użytkownika.");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Token jest nadal ważny
|
|
45
|
+
return tokens.accessToken;
|
|
46
|
+
}
|
|
47
|
+
async clearToken() {
|
|
48
|
+
await this.storage.clear();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD,MAAM,OAAO,WAAW;IAKZ;IACA;IACA;IACA;IAPO,QAAQ,CAAM;IACd,OAAO,CAAM;IAE9B,YACU,OAAY,EACZ,QAAuB,EACvB,OAAsB,EACtB,WAA6B;QAH7B,YAAO,GAAP,OAAO,CAAK;QACZ,aAAQ,GAAR,QAAQ,CAAe;QACvB,YAAO,GAAP,OAAO,CAAe;QACtB,gBAAW,GAAX,WAAW,CAAkB;QAErC,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,kBAAkB,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEvC,6BAA6B;QAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CACT,gEAAgE,CACjE,CAAC;YACF,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACvE,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,OAAO,MAAM,CAAC,WAAW,CAAC;QAC5B,CAAC;QAED,uBAAuB;QACvB,2EAA2E;QAC3E,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,IAAI,MAAM,CAAC,SAAS,CAAC;QAEhE,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACpE,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAC7B,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,WAAW,EAChB,MAAM,CAAC,YAAY,CACpB,CAAC;gBACF,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACnC,OAAO,SAAS,CAAC,WAAW,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;gBACrD,wEAAwE;gBACxE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,OAAO,MAAM,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceFlow.d.ts","sourceRoot":"","sources":["../../../src/auth/strategies/DeviceFlow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,EAGjB,MAAM,aAAa,CAAC;AAErB,qBAAa,UAAW,YAAW,aAAa;IACxC,SAAS,CACb,OAAO,EAAE,GAAG,EACZ,WAAW,EAAE,gBAAgB,GAC5B,OAAO,CAAC,cAAc,CAAC;CAyF3B"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export class DeviceFlow {
|
|
2
|
+
async authorize(authUrl, credentials) {
|
|
3
|
+
const { clientId, clientSecret } = credentials;
|
|
4
|
+
const basicAuth = Buffer.from(`${clientId}:${clientSecret}`).toString("base64");
|
|
5
|
+
// KROK 1: Pobranie device_code
|
|
6
|
+
console.log(`[DeviceFlow] Requesting device code from ${authUrl}/device`);
|
|
7
|
+
const deviceResponse = await fetch(`${authUrl}/device?client_id=${clientId}`, {
|
|
8
|
+
method: "POST",
|
|
9
|
+
headers: {
|
|
10
|
+
Authorization: `Basic ${basicAuth}`,
|
|
11
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
if (!deviceResponse.ok) {
|
|
15
|
+
throw new Error(`Device Flow error: ${await deviceResponse.text()}`);
|
|
16
|
+
}
|
|
17
|
+
const deviceData = (await deviceResponse.json());
|
|
18
|
+
console.log(`[DeviceFlow] Successfully retrieved device code. Interval: ${deviceData.interval}s`);
|
|
19
|
+
console.log("\n--- AUTORYZACJA ALLEGRO ---");
|
|
20
|
+
console.log(`Zaloguj się pod adresem: ${deviceData.verification_uri_complete}`);
|
|
21
|
+
console.log(`Lub wejdź na: ${deviceData.verification_uri} i wpisz kod: ${deviceData.user_code}`);
|
|
22
|
+
console.log("---------------------------\n");
|
|
23
|
+
// KROK 2: Polling (odpytywanie o token)
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const intervalMs = deviceData.interval * 1000;
|
|
26
|
+
console.log(`[DeviceFlow] Starting polling for token every ${deviceData.interval}s...`);
|
|
27
|
+
const poll = setInterval(async () => {
|
|
28
|
+
try {
|
|
29
|
+
const tokenResponse = await fetch(`${authUrl}/token`, {
|
|
30
|
+
method: "POST",
|
|
31
|
+
headers: {
|
|
32
|
+
Authorization: `Basic ${basicAuth}`,
|
|
33
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
34
|
+
},
|
|
35
|
+
body: new URLSearchParams({
|
|
36
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
37
|
+
device_code: deviceData.device_code,
|
|
38
|
+
}),
|
|
39
|
+
});
|
|
40
|
+
const data = (await tokenResponse.json());
|
|
41
|
+
if (tokenResponse.ok) {
|
|
42
|
+
console.log(`[DeviceFlow] Access token successfully acquired!`);
|
|
43
|
+
clearInterval(poll);
|
|
44
|
+
resolve({
|
|
45
|
+
accessToken: data.access_token,
|
|
46
|
+
refreshToken: data.refresh_token,
|
|
47
|
+
expiresAt: Date.now() + data.expires_in * 1000,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.log(`[DeviceFlow] Polling status: ${data.error}`);
|
|
52
|
+
if (data.error === "access_denied") {
|
|
53
|
+
clearInterval(poll);
|
|
54
|
+
reject(new Error("Użytkownik odmówił dostępu."));
|
|
55
|
+
}
|
|
56
|
+
else if (data.error === "Invalid device code") {
|
|
57
|
+
clearInterval(poll);
|
|
58
|
+
reject(new Error("Niepoprawny, wygasły lub zużyty device_code."));
|
|
59
|
+
}
|
|
60
|
+
// Inne błędy (np. authorization_pending) ignorujemy i czekamy dalej
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
console.error(`[DeviceFlow] Polling error:`, err);
|
|
65
|
+
clearInterval(poll);
|
|
66
|
+
reject(err);
|
|
67
|
+
}
|
|
68
|
+
}, intervalMs);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=DeviceFlow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceFlow.js","sourceRoot":"","sources":["../../../src/auth/strategies/DeviceFlow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IAllegroClientConfig } from "./types.js";
|
|
2
|
+
export declare class AllegroClient {
|
|
3
|
+
private auth;
|
|
4
|
+
constructor(config: IAllegroClientConfig);
|
|
5
|
+
/**
|
|
6
|
+
* Metoda pomocnicza do ręcznego wywołania autoryzacji
|
|
7
|
+
* lub po prostu pobrania aktualnego tokena.
|
|
8
|
+
*/
|
|
9
|
+
getAccessToken(): Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAKlD,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAc;gBAEd,MAAM,EAAE,oBAAoB;IAgCxC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;CAGxC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AllegroAuth } from "../auth/index.js";
|
|
2
|
+
import { DeviceFlow } from "../auth/strategies/DeviceFlow.js";
|
|
3
|
+
import { FileTokenStorage } from "../auth/helpers/TokenStorage.js";
|
|
4
|
+
const baseUrl = new URL("https://allegro.pl");
|
|
5
|
+
const devBaseUrl = new URL("https://allegro.pl.allegrosandbox.pl");
|
|
6
|
+
export class AllegroClient {
|
|
7
|
+
auth;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
console.log("Inicjalizacja AllegroClient...");
|
|
10
|
+
const { env = "production", // Domyślnie production, jeśli nie podano
|
|
11
|
+
credentials, strategy, storage, } = config;
|
|
12
|
+
const authBaseUrl = env === "sandbox" ? devBaseUrl : baseUrl;
|
|
13
|
+
// Inicjalizacja Storage (wbudowany/użytkownika)
|
|
14
|
+
const tokenStorage = storage ?? new FileTokenStorage(env);
|
|
15
|
+
// Wybór strategii
|
|
16
|
+
console.log("Strategia autoryzacji: " + strategy);
|
|
17
|
+
let strategyInstance;
|
|
18
|
+
switch (strategy) {
|
|
19
|
+
case "DeviceFlow":
|
|
20
|
+
console.log("Wybrano strategię DeviceFlow");
|
|
21
|
+
strategyInstance = new DeviceFlow();
|
|
22
|
+
}
|
|
23
|
+
// Zarządca autoryzacji
|
|
24
|
+
this.auth = new AllegroAuth(authBaseUrl, strategyInstance, tokenStorage, credentials);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Metoda pomocnicza do ręcznego wywołania autoryzacji
|
|
28
|
+
* lub po prostu pobrania aktualnego tokena.
|
|
29
|
+
*/
|
|
30
|
+
async getAccessToken() {
|
|
31
|
+
return await this.auth.getToken();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGnE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,sCAAsC,CAAC,CAAC;AAEnE,MAAM,OAAO,aAAa;IAChB,IAAI,CAAc;IAE1B,YAAY,MAA4B;QACtC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,MAAM,EACJ,GAAG,GAAG,YAAY,EAAE,yCAAyC;QAC7D,WAAW,EACX,QAAQ,EACR,OAAO,GACR,GAAG,MAAM,CAAC;QACX,MAAM,WAAW,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;QAE7D,gDAAgD;QAChD,MAAM,YAAY,GAAG,OAAO,IAAI,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAE1D,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,QAAQ,CAAC,CAAC;QAElD,IAAI,gBAAgB,CAAC;QACrB,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,YAAY;gBACf,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC5C,gBAAgB,GAAG,IAAI,UAAU,EAAE,CAAC;QACxC,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CACzB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,WAAW,CACZ,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc;QAClB,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modules.d.ts","sourceRoot":"","sources":["../../src/client/modules.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modules.js","sourceRoot":"","sources":["../../src/client/modules.ts"],"names":[],"mappings":";AAAA,qDAAqD;AACrD,oDAAoD"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAElC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAElC,eAAe,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAElC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAElC,eAAe,aAAa,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mojaksebastian/allegro-client",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Allegro REST API Client with automatic token refresh. Fetches tokens from allegro and serves them to the user. Supports both the production and sandbox enviroments",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"type": "module",
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "rm -rf dist && tsc",
|
|
19
|
+
"test": "node dist/test.js",
|
|
20
|
+
"start": "node dist/server.js",
|
|
21
|
+
"dev": "node --loader ts-node/esm src/server.ts",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"allegro",
|
|
26
|
+
"api",
|
|
27
|
+
"oauth2"
|
|
28
|
+
],
|
|
29
|
+
"author": "mojaksebastian",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^20.11.0",
|
|
33
|
+
"ts-node": "^10.9.2",
|
|
34
|
+
"typescript": "^5.4.0"
|
|
35
|
+
}
|
|
36
|
+
}
|