API αυθεντικοποιησης με JWT (access/refresh), HMAC request validation και admin endpoints.
Πλεον τα tokens συνδεονται και με:
user_id(reference σεuserscollection)client_ref(reference σεagents/clientscollection)
- Node.js
- Express
- MongoDB + Mongoose
- JSON Web Token
- Jest
- Εγκατασταση dependencies:
npm install- Συμπληρωσε το
.env(δες.env.example). - Προαιρετικα seed για default agent:
npm run seed:agent- Εκκινηση:
npm start- Προαιρετικος γρηγορος ελεγχος end-to-end:
npm run smoke:authPORT=80MONGO_URI=...JWT_SECRET=...LOGIN_URL=http://localhost/auth/loginSEED_CLIENT_ID=clnt0001SEED_CLIENT_SECRET=clientsecret0001ADMIN_USER=adminADMIN_PASS=admin123SMOKE_BASE_URL=http://localhost:80SMOKE_AUD=device-smokeSMOKE_USER=user01
{
"code": "S...",
"...data": "...",
"message": "..."
}{
"errors": [
{
"code": "E...",
"message": "..."
}
]
}Headers:
client_id
Query:
audhash = HMAC_SHA256("{client_id}:{aud}", client_secret)lang=EL|EN(optional)
Success:
{
"code": "S200001",
"auth_code": "...",
"url": "...",
"message": "..."
}Headers:
client_id
Query:
hash = HMAC_SHA256("{client_id}:{code}:{user}", client_secret)lang=EL|EN(optional)
Body:
{
"code": "...",
"user": "..."
}Headers:
client_id
Query:
hash = HMAC_SHA256("{client_id}:{user}:{aud}", client_secret)lang=EL|EN(optional)
Προυποθεσεις:
- Ο χρηστης πρεπει να υπαρχει στη βαση
- Ο χρηστης πρεπει να εχει καταχωρημενο
mobile
Body:
{
"user": "...",
"aud": "..."
}Headers:
client_id
Query:
hash = HMAC_SHA256("{client_id}:{code_or_pin}", client_secret)lang=EL|EN(optional)
Body:
{
"grant": "code | sms",
"code": "...",
"pin": "..."
}Επιπλεον ελεγχοι εγκυροτητας:
hash: 64-ψηφιο hexgrant=code:code32-ψηφιο hexgrant=sms:pinακριβως 6 ψηφια
Success:
{
"code": "S200004",
"access": "...",
"refresh": "...",
"message": "..."
}Body:
{
"token": "{refresh_token}"
}Success:
{
"code": "S200004",
"access": "...",
"refresh": "...",
"message": "..."
}Σημειωση:
- Το refresh flow κανει rotation. Καθε επιτυχημενο refresh επιστρεφει και νεο
refreshtoken.
Ολα τα /admin/* endpoints απαιτουν:
Authorization: Basic base64(ADMIN_USER:ADMIN_PASS)
GET /admin/codesPUT /admin/codes/:idDELETE /admin/codes/:id
GET /admin/tokensPUT /admin/tokens/:idPATCH /admin/tokens/:id/revokeDELETE /admin/tokens/:id
GET /admin/usersPOST /admin/usersPOST /admin/users/:id/logout?aud={device_aud}POST /admin/users/:id/logout-all-devicesPUT /admin/users/:idDELETE /admin/users/:id
Ενδεικτικο body για create/update user:
{
"username": "user01",
"mobile": "6900000000",
"is_active": true
}Στο admin τα clients αντιστοιχουν στο μοντελο Agent.
GET /admin/clientsPOST /admin/clientsPUT /admin/clients/:idDELETE /admin/clients/:id
Ενδεικτικο body για create/update client:
{
"name": "Default Agent",
"client_id": "clnt0002",
"client_secret": "clientsecret0002",
"scopes": "invoice/read invoice/write",
"code_exp": 300,
"pin_exp": 300,
"access_exp": 900,
"refresh_exp": 604800
}Σημειωση:
- Revoked tokens (
revoked=true) δεν γινονται δεκτα απο auth middleware και refresh.
Στα GET /admin/codes, GET /admin/tokens, GET /admin/users, GET /admin/clients υποστηριζονται:
page(default1)limit(default20, max200)sort_by(ανα endpoint επιτρεπτα πεδια)order=asc|desc(defaultdesc)
Παραδειγμα:
GET /admin/tokens?page=2&limit=25&sort_by=iat&order=descΟι απαντησεις list περιεχουν και meta:
page,limit,total,pages,sort_by,order
- Users:
username: 3-50 χαρακτηρες (a-z,A-Z,0-9,.,_,-)mobile: 10-15 ψηφια (αν δοθει)is_active: boolean (αν δοθει)
- Clients:
client_id: 8 αλφαριθμητικοι χαρακτηρεςclient_secret: 16 χαρακτηρεςcode_exp,pin_exp,access_exp,refresh_exp: θετικοι ακεραιοι
Καθε refresh token μπορει να χρησιμοποιηθει ΜΟΝΟ μια φορα. Απο τη refresh αιτηση:
- Ζητημα νεου refresh token (rotated)
- Παλιο refresh ανακαλειται (revoked=true)
- Επιστροφη νεου access + νεου refresh
POST /auth/token/refresh
Response: {
"code": "S200004",
"access": "{new_access_token}",
"refresh": "{new_refresh_token}"
}Ολα τα refresh tokens απο αυτη τη login εχουν ιδιο family_id. Αν ενας refresh χρησιμοποιηθει 2+ φορες εντος 5 δευτερολεπτων:
- Ολη η οικογενεια ανακαλειται (concurrent reuse = compromise)
- Return 401 E401012 token_compromised_reuse_detected
Καθε token συνδεεται με συσκευη (aud). Αν refresh απο διαφορετικη συσκευη:
- Return 401 E401013 device_mismatch_token_revoked
- Προστατευει απο lateral movement
Refresh tokens: SHA-256(token) στη DB, όχι raw Access tokens: metadata only (jti, exp, user, aud, scopes)
- E401010: Token not found or revoked
- E401012: Concurrent reuse detected (family revoked)
- E401013: Device mismatch (AUD binding failed)
- E401014: Token already used previously
npm testWatch mode:
npm run test:watchΥπαρχουν ετοιμα αρχεια:
postman/jwt-auth.postman_collection.jsonpostman/jwt-auth.postman_environment.json
Η collection περιλαμβανει auth flow, error case και admin requests για codes/tokens/users/clients.