API-ul Auth (OIDC)
Suprafața publică pentru integratori a auth.codai.ro: discovery, authorization code + PKCE, device flow, tokenuri, logout și /connect/key.
auth.codai.ro e un OpenID Provider standard; citește mai întâi /.well-known/openid-configuration și lasă biblioteca ta OIDC să conducă restul. Singurul endpoint specific codai e GET /connect/key: schimbi access token-ul pe o cheie de inferență cu scope-uri (base_url: https://ai.codai.ro/v1). Sunt listate doar endpoint-urile pe care le apelează un integrator — UI-ul de login/consimțământ, API-ul de cont și rutele aplicației native sunt interne first-party. Erorile OIDC sunt { "error", "error_description" }. Fluxul pas cu pas: fluxul connect, scope-uri: scope-uri.
Metadatele provider-ului.
application/json- response
Subsetul documentului de discovery pe care se bazează integratorii; documentul live conține mai multe chei.
issuer*stringuriauthorization_endpoint*stringuritoken_endpoint*stringuriuserinfo_endpoint?stringurijwks_uri*stringuriintrospection_endpoint?stringurirevocation_endpoint?stringuridevice_authorization_endpoint?stringuriend_session_endpoint?stringuriregistration_endpoint?stringÎnregistrare dinamică de clienți pentru clienții MCP publici (nedocumentată aici).
uriresponse_types_supported*array<string>grant_types_supported?array<string>token_endpoint_auth_methods_supported?array<string>scopes_supported?array<string>claims_supported?array<string>code_challenge_methods_supported?array<string>acr_values_supported?array<string>subject_types_supported*array<string>id_token_signing_alg_values_supported*array<string>backchannel_logout_supported?booleancurl -X GET 'https://auth.codai.ro/.well-known/openid-configuration'{ "issuer": "https://auth.codai.ro", "authorization_endpoint": "http://example.com", "token_endpoint": "http://example.com", "userinfo_endpoint": "http://example.com", "jwks_uri": "http://example.com", "introspection_endpoint": "http://example.com", "revocation_endpoint": "http://example.com", "device_authorization_endpoint": "http://example.com", "end_session_endpoint": "http://example.com", "registration_endpoint": "http://example.com", "response_types_supported": [ "string" ], "grant_types_supported": [ "string" ], "token_endpoint_auth_methods_supported": [ "string" ], "scopes_supported": [ "string" ], "claims_supported": [ "string" ], "code_challenge_methods_supported": [ "S256" ], "acr_values_supported": [ "string" ], "subject_types_supported": [ "string" ], "id_token_signing_alg_values_supported": [ "string" ], "backchannel_logout_supported": true}JSON Web Key Set.
application/json- response
keys*array<>curl -X GET 'https://auth.codai.ro/jwks'{ "keys": [ { "kty": "RSA", "kid": "string", "use": "sig", "alg": "RS256", "n": "string", "e": "string" } ]}response_type*"code"Trebuie să fie code.
"code"client_id*stringIdentificatorul clientului înregistrat.
redirect_uri*stringUnul dintre redirect URI-urile înregistrate ale clientului (potrivire exactă).
uriscope*stringScope-uri separate prin spațiu; trebuie să includă openid.
state?stringValoare CSRF opacă, întoarsă la redirect. Puternic recomandată.
code_challenge*stringBASE64URL(SHA-256(code_verifier)) — PKCE este obligatoriu pentru fiecare client.
code_challenge_method*"S256"Doar S256 este suportat.
"S256"nonce?stringProtecție anti-replay, copiată în ID token.
prompt?stringValorile standard OIDC pentru prompt (login, consent, none, select_account).
acr_values?stringContextul de autentificare cerut; passkey/mfa declanșează step-up.
resource?stringIndicator de resursă RFC 8707. https://ai.codai.ro/mcp produce un access token JWT cu scope-ul mcp.
urimode?"signup"Extensie codai — signup deschide direct formularul de înregistrare.
"signup"ref?stringExtensie codai — cod de recomandare (codai.ro/r/<username>, 3–20 caractere [A-Za-z0-9_]) precompletat la înregistrare.
^[A-Za-z0-9_]{3,20}$lang?stringLimba paginilor de login. Implicit din cookie-ul NEXT_LOCALE, apoi din Accept-Language.
"ro""en"Redirect către interfața codai de login/consimțământ sau înapoi la redirect_uri cu code+state (sau error).
curl -X GET 'https://auth.codai.ro/auth?response_type=code&client_id=metu&redirect_uri=http%3A%2F%2Fexample.com&scope=openid+email+profile+inference+keys%3Amanage&code_challenge=string&code_challenge_method=S256'application/x-www-form-urlencoded- body
client_id*stringscope?stringScope-uri separate prin spațiu.
resource?stringIndicator de resursă RFC 8707, opțional.
uriAutorizarea de dispozitiv a fost emisă.
application/json- response
device_code*stringuser_code*stringAfișat utilizatorului; format ****-****.
verification_uri*stringuriverification_uri_complete*stringverification_uri cu user_code precompletat.
uriexpires_in*integerSecunde până expiră device code-ul.
interval?integerNumărul minim de secunde între interogările la /token.
curl -X POST 'https://auth.codai.ro/device/auth' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'client_id=codai-cli'{ "device_code": "string", "user_code": "BCDF-GHJK", "verification_uri": "https://auth.codai.ro/device", "verification_uri_complete": "http://example.com", "expires_in": 0, "interval": 5}clientSecretBasicAutorizareBasic <token>Autentificare client client_secret_basic. client_secret_post și private_key_jwt merg în body-ul formularului; clienții publici trimit doar client_id.
application/x-www-form-urlencoded- body
Body form-encoded. Câmpurile depind de grant_type; credențialele clientului depind de metoda lui de autentificare.
grant_type*string"authorization_code""refresh_token""urn:ietf:params:oauth:grant-type:device_code"code?stringauthorization_code — codul primit la redirect.
redirect_uri?stringauthorization_code — trebuie să fie egal cu valoarea folosită la /auth.
uricode_verifier?stringauthorization_code — verificatorul PKCE (43–128 caractere) al cărui hash S256 a fost trimis ca code_challenge.
refresh_token?stringGrant-ul refresh_token.
device_code?stringGrant-ul device_code — de la /device/auth.
scope?stringRestrângere opțională a scope-urilor la refresh.
resource?stringIndicator de resursă RFC 8707.
uriclient_id?stringClienți publici (none) și client_secret_post.
client_secret?stringDoar client_secret_post.
client_assertion_type?stringDoar private_key_jwt.
client_assertion?stringprivate_key_jwt — JWT semnat cu o cheie din jwks / jwks_uri înregistrate ale clientului.
Token-uri emise.
application/json- response
access_token*stringOpac (1 h) sau un JWT RS256 când resource=https://ai.codai.ro/mcp.
token_type*stringexpires_in*integerscope?stringScope-urile acordate, separate prin spațiu.
id_token?stringPrezent când s-a acordat openid. Include sub, role, sid, auth_time, acr, amr, nonce.
refresh_token?stringDoar când clientul permite refresh_token și s-a acordat offline_access. Rotit la fiecare refresh pentru clienții publici.
curl -X POST 'https://auth.codai.ro/token' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'grant_type=authorization_code'{ "access_token": "string", "token_type": "Bearer", "expires_in": 3600, "scope": "string", "id_token": "string", "refresh_token": "string"}clientSecretBasicAutorizareBasic <token>Autentificare client client_secret_basic. client_secret_post și private_key_jwt merg în body-ul formularului; clienții publici trimit doar client_id.
application/x-www-form-urlencoded- body
token*stringtoken_type_hint?string"access_token""refresh_token"client_id?stringPentru client_secret_post / none.
client_secret?stringPentru client_secret_post.
client_assertion_type?stringPentru private_key_jwt.
client_assertion?stringRezultatul introspecției (și pentru token-uri inactive).
application/json- response
active*booleanscope?stringclient_id?stringsub?stringId-ul utilizatorului (UUID).
token_type?stringexp?integeriat?integeriss?stringuriaud?stringIndicatorul de resursă pentru care a fost emis token-ul.
jti?stringcurl -X POST 'https://auth.codai.ro/token/introspection' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'token=string'{ "active": true, "scope": "string", "client_id": "string", "sub": "string", "token_type": "string", "exp": 0, "iat": 0, "iss": "http://example.com", "aud": "string", "jti": "string"}clientSecretBasicAutorizareBasic <token>Autentificare client client_secret_basic. client_secret_post și private_key_jwt merg în body-ul formularului; clienții publici trimit doar client_id.
application/x-www-form-urlencoded- body
token*stringtoken_type_hint?string"access_token""refresh_token"client_id?stringclient_secret?stringclient_assertion_type?stringclient_assertion?stringToken revocat (sau deja invalid). Body gol.
curl -X POST 'https://auth.codai.ro/token/revocation' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'token=string'bearerAuthAutorizareBearer <token>Access token OAuth emis de /token (folosit de /me și /connect/key).
Claim-urile subiectului token-ului.
application/json- response
sub*stringId-ul utilizatorului codai (UUID).
email?stringemailemail_verified?booleanname?stringpicture?stringuricurl -X GET 'https://auth.codai.ro/me'{ "sub": "string", "email": "user@example.com", "email_verified": true, "name": "string", "picture": "http://example.com"}id_token_hint?stringID token-ul emis anterior acestui client; identifică sesiunea și clientul.
post_logout_redirect_uri?stringURI-ul de redirect post-logout înregistrat al clientului.
uristate?stringValoare opacă adăugată la redirect-ul post-logout.
client_id?stringObligatoriu când lipsește id_token_hint și se dă un post_logout_redirect_uri.
ui_locales?stringParametru standard OIDC; interfața codai citește în schimb ?lang=ro|en.
Pagina de confirmare a logout-ului (sau pagina „deconectat”).
response?stringtext/htmlcurl -X GET 'https://auth.codai.ro/session/end'"string"bearerAuthAutorizareBearer <token>Access token OAuth emis de /token (folosit de /me și /connect/key).
X-Codai-Device-Name?stringDoar clienți first-party — eticheta (≤ 60 caractere) a cheii per dispozitiv; implicit Desktop.
length <= 60Cheie emisă (primul apel) sau deja emisă.
application/json- response
api_key*|Cheia în clar, întoarsă o singură dată per grant (null după). O stochezi sigilată.
api_key_id*stringId-ul stabil al cheii emise (revocabilă din consolă).
uuidbase_url*stringURL-ul de bază compatibil OpenAI cu care folosești cheia.
urimodel*stringalready_issued*booleantrue când textul în clar a fost deja predat la un apel anterior.
curl -X GET 'https://auth.codai.ro/connect/key'{ "api_key": "codai_xxxxxxxxxxxxxxxxxxxxxxxx", "api_key_id": "b0dd218e-3bcf-4bdb-a1e3-0689d60a8afd", "base_url": "https://ai.codai.ro/v1", "model": "codai", "already_issued": true}curl -X OPTIONS 'https://auth.codai.ro/connect/key'Procesul este pornit.
application/json- response
ok*booleancurl -X GET 'https://auth.codai.ro/health'{ "ok": true}Baza de date este accesibilă.
application/json- response
ok*booleanchecks*curl -X GET 'https://auth.codai.ro/health/ready'{ "ok": true, "checks": { "db": { "ok": true, "error": "string" } }}Ultima actualizare:
API-ul Resolve
Fix-uri de bug-uri verificate prin execuție: trimiți un repo și un issue, accepți oferta, primești o atestare publică.
Depanare
Rezolvă întâi erorile frecvente — 401 și 404 din cauza unei adrese sau chei greșite, cote și limite 429, capcane GitHub Copilot BYOK, probleme de autentificare în aplicații.