---
title: Yetkilendirme
description: Admin API için access token alma ve isteklerde kullanma.
---

<Callout type="info" title="Uygulama türüne göre yetkilendirme rehberleri">
Admin uygulaması için OAuth2 Authorization Code akışı: [Admin App Authorization](https://builders.ikas.com/docs/app-development/admin-app/authorization)

Özel uygulamalar için token alma: [Private App Authentication](https://builders.ikas.com/docs/app-development/private-app/authentication)
</Callout>

Admin API'ye yapılan her istek bir access token gerektirir. Token, `Authorization: Bearer <access_token>` başlığıyla gönderilir.

## Özel uygulama: client credentials

Özel uygulamalar (private app) token'ı `client_credentials` akışıyla alır. `client_id` ve `client_secret` değerlerini yönetim panelinde oluşturduğunuz özel uygulamanın ayarlarında bulabilirsiniz.

<Tabs items={['cURL', 'Node.js', 'Python', 'Go']} groupId="admin-api-rest-language" persist>
<Tab value="cURL">

```bash title="Terminal"
curl -X POST 'https://api.myikas.com/api/admin/oauth/token' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'grant_type=client_credentials' \
  --data-urlencode "client_id=$IKAS_CLIENT_ID" \
  --data-urlencode "client_secret=$IKAS_CLIENT_SECRET"
```

</Tab>
<Tab value="Node.js">

```js title="request.mjs"
const response = await fetch('https://api.myikas.com/api/admin/oauth/token', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: new URLSearchParams({
    grant_type: 'client_credentials',
    client_id: process.env.IKAS_CLIENT_ID,
    client_secret: process.env.IKAS_CLIENT_SECRET,
  }),
});

const { access_token, expires_in } = await response.json();
```

</Tab>
<Tab value="Python">

```python title="request.py"
import os

import requests

response = requests.post(
    "https://api.myikas.com/api/admin/oauth/token",
    data={
        "grant_type": "client_credentials",
        "client_id": os.environ["IKAS_CLIENT_ID"],
        "client_secret": os.environ["IKAS_CLIENT_SECRET"],
    },
)
response.raise_for_status()
token = response.json()["access_token"]
```

</Tab>
<Tab value="Go">

```go title="main.go"
package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"net/url"
	"os"
)

func main() {
	res, err := http.PostForm("https://api.myikas.com/api/admin/oauth/token", url.Values{
		"grant_type":    {"client_credentials"},
		"client_id":     {os.Getenv("IKAS_CLIENT_ID")},
		"client_secret": {os.Getenv("IKAS_CLIENT_SECRET")},
	})
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()

	var token struct {
		AccessToken string `json:"access_token"`
		ExpiresIn   int    `json:"expires_in"`
	}
	if err := json.NewDecoder(res.Body).Decode(&token); err != nil {
		log.Fatal(err)
	}
	fmt.Println(token.AccessToken, token.ExpiresIn)
}
```

</Tab>
</Tabs>

Yanıt:

```json
{
  "access_token": "<access_token>",
  "token_type": "Bearer",
  "expires_in": 14400
}
```

`expires_in` saniye cinsindendir. Token süresi dolduğunda aynı istekle yeni bir token alın.

## Admin uygulaması: refresh token

ikas App Store'da yayınlanan admin uygulamaları OAuth2 Authorization Code akışını kullanır. Akış sonunda alınan `refresh_token` ile süresi dolan access token yenilenir:

<Tabs items={['cURL', 'Node.js', 'Python', 'Go']} groupId="admin-api-rest-language" persist>
<Tab value="cURL">

```bash title="Terminal"
curl -X POST 'https://api.myikas.com/api/admin/oauth/token' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'grant_type=refresh_token' \
  --data-urlencode "refresh_token=$IKAS_REFRESH_TOKEN" \
  --data-urlencode "client_id=$IKAS_CLIENT_ID" \
  --data-urlencode "client_secret=$IKAS_CLIENT_SECRET"
```

</Tab>
<Tab value="Node.js">

```js title="request.mjs"
const response = await fetch('https://api.myikas.com/api/admin/oauth/token', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body: new URLSearchParams({
    grant_type: 'refresh_token',
    refresh_token: process.env.IKAS_REFRESH_TOKEN,
    client_id: process.env.IKAS_CLIENT_ID,
    client_secret: process.env.IKAS_CLIENT_SECRET,
  }),
});

const { access_token, refresh_token, expires_in } = await response.json();
```

</Tab>
<Tab value="Python">

```python title="request.py"
import os

import requests

response = requests.post(
    "https://api.myikas.com/api/admin/oauth/token",
    data={
        "grant_type": "refresh_token",
        "refresh_token": os.environ["IKAS_REFRESH_TOKEN"],
        "client_id": os.environ["IKAS_CLIENT_ID"],
        "client_secret": os.environ["IKAS_CLIENT_SECRET"],
    },
)
response.raise_for_status()
tokens = response.json()
```

</Tab>
<Tab value="Go">

```go title="main.go"
package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"net/url"
	"os"
)

func main() {
	res, err := http.PostForm("https://api.myikas.com/api/admin/oauth/token", url.Values{
		"grant_type":    {"refresh_token"},
		"refresh_token": {os.Getenv("IKAS_REFRESH_TOKEN")},
		"client_id":     {os.Getenv("IKAS_CLIENT_ID")},
		"client_secret": {os.Getenv("IKAS_CLIENT_SECRET")},
	})
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()

	var tokens struct {
		AccessToken  string `json:"access_token"`
		RefreshToken string `json:"refresh_token"`
		ExpiresIn    int    `json:"expires_in"`
	}
	if err := json.NewDecoder(res.Body).Decode(&tokens); err != nil {
		log.Fatal(err)
	}
	fmt.Println(tokens.ExpiresIn)
}
```

</Tab>
</Tabs>

## Scope'lar

Uygulamanın hangi verilere erişebileceği scope'larla belirlenir. Özel uygulamada scope'ları yönetim panelinde uygulamayı oluştururken, admin uygulamasında ise OAuth yetkilendirme isteğinde seçersiniz. Bir işlemi yetkisi olmayan bir token ile çağırırsanız istek yetki hatasıyla döner.

| Scope | İzin |
| --- | --- |
| `read_products` | Ürünleri, varyantları ve ürünlere bağlı kategori, marka ve etiket gibi bilgileri görüntüleme. v2'de stok lokasyonlarını ve stok seviyelerini görüntülemek için de bu scope gerekir. |
| `write_products` | Ürünleri, varyantları ve ürünlere bağlı kategori, marka ve etiket gibi bilgileri düzenleme. v2'de varyant stoklarını da güncelleyebilir (`saveVariantStocks`). |
| `read_orders` | Tüm satış kanallarındaki siparişleri, siparişlere bağlı ürün ve müşteri bilgileriyle birlikte görüntüleme. |
| `write_orders` | Tüm satış kanallarındaki siparişleri düzenleme ve sipariş durumlarını değiştirme. Mağaza START paketindeyse satır güncelleme (v1), kargoya hazırlama, paket durumu, kargo iptali, satır iptali ve iade işlemleri yalnızca uygulamanın kendi satış kanalındaki siparişlerde yapılabilir. |
| `read_customers` | Müşterilerin adreslerini ve diğer bilgilerini görüntüleme. |
| `write_customers` | Müşteri bilgilerini düzenleme ve yeni adres ekleme. |
| `read_campaigns` | Mağazada oluşturulan otomatik indirimleri ve kupon kodlarını görüntüleme. |
| `write_campaigns` | Yeni indirim oluşturma ve mevcut kampanyaları düzenleme. |
| `read_inventories` | v1'de stok lokasyonlarını, ürünlerin stok seviyelerini ve tedarikçileri görüntüleme. v2'de stok okumak için `read_products` gerekir. |
| `write_inventories` | Ürünlerin stok seviyelerini güncelleme (v1'de `saveProductStockLocations`, v2'de `saveVariantStocks`). v1'de tedarikçileri de yönetir. Stok lokasyonları API ile yalnızca okunabilir. |
| `write_storefronts` | Online mağaza script'lerini ekleme, düzenleme ve silme; mağaza politikalarını (iade, gizlilik vb.) kaydetme ve silme (yalnızca v1). v2'de kargo ayarlarını listelemek (`listShippingSettings`) için de gerekir. |

<Callout type="warning" title="Gizli bilgileri koruyun">
`client_secret`, access token ve refresh token değerlerini istemci tarafı koda, public repolara veya paylaşılan Postman koleksiyonlarına eklemeyin. Bu değerleri ortam değişkenlerinde saklayın ve yalnızca sunucu tarafında kullanın.
</Callout>
