Autentificare
PayLinks folosește JWT bearer token-uri pentru autentificarea API.
- Pentru web: magic link sau Google OAuth.
- Pentru integrări/agenți AI: creezi chei API în Dashboard Profile, apoi le schimbi pentru JWT-uri short-lived.
Flux API Key (Recomandat pentru Integrări)
Acest flux este gândit pentru server-to-server și agenți AI.
0. (Opțional) Înregistrare programatică într-un singur request
Dacă dezvoltatorul nu are deja cont PayLinks:
curl -X POST https://api.paylinks.ro/api/v1/auth/api/signup \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","name":"Dev","keyName":"Primary integration"}'
Răspunsul include contul, prima cheie API și un JWT short-lived.
1. Creează o cheie API în Dashboard
Intră în Dashboard -> Profile -> API Access și creează o cheie.
Primești:
keyId(prefixplk_)keySecret(prefixpls_, afișat o singură dată)
2. Schimbă cheia API pentru JWT
curl -X POST https://api.paylinks.ro/api/v1/auth/api/token \
-H "Content-Type: application/json" \
-d '{"keyId":"plk_xxx","keySecret":"pls_xxx"}'
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"tokenType": "Bearer",
"expiresInSeconds": 3600,
"user": {
"id": "user_123",
"email": "[email protected]",
"role": "USER"
}
}
3. Folosește JWT-ul ca Bearer token
curl https://api.paylinks.ro/api/v1/paylinks \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "X-Currency: RON"
Fluxul Magic Link
1. Solicită un Magic Link
curl -X POST https://api.paylinks.ro/api/v1/auth/request \
-H "Content-Type: application/json" \
-d '{"email": "[email protected]"}'
{"ok": true}
2. Utilizatorul dă click pe linkul din email
Email-ul conține un link care trimite către endpoint-ul de verificare cu parametrul token în query string.
3. Verifică și obține JWT
curl "https://api.paylinks.ro/api/v1/auth/verify?token=MAGIC_TOKEN"
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"needsOnboarding": false
}
Fluxul Google OAuth
OAuth standard
- Redirecționează utilizatorul către:
GET /auth/google/start?redirectTo=https://yourapp.com/callback - Utilizatorul completează consimțământul Google
- Google redirecționează către
/auth/google/callbackcucodeșistate - API-ul returnează un JWT token
Google One Tap
curl -X POST https://api.paylinks.ro/api/v1/auth/google/onetap \
-H "Content-Type: application/json" \
-d '{"credential": "GOOGLE_ONE_TAP_JWT"}'
Utilizarea token-ului
Include JWT-ul în header-ul Authorization pentru toate endpoint-urile protejate:
curl https://api.paylinks.ro/api/v1/me \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Header-ul X-Currency
Setează contextul valutar cu header-ul X-Currency:
curl https://api.paylinks.ro/api/v1/paylinks \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Currency: EUR"
Valori suportate: RON (implicit), EUR, GBP.
Acest header influențează moneda folosită la crearea linkurilor de plată și modul în care sunt returnate valorile monetare.
Ciclul de viață al token-ului
| Proprietate | Valoare |
|---|---|
| Tip | JWT (JSON Web Token) |
| Expirare (magic link / Google) | 7 zile |
| Expirare (API key exchange) | 1 oră |
| Algoritm | HS256 |
| Revocare | Incrementează tokenVersion al utilizatorului pentru a invalida toate token-urile |
Token-urile sunt stateless. Nu există un flux de refresh token — solicită un nou magic link sau re-autentifică-te prin Google OAuth când token-ul expiră.
Răspunsuri de eroare
Token lipsă sau invalid:
{
"error": {
"message": "Unauthorized",
"code": "UNAUTHORIZED"
}
}
Status HTTP: 401
Întrebări frecvente
Cât durează token-urile JWT?
Token-urile JWT PayLinks din magic link / Google expiră după 7 zile. Token-urile JWT obținute din API key exchange expiră după 1 oră.
Când token-ul expiră:
- Flux web: solicită un nou magic link sau re-autentifică-te prin Google OAuth.
- Flux API: rulează din nou
POST /auth/api/tokencukeyId+keySecret.
Cum revoc un token?
Pentru a invalida toate token-urile unui utilizator, incrementează câmpul tokenVersion al utilizatorului. Aceasta revocă imediat fiecare JWT emis anterior pentru acel cont, forțând re-autentificarea.
Ce se întâmplă când token-ul meu expiră?
Cererile API cu un token expirat returnează un răspuns 401 Unauthorized cu codul de eroare UNAUTHORIZED. Aplicația ta ar trebui să capteze această eroare și să redirecționeze utilizatorul către re-autentificare prin magic link sau Google OAuth.