Files
SnapOtter/apps/docs/tr/guide/scim.md
T
SnapOtterandGitHub d10d0f544f fix: release QA hardening across processing, media, security, and CI gates (#649)
A release-readiness QA pass over the whole product. The commits split into
defects a user would hit and gates that were reporting green while measuring
nothing.

## Fixes that change behaviour

Rate limiting was bypassable on every install: TRUST_PROXY defaulted to true, so
request.ip came from a client-set header and a forged X-Forwarded-For got past
the login limiter. The default is now a private-network trust list.

A transient Postgres outage stranded in-flight jobs, leaving finished output on
disk with no row pointing at it. A reconciler now resolves those rows and adopts
the bytes rather than dropping the work.

A Redis connection that moved to a new address wedged every read-blocked
consumer, so completions stopped signalling while health still answered 200.
Socket timeouts plus subscriber pings recover it.

Installing more than one AI bundle left the shared venv multi-versioned and
silently broke three tools. The installer now reconciles distributions to one
version each.

Converting an image to JXL at quality 1 through 4 returned a 500, because
libjxl 0.7 rejects the distance those values compute. The quality is floored at
what the encoder honours. A missing ffmpeg was also reported to the user as a
corrupt upload; it now says the engine is unavailable.

RAW uploads reached an unpatched LibRaw on arm64, so it is built from source at
0.22.2, and the release scan was split so it can fail on an unfixed critical
instead of hiding it behind ignore-unfixed.

## Gates that could not fail

Two mutation lanes ran zero mutants because Stryker crawled the gitignored docs
build; coverage discarded its whole report on any failing test; the lint gate
skipped root tests, scripts, and two workspaces; and several generated matrices
counted a host missing ffmpeg as a passing tool. Each now measures what it
claims.

Full evidence and the outstanding release items are tracked locally and are not
part of this branch.
2026-07-27 15:37:30 +08:00

304 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
description: "Kullanıcıları ve grupları kimlik sağlayıcınızdan SnapOtter'a senkronize etmek için SCIM 2.0 sağlamayı kurun. Okta, Azure AD / Entra ID ve özel entegrasyonları kapsar."
i18n_source_hash: 06ee702b386e
i18n_provenance: human
i18n_output_hash: 5a0157d3e079
i18n_hash_version: 2
---
# SCIM Sağlama {#scim-provisioning}
SnapOtter, otomatik kullanıcı ve grup sağlaması için SCIM 2.0'ı (System for Cross-domain Identity Management) uygular. Kimlik sağlayıcınız kullanıcı hesaplarını oluşturabilir, güncelleyebilir, devre dışı bırakabilir ve yeniden etkinleştirebilir; ayrıca grup üyeliklerini otomatik olarak senkronize edebilir.
::: tip Enterprise özelliği
SCIM sağlaması, `scim` özelliğine sahip bir **enterprise** lisansı gerektirir. Team planında kullanılamaz. Bu özellik olmadan tüm SCIM uç noktaları (keşif hariç) 403 döndürür.
:::
## Önkoşullar {#prerequisites}
- Genel bir URL üzerinden erişilebilen, çalışan bir SnapOtter örneği
- `scim` özelliğine sahip bir enterprise lisans anahtarı
- Tam etkili izin setine sahip yerleşik bir SnapOtter `admin` hesabı. Yetki verilen özel bir rol veya herhangi bir yönetici izninin eksik olduğu bir yönetici API anahtarı, genel SCIM belirtecini oluşturamaz veya iptal edemez.
- Kimlik sağlayıcınızın sağlama ayarlarına admin erişimi
## Hızlı başlangıç {#quick-start}
1. Bir SCIM bearer token oluşturun:
```bash
curl -X POST https://photos.example.com/api/v1/enterprise/scim/token \
-H "Cookie: snapotter-session=YOUR_SESSION" \
-H "Content-Type: application/json"
```
Yanıt token'ı içerir. Hemen kaydedin; bir daha alınamaz.
```json
{
"token": "so_scim_v2_a1b2c3d4e5f6...",
"message": "Save this token - it cannot be retrieved again"
}
```
2. Kimlik sağlayıcınızda SCIM sağlamasını şunlarla yapılandırın:
- **Base URL**: `https://photos.example.com/api/v1/scim/v2`
- **Kimlik doğrulama**: Bearer token (1. adımdaki token'ı yapıştırın)
## Kimlik doğrulama {#authentication}
SCIM uç noktaları, kullanıcı oturumlarından ve API anahtarlarından ayrı, özel bir Bearer token kullanır.
### Token oluşturma {#generating-a-token}
`POST /api/v1/enterprise/scim/token` yeni bir SCIM belirteci oluşturur. Belirteç, örnekteki kullanıcıların temel hazırlığını yapıp değiştirebildiğinden, bu uç nokta, tam etkin yönetici izin kümesiyle birlikte yerleşik `admin` rolünü gerektirir. `users:manage`'yi özel bir rolde tutmak yeterli değildir.
Token düz metin olarak yalnızca bir kez döndürülür. SnapOtter yalnızca bir scrypt karması saklar. Token'ı kaybederseniz iptal edin ve yeni bir tane oluşturun.
Aynı anda yalnızca bir SCIM token etkindir. Yeni bir token oluşturmak öncekinin yerini alır.
::: warning Yükseltme sonrasında jetonun yeniden düzenlenmesi
Eski sürümlenmemiş SCIM belirteçleri reddedilir. `so_scim_v2_...` belirteçleri veren bir sürüme yükselttikten sonra, yeni bir belirteç oluşturun ve tedariği sürdürmeye devam etmeden önce kimlik sağlayıcınızı güncelleyin.
:::
### Token iptali {#revoking-a-token}
`DELETE /api/v1/enterprise/scim/token`, mevcut SCIM belirtecini iptal eder. Belirteç oluşturmayla aynı tam yerleşik yönetici gereksinimine sahiptir.
### Hız sınırlama {#rate-limiting}
SCIM uç noktaları, token başına dakikada 1000 istekle sınırlandırılmıştır. Bu sınırın aşılması HTTP 429 döndürür.
## Desteklenen kaynaklar {#supported-resources}
| SCIM kaynağı | SnapOtter kavramı | Oluştur | Oku | Güncelle | Sil |
|---|---|---|---|---|---|
| User | Kullanıcı hesabı | Evet | Evet | Evet | Yumuşak silme |
| Group | Team | Evet | Evet | Evet | Evet |
::: warning
SCIM Grupları, rollere değil SnapOtter **team**'lerine eşlenir. SCIM, bir kullanıcının rolünü ayarlayamaz. SCIM aracılığıyla oluşturulan tüm kullanıcılara `user` rolü atanır. Bir kullanıcının rolünü değiştirmek için SnapOtter admin arayüzünü kullanın.
:::
## Kullanıcı işlemleri {#user-operations}
### Kullanıcı oluşturma {#create-user}
`POST /api/v1/scim/v2/Users`
`authProvider` değeri `scim` ve rolü `user` olarak ayarlanmış yeni bir kullanıcı hesabı oluşturur. Kullanıcı Default team'e atanır. `active` değeri `false` ise rol bunun yerine `disabled` olarak ayarlanır.
Gerekli öznitelikler: `userName`. İsteğe bağlı: `externalId`, `emails`, `active` (varsayılan `true`).
### Kullanıcıları listeleme ve filtreleme {#list-and-filter-users}
`GET /api/v1/scim/v2/Users`
Sayfalanmış bir kullanıcı listesi döndürür. `startIndex` ve `count` sorgu parametrelerini destekler (sayfa başına en fazla 200 sonuç).
Filtreleme yalnızca şu öznitelikler üzerinde `eq` (eşittir) destekler:
- `userName eq "jane"`
- `externalId eq "ext-12345"`
Diğer filtre operatörleri ve öznitelikler HTTP 400 döndürür.
### Kullanıcı getirme {#get-user}
`GET /api/v1/scim/v2/Users/:id`
SnapOtter kullanıcı kimliğine göre tek bir kullanıcı döndürür.
### Kullanıcıyı değiştirme {#replace-user}
`PUT /api/v1/scim/v2/Users/:id`
Kullanıcının özniteliklerini değiştirir. `userName`, `externalId`, `emails` ve `active` destekler. Kullanıcı adı değişiklikleri çakışma açısından denetlenir (yeni kullanıcı adı başka bir kullanıcı tarafından alınmışsa 409).
### Kullanıcıyı yamalama {#patch-user}
`PATCH /api/v1/scim/v2/Users/:id`
SCIM PatchOp kullanan kısmi güncelleme. Desteklenen işlemler:
| İşlem | Yollar |
|---|---|
| `replace` | `active`, `userName`, `externalId`, `emails`, `emails[type eq "work"].value`, `name.formatted`, `displayName` |
| `add` | `replace` ile aynı |
| `remove` | `externalId`, `emails` |
`name.formatted` ve `displayName` yolları uyumluluk için kabul edilir ancak kalıcı bir etkisi yoktur (SnapOtter ayrı bir görünen ad saklamaz).
Değersiz `replace` işlemleri (değerin bir `path` içermeyen bir nesne olduğu durumlar) da `userName`, `externalId`, `emails` ve `active` anahtarlarıyla desteklenir.
### Kullanıcıyı devre dışı bırakma (yumuşak silme) {#deactivate-user-soft-delete}
`DELETE /api/v1/scim/v2/Users/:id`
SnapOtter, SCIM aracılığıyla kullanıcıları kalıcı olarak silmez. Bunun yerine DELETE bir yumuşak devre dışı bırakma gerçekleştirir:
1. Kullanıcının rolü mevcut değerinden (örn. `editor`) `disabled:editor` değerine değiştirilir ve orijinal rol korunur.
2. Kullanıcının parolası temizlenir.
3. Tüm etkin oturumlar iptal edilir.
4. Tüm API anahtarları iptal edilir.
Kullanıcı artık oturum açamaz veya herhangi bir API anahtarı kullanamaz. Verileri (dosyalar, geçmiş) korunur.
### Kullanıcıyı yeniden etkinleştirme {#reactivate-user}
Daha önce devre dışı bırakılmış bir kullanıcıyı yeniden etkinleştirmek için `active: true` içeren bir `PUT` veya `PATCH` isteği gönderin. SnapOtter, devre dışı bırakmadan önceki orijinal rolü geri yükler (örn. `disabled:editor` yeniden `editor` olur). Orijinal rol belirlenemezse `user` değerine geri döner.
::: details Örnek: PATCH ile devre dışı bırakma ve yeniden etkinleştirme
```json
// Deactivate
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{ "op": "replace", "path": "active", "value": false }
]
}
// Reactivate
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{ "op": "replace", "path": "active", "value": true }
]
}
```
:::
## Grup işlemleri {#group-operations}
SCIM Grupları SnapOtter team'lerine eşlenir. Bir grup oluşturmak bir team oluşturur. Grup üyeliği, bir kullanıcının hangi team'e ait olduğunu denetler.
### Grup oluşturma {#create-group}
`POST /api/v1/scim/v2/Groups`
Gerekli: `displayName`. İsteğe bağlı: `members` (`{ value: userId }` dizisi).
### Grupları listeleme ve filtreleme {#list-and-filter-groups}
`GET /api/v1/scim/v2/Groups`
Filtreleme yalnızca `displayName eq "..."` destekler. `startIndex` ve `count` ile sayfalanır (sayfa başına en fazla 200 sonuç).
### Grup getirme {#get-group}
`GET /api/v1/scim/v2/Groups/:id`
### Grubu değiştirme {#replace-group}
`PUT /api/v1/scim/v2/Groups/:id`
Grup adını ve tam üyelik listesini değiştirir. Yeni listede olmayan mevcut üyeler Default team'e taşınır.
### Grubu yamalama {#patch-group}
`PATCH /api/v1/scim/v2/Groups/:id`
Şu işlemleri destekler:
| İşlem | Yol | Etki |
|---|---|---|
| `add` | `members` | Kullanıcıları team'e ekler |
| `remove` | `members[value eq "userId"]` | Kullanıcıyı Default team'e taşır |
| `replace` | `displayName` | Team'i yeniden adlandırır |
| `replace` | `members` | Tüm üyeleri değiştirir (kaldırılan üyeler Default team'e taşınır) |
### Grubu silme {#delete-group}
`DELETE /api/v1/scim/v2/Groups/:id`
Team'i siler. Silinen team'in tüm üyeleri Default team'e taşınır. Kullanıcılar devre dışı bırakılmaz veya silinmez.
## IdP kurulumu {#idp-setup}
### Okta {#okta}
1. Okta admin konsolunda SnapOtter uygulamanızı açın (veya oluşturun).
2. **Provisioning** sekmesine gidin ve **Configure API Integration**'a tıklayın.
3. **Enable API Integration**'ı işaretleyin ve şunları girin:
- **Base URL**: `https://photos.example.com/api/v1/scim/v2`
- **API Token**: Yukarıda oluşturulan SCIM bearer token
4. **Test API Credentials**'a, ardından **Save**'e tıklayın.
5. **Provisioning > To App** altında şunları etkinleştirin:
- **Create Users**
- **Update User Attributes**
- **Deactivate Users**
6. **Push Groups** altında, hangi Okta gruplarının SnapOtter team'leri olarak senkronize edileceğini yapılandırın.
### Azure AD / Entra ID {#azure-ad-entra-id}
1. Azure portalında SnapOtter enterprise uygulamanıza gidin.
2. **Provisioning**'e gidin ve **Provisioning Mode**'u **Automatic** olarak ayarlayın.
3. **Admin Credentials** altında şunları girin:
- **Tenant URL**: `https://photos.example.com/api/v1/scim/v2`
- **Secret Token**: Yukarıda oluşturulan SCIM bearer token
4. **Test Connection**'a, ardından **Save**'e tıklayın.
5. **Mappings** altında kullanıcı ve grup öznitelik eşlemelerini yapılandırın. Varsayılanlar genellikle işe yarar, ancak `userName` değerinin istediğiniz gibi `userPrincipalName` veya `mail` değerine eşlendiğini doğrulayın.
6. **Provisioning Status**'u **On** olarak ayarlayın ve kaydedin.
Azure, kullanıcıları ve grupları sabit bir senkronizasyon döngüsünde sağlar (genellikle her 40 dakikada bir).
## Keşif uç noktaları {#discovery-endpoints}
Bu üç uç nokta kimlik doğrulama olmadan kullanılabilir ve SCIM sunucusunun yeteneklerini tanımlar:
| Uç nokta | Açıklama |
|---|---|
| `GET /api/v1/scim/v2/ServiceProviderConfig` | Sunucu yetenekleri ve desteklenen özellikler |
| `GET /api/v1/scim/v2/Schemas` | User ve Group şema tanımları |
| `GET /api/v1/scim/v2/ResourceTypes` | Kullanılabilir kaynak türleri (User, Group) |
`ServiceProviderConfig` şu yetenekleri duyurur:
| Özellik | Destekleniyor |
|---|---|
| Patch | Evet |
| Bulk | Hayır |
| Filter | Evet (en fazla 200 sonuç, yalnızca `eq` operatörü) |
| Change password | Hayır |
| Sort | Hayır |
| ETag | Hayır |
## Sınırlamalar {#limitations}
- **Filtreleme**: Yalnızca `eq` operatörü desteklenir. Karmaşık filtreler, `and`/`or` operatörleri, `co` (içerir) ve `sw` (ile başlar) uygulanmamıştır.
- **Toplu işlemler**: Desteklenmez.
- **Sort ve ETag**: Desteklenmez.
- **Roller**: SCIM, SnapOtter rolleri atayamaz. Sağlanan tüm kullanıcılar `user` rolünü alır.
- **MAX_USERS**: `MAX_USERS` ortam değişkeni sınırı SCIM kullanıcı oluşturmada uygulanmaz. Kullanıcı sayılarını sınırlamanız gerekiyorsa atamaları IdP'nizde yönetin.
- **Tek token**: Aynı anda yalnızca bir SCIM token etkin olabilir. Birden fazla IdP'nin SCIM erişimine ihtiyacı varsa token'ı paylaşmaları gerekir.
- **Gruplar team'lerdir**: SCIM Grupları rollere veya izin gruplarına değil, team'lere karşılık gelir.
## Sorun giderme {#troubleshooting}
### 403 "SCIM provisioning requires an enterprise license with the scim feature" {#_403-scim-provisioning-requires-an-enterprise-license-with-the-scim-feature}
Lisansınız `scim` özelliğini içermiyor veya yapılandırılmış bir lisans yok. SCIM, bir enterprise plan lisansı gerektirir. `SNAPOTTER_LICENSE_KEY` değerinin ayarlandığını ve lisansın `scim` özelliğini içerdiğini doğrulayın.
### 401 "Bearer token required" {#_401-bearer-token-required}
SCIM isteği bir `Authorization: Bearer <token>` başlığı içermiyordu. IdP'nizin sağlama yapılandırmasını kontrol edin.
### 401 "Invalid token" {#_401-invalid-token}
Belirteç hatalı biçimlendirilmiş, kullanımdan kaldırılmış sürümsüz biçimi kullanıyor veya depolanan karma ile eşleşmiyor. Geçerli bir `so_scim_v2_...` belirteci oluşturun ve belirteci IdP'nizin sağlama ayarlarınızda güncelleyin.
### 401 "SCIM not configured" {#_401-scim-not-configured}
Henüz bir SCIM token oluşturulmadı. Bir tane oluşturmak için `POST /api/v1/enterprise/scim/token` uç noktasını kullanın.
### 409 "User already exists" / "userName already taken" {#_409-user-already-exists-username-already-taken}
Aynı kullanıcı adına sahip bir kullanıcı zaten var. Bu, bir IdP başarısız bir oluşturmayı yeniden denediğinde olabilir. SnapOtter admin panelinde yinelenen kullanıcı adlarını kontrol edin.
### 429 "SCIM rate limit exceeded" {#_429-scim-rate-limit-exceeded}
IdP dakikada 1000'den fazla istek gönderiyor. Bu genellikle büyük bir ilk senkronizasyon sırasında olur. Çoğu IdP, hız sınırı penceresi sıfırlandıktan sonra otomatik olarak yeniden dener. Sorun devam ederse IdP'nizin sağlama senkronizasyon aralığını kontrol edin.
### Kullanıcılar sağlaması kaldırıldı ancak arayüzden kaldırılmadı {#users-deprovisioned-but-not-removed-from-the-ui}
SCIM DELETE bir yumuşak devre dışı bırakmadır. Devre dışı bırakılan kullanıcılar admin kullanıcı listesinde devre dışı durumla görünmeye devam eder. Bu, verilerinin korunması için tasarım gereğidir. Rolleri `disabled:<original-role>` olarak görünür.