# SCIM ile kullanıcı sağlama

> Kimlik sağlayıcınız QueryProxy kullanıcılarını SCIM 2.0 ile oluştursun, askıya alsın, grupları eşitlesin. Token'lar, desteklenenler, gruplardan takım rolleri.

- Dokümantasyon: Kılavuzlar
- Kaynak: https://queryproxy.com/tr/docs/scim-kullanici-saglama/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
SCIM 2.0, kimlik sağlayıcınızın QueryProxy kullanıcılarını kendi başına
yönetmesini sağlar: biri ekibe katılınca kullanıcıyı oluşturur, profili günceller,
biri ayrılınca hesabı **askıya alır** ve grup üyeliklerini eşitler. Bu,
[tek oturum açmayı](/tr/docs/tek-oturum-acma/) tamamlar: oturum açma "şimdi kim
girebilir" sorusunu yanıtlar, SCIM ise girişler *arasında* erişimi geri alır.
SCIM olmadan, sağlayıcıda kaldırılan biri açık QueryProxy oturumu bitene kadar
içeride kalır.

SCIM **varsayılan olarak kapalıdır**. Kapalıyken `/scim/v2` altındaki her yol
`404` döner.

## Açın

```dotenv
QUERYPROXY_SCIM_ENABLED=true
```

Değiştirdikten sonra konteynerleri yeniden başlatın. Ardından sağlayıcıyı şu
adrese yöneltin:

```text
https://queryproxy.example.com/scim/v2
```

Bu adres `APP_URL` artı `/scim/v2`'dir. QueryProxy `application/scim+json` ile
yanıt verir; yeteneklerini `/scim/v2/ServiceProviderConfig` altında, yanında
`/scim/v2/Schemas` ve `/scim/v2/ResourceTypes` ile bildirir.

## SCIM token'ları

Sağlayıcı, SCIM için üretilmiş bir bearer token ile doğrulanır. Bu bir
[kişisel erişim token'ı](/tr/docs/rest-api/) değildir; ayrı oluşturulur ve ayrı
iptal edilir.

Sistem yöneticisi olarak web arayüzünde **Administration → SCIM**
(`/settings/scim`) sayfasından oluşturun. Sayfa uç nokta URL'sini gösterir,
token'ları (ad, oluşturan, son kullanım, durum) listeler, oluşturur ve iptal
eder. Token değeri **bir kez** gösterilir ve yalnızca kimliğinizi yeniden
doğruladıktan sonra: parola, TOTP kodu ya da yalnızca SSO kullanan yönetici için
son 15 dakika içinde yapılmış bir SSO girişi; API token'larıyla aynı kural.
Doğrulama için sağlayıcıya gönderilen SSO'lu yönetici işlem sonunda SCIM
sayfasına döner. SCIM kapalıyken sayfa nasıl açılacağını anlatır; var olan
token'lar listede kalır ve iptal edilebilir, böylece sızmış bir token her an
kapatılabilir.

Komut satırından da olur:

```bash
php artisan queryproxy:scim-token create --name=entra --by=admin@example.com
php artisan queryproxy:scim-token list
php artisan queryproxy:scim-token revoke --id=3 --by=admin@example.com
```

`--by`, denetim günlüğü için yöneticinin e-postasıdır. Token `qpscim_` ile başlar.
QueryProxy yalnızca SHA-256 özetini saklar; kaybolan token yeniden gösterilemez,
iptal edip yenisini oluşturun.

Geçerli token olmadan gelen istek, SCIM hata gövdesiyle `401` alır. Tekrarlanan
başarısızlıkların etkisi için bkz. [Hız sınırları](#hız-sınırları).

## Neler desteklenir

| | |
| :-- | :-- |
| Kaynaklar | `Users` ve `Groups` |
| İşlemler | `GET` (tekil ve liste), `POST`, `PUT`, `PATCH`, `DELETE` |
| Filtre | Kullanıcılarda `userName`, `externalId`, `id` ve `emails.value`; gruplarda `displayName`, `externalId` ve `id` üzerinde `eq` |
| Sayfalama | `startIndex` ve `count`, sayfa başına en çok 200 kaynak |
| Desteklenmez | toplu (bulk) işlemler, sıralama, ETag, parola değiştirme |

Hatalar SCIM `Error` şemasındadır. Beklenmeyen bir arıza, o şemada `500` döner ve
iç nedeni gövdeye yazmaz.

## Kullanıcılar

- **Oluşturma.** `POST /Users` **parolasız** bir hesap açar. Kullanıcı SSO ile
  girer; ilk girişte sağlayıcı e-posta adresini doğrulanmış bildiriyorsa
  QueryProxy hesabı e-postaya göre sağlayıcıya bağlar (bkz.
  [Tek oturum açma](/tr/docs/tek-oturum-acma/) sayfasındaki ilk giriş ve bağlama bölümü).
  `userName` e-posta değilse, örneğin Entra ID kullanıcı asıl adı (UPN) ise,
  `emails` içindeki birincil adres kimlik olur; `userName` eşleştirme için
  saklanır.
- **Güncelleme.** `PUT` ve `PATCH` adı, e-posta adresini ve aktiflik bayrağını
  değiştirir. `active` alanını içermeyen bir `PUT` mevcut durumu korur.
  QueryProxy'nin işine yaramayan yollar (unvan, enterprise eklentisi) sağlayıcılar
  her eşitlemede gönderdiği için reddedilmez, yok sayılır. Tanıdığı bir yol için
  yanlış değer `400` ve `invalidValue` alır. Entra ID'nin boolean yerine
  gönderdiği `"True"` ve `"False"` metinleri kabul edilir.
- **Askıya alır, silmez.** `active=false` ve `DELETE` kullanıcıyı **askıya alır**:
  açık oturumlar ve kişisel erişim token'ları hemen çalışmaz olur, hesap giriş
  yapamaz. Hiçbir şey silinmez. `DELETE` sonrasında kullanıcı durur ve
  `active=false` ile okunur.
- **Askıyı kaldırma.** `active=true` yalnızca **SCIM'in kendi koyduğu** askıyı
  kaldırır. Bir yönetici hesabı elle askıya aldıysa SCIM onu askıda bırakır ve
  denetim kaydı yazmaz. SCIM'in zaten askıya aldığı hesabı bir yönetici de
  askıya alırsa askıyı yönetici devralır ve SCIM artık kaldıramaz.
- **Adlar benzersiz olmalı.** Başka bir hesaba ait `userName` ya da e-posta adresi
  `409` ve `uniqueness` döndürür.

SCIM **yalnızca kendi oluşturduğu kullanıcıları ve SSO ile sağlayıcıya zaten
bağlanmış kullanıcıları** yönetir. Break-glass yöneticileri dahil yerel hesaplar
ona görünmez: bunlara `GET`, `PATCH` ve `DELETE` `404` döner, aynı e-postayla
kullanıcı oluşturmak `409` döner. Çalınmış bir SCIM token'ı bu yüzden acil durum
hesabınızı askıya alamaz ya da yeniden adlandıramaz. SCIM sistem yöneticisi
bayrağını da asla koymaz.

SCIM'in açtığı hesap SSO hesabı sayılır. Sıfırlama bağlantısıyla parola almaz ve
yöneticinin **Reset password** işlemi onu reddeder. Bkz.
[Tek oturum açma](/tr/docs/tek-oturum-acma/#ssonun-yanında-parola-girişi).

## Gruplar ve takım rolleri

`Groups` üyeleriyle birlikte QueryProxy'de saklanır. Tek oturum açmanın kullandığı
`QUERYPROXY_OIDC_ROLE_MAP` ile takım rolüne dönüşür; bkz.
[Rol eşlemesi](/tr/docs/tek-oturum-acma/#rol-eşlemesi). Hangi sağlayıcı grubunun
hangi takımda hangi rol olduğunu söyleyen tek yer bu haritadır.

Bir SCIM grubu, rol haritasındaki bir girdiyle **`displayName` ya da
`externalId`** üzerinden eşleşir. Yazdığınız değeri hangisinin taşıdığı
sağlayıcıya bağlıdır:

- **Entra ID.** Microsoft'un SCIM başvurusu grubun `objectId` değerini
  `externalId`'ye eşler ([Microsoft'un SCIM kılavuzu](https://learn.microsoft.com/en-us/entra/identity/app-provisioning/use-scim-to-provision-users-and-groups)),
  Entra ID `groups` claim'ine de nesne kimliklerini koyar; bu yüzden rol haritası
  nesne kimliğiyle yazılır:
  `1f9c0c2e-0000-0000-0000-000000000000:payments:dba`. Güvenmeden önce kurumsal
  uygulamanızın grup öznitelik eşlemesine bakın.
- Grup adını `displayName` olarak gönderen bir sağlayıcıda ad ile yazılmış girdi
  eşleşir: `platform-dba:payments:dba`.

Üyelik değişince olanlar:

- QueryProxy, etkilenen kullanıcının rollerini **yalnızca değişen grupla eşleşen
  rol haritası girdilerinin adlandırdığı takımlarda** yeniden hesaplar. Başka
  takımlardaki roller, girişte ya da elle verilmiş olsalar da, değişmez.
- Bir takımda kullanıcının rolü, tüm SCIM gruplarındaki en yüksek roldür (önce
  `dba`, sonra `developer`, sonra `auditor`).
- Hiçbir girdinin eşleşmediği grup kabul edilir ve rollere etkisi olmaz.
- Bir grubu yeniden adlandırmak ya da `externalId`'sini değiştirmek tüm üyeleri
  yeniden hesaplar. Bu iş istek içinde çalışır; binlerce üyeli bir grubun adını
  değiştirmek yavaştır.
- Her rol değişikliği, `via` değeri `scim` olan `user.role_synced` olarak yazılır.

SCIM de oturum açma da rol yazar. Sağlayıcı ID token'da SCIM'den farklı gruplar
bildirirse son yazan kazanır; iki kaynağı tutarlı tutun. Rol haritası yoksa SCIM
kullanıcı oluşturup askıya alabilir ama takım rolü vermez.

## Hız sınırları

`QUERYPROXY_SCIM_RATE_LIMIT` (varsayılan `300`) her token'ın dakikadaki istek
bütçesidir. Aynı zamanda bir adresin dakikada yapabileceği başarısız doğrulama
sayısıdır: aşılınca o adres `401` yerine `Retry-After` ile `429` alır.

| Değişken | Varsayılan | Anlamı |
| :-- | :-- | :-- |
| `QUERYPROXY_SCIM_ENABLED` | `false` | `/scim/v2`'yi sunar; kapalıyken her SCIM yolu `404` döner |
| `QUERYPROXY_SCIM_RATE_LIMIT` | `300` | Her token için dakikadaki istek; adres başına başarısız doğrulama sayısı |

## Denetim günlüğünde

| Olay | Ne zaman |
| :-- | :-- |
| `scim.user_provisioned` | Kullanıcı oluşturuldu |
| `scim.user_updated` | Kullanıcı bilgileri değişti |
| `scim.user_suspended` | `active=false` ya da `DELETE` |
| `scim.user_unsuspended` | SCIM kendi koyduğu askıyı kaldırdı |
| `scim.group_synced` | Bir grup ya da üyeleri değişti |
| `scim.token_created`, `scim.token_revoked` | SCIM token'ı oluşturuldu ya da iptal edildi |

## Yükseltme

Migration'ları her zamanki gibi çalıştırın. SCIM tablolarını (`scim_tokens`,
`scim_groups`, `scim_group_user`) ve `users` üzerinde dört sütunu ekler; hepsi
geri alınabilir. `QUERYPROXY_SCIM_ENABLED=true` yapana kadar hiçbir şey değişmez.

## Sonraki adımlar

- Oturum açma tarafı ve rol eşlemesi için [Tek oturum açma](/tr/docs/tek-oturum-acma/).
- Öbür token türü için [REST API ve token'lar](/tr/docs/rest-api/).
- Olayları dışarı aktarmak için [Denetim kaydı ve SIEM](/tr/docs/denetim-kaydi-ve-siem/).
