> ## Documentation Index
> Fetch the complete documentation index at: https://apidocs.noyax.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Kimlik doğrulama

> API anahtarıyla token almak, token'ı kullanmak ve yenilemek.

Noyax API, JWT biçiminde **access token** kullanır. Token'ı API anahtarınızla Noyax auth servisinden alırsınız ve her isteğin `Authorization` header'ında gönderirsiniz.

```http theme={null}
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImFwaSIs...
```

## Akış

```mermaid theme={null}
sequenceDiagram
    participant S as Sunucunuz
    participant A as Noyax Auth
    participant N as Noyax API
    S->>A: POST /ApiAuth/login (OrgName, ApiKey)
    A-->>S: AccessToken + RefreshToken
    S->>N: İstek (Bearer AccessToken)
    N-->>S: 200 OK
    Note over S,N: Token süresi dolar
    S->>N: İstek (süresi dolmuş token)
    N-->>S: 401 invalid_token
    S->>A: POST /ApiAuth/refresh (AccessToken, RefreshToken)
    A-->>S: Yeni AccessToken + yeni RefreshToken
```

## Token almak

<ParamField body="OrgName" type="string" required>
  Kuruluş adınız. Noyax tarafından verilir.
</ParamField>

<ParamField body="ApiKey" type="string" required>
  API anahtarınız.
</ParamField>

<CodeGroup>
  ```bash İstek theme={null}
  curl -X POST https://app.noyax.com/services/bb_auth_service/api/ApiAuth/login \
    -H "Content-Type: application/json" \
    -d '{ "OrgName": "KURULUS_ADINIZ", "ApiKey": "API_ANAHTARINIZ" }'
  ```

  ```json Yanıt theme={null}
  {
    "Data": {
      "AccessToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImFwaSIs...",
      "RefreshToken": "q3Jv1mYt8Rk0bXw2LzH5nD7sPfA9cGe4..."
    },
    "Success": true,
    "Message": null
  }
  ```
</CodeGroup>

Bilgiler hatalıysa ya da API lisansınızın süresi dolmuşsa auth servisi **401** döner (`Invalid API credentials.`, `ApiKey expired.`).

## Token'ı yenilemek

Access token kısa ömürlüdür (dakikalar mertebesinde). Süresi dolduğunda API şu yanıtı döner:

```http theme={null}
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer error="invalid_token", error_description="The token expired"

{
  "Success": false,
  "ResultCode": "0102",
  "Message": "Token has expired. Obtain a new token using the refresh token.",
  "Errors": [
    { "Code": "0102", "Message": "Token has expired. Obtain a new token using the refresh token." }
  ]
}
```

Bu durumda eski access token ve refresh token ile yeni bir çift alın:

```bash theme={null}
curl -X POST https://app.noyax.com/services/bb_auth_service/api/ApiAuth/refresh \
  -H "Content-Type: application/json" \
  -d '{ "AccessToken": "SURESI_DOLMUS_TOKEN", "RefreshToken": "REFRESH_TOKEN" }'
```

Yanıt, login yanıtıyla aynı yapıdadır.

<Warning>
  **Her login ve refresh işlemi yeni bir refresh token üretir ve öncekini geçersiz kılar.** Bir API anahtarının aynı anda yalnızca bir geçerli refresh token'ı olur. Aynı anahtarı birden fazla sunucu ya da işlem kullanıyorsa token'ı tek bir yerde yönetin ve paylaşın. Aksi halde bir işlemin yenilemesi diğerinin refresh token'ını geçersiz kılar.
</Warning>

## Önerilen uygulama

* Token'ı bellekte ya da paylaşılan bir cache'te tutun; her istekte login olmayın.
* Token'ın `exp` claim'ine bakarak süresi dolmadan kısa süre önce yenileyin ya da `401 invalid_token` aldığınızda bir kez yenileyip isteği tekrarlayın.
* Refresh başarısız olursa (`Invalid refresh token.`) yeniden login olun.

## Token içeriği

Access token, API anahtarınıza tanımlı bilgileri taşır. Bu bilgiler token alınırken belirlenir:

| Claim | Anlamı                                                          |
| ----- | --------------------------------------------------------------- |
| `P`   | Modül yetkileri. Bkz. [Yetkiler](/tr/v1/guides/permissions)     |
| `ARC` | Günlük istek limiti. Bkz. [Limitler](/tr/v1/guides/rate-limits) |
| `exp` | Token'ın geçerlilik bitişi (Unix zamanı)                        |

<Info>
  Anahtarınızın yetkileri ya da günlük limiti değiştirilirse, değişiklik **yeni token aldığınızda** geçerli olur.
</Info>
