Aracılığıyla paylaş


Özel JWT kimlik doğrulamasını yapılandırma (Okta, Auth0)

Veri API oluşturucusu, Özel kimlik doğrulama sağlayıcısı aracılığıyla üçüncü taraf kimlik sağlayıcılarını destekler. Kuruluşunuz Okta, Auth0 veya başka bir OAuth 2.0/OpenID Connect uyumlu kimlik sağlayıcısı kullanıyorsa bu yaklaşımı kullanın.

Kimlik doğrulama akışı

Özel bir kimlik sağlayıcısıyla istemci uygulamanız kullanıcı kimlik doğrulamasını işler ve ardından erişim belirtecini Veri API'sinin oluşturucusna gönderir:

Üçüncü taraf kimlik sağlayıcısıyla özel JWT kimlik doğrulama akışının çizimi.

Phase Ne olur?
Kullanıcı kimlik doğrulaması Kullanıcı kimlik sağlayıcısı aracılığıyla oturum açar (Okta, Auth0 vb.)
Jeton edinimi İstemci uygulaması IdP'den erişim belirteci alır
API çağrısı İstemci, belirteci üst bilgi başlığındaki Authorization DAB'ye gönderir.
Doğrulama DAB, JWT'yi (veren, hedef kitle, imza) doğrular
Authorization DAB rolleri ayıklar ve izinleri değerlendirir

Önkoşullar

  • Kimlik sağlayıcınızla bir hesap (Okta, Auth0 vb.)
  • Kimlik sağlayıcınıza kayıtlı bir uygulama
  • Data API builder CLI yüklü (yükleme kılavuzu)
  • En az bir varlığa sahip mevcut dab-config.json

Hızlı referans

Setting Değer
Provider Custom
Doğrulama için gerekli iss, aud, exp, geçerli imza
Yetkilendirme için gerekli roles seçilen rolü içeren talep
Token üst bilgisi Authorization: Bearer <token>
Rol talep türü roles (düzeltildi, yapılandırılamaz)
Rol seçimi başlığı X-MS-API-ROLE

1. Adım: Kimlik sağlayıcınızı yapılandırma

Tam adımlar sağlayıcınıza bağlıdır. İhtiyacınız olan temel değerler şunlardır:

Toplayacak değerler

Değer Nerede bulunur? Kullanım amacı
İssuer URL Sağlayıcının belgeleri veya OAuth meta veri uç noktası DAB jwt.issuer (JWT Yetkilisi olarak kullanılır)
Seyirci Uygulamanızın istemci kimliği veya özel API tanımlayıcısı DAB jwt.audience

Uyarı

DAB, JWT jwt.issuer olarak yapılandırılan öğesini kullanır. İmzalama anahtarları standart OpenID Connect meta verileri (genellikle <issuer>/.well-known/openid-configuration) aracılığıyla otomatik olarak bulunur.

Okta örneği

  1. Okta Yönetim Konsolu'nda oturum açın.
  2. Uygulamalar>Uygulamaları'na gidin.
  3. Bir uygulama oluşturun veya seçin.
  4. İstemci Kimliğini not edin (hedef kitle olarak kullanın).
  5. Vereniniz genellikle https://<your-domain>.okta.com olur.

Auth0 örneği

  1. Auth0 Panosu'nda oturum açın.
  2. Uygulamalar>API'lerine gidin.
  3. API oluşturun veya seçin.
  4. Tanımlayıcıyı not edin (hedef kitle olarak kullanın).
  5. Vereniniz şeklindedir https://<your-tenant>.auth0.com/.

Önemli

Veri API oluşturucusu, rol tabanlı yetkilendirme için sabit talep türü roles kullanır. Bu değer yapılandırılamaz. Kimlik sağlayıcınız farklı bir talepte (örneğin groups veya permissions) roller yayınlıyorsa, sağlayıcınızı aynı zamanda bir roles talebi de yayınlayacak şekilde yapılandırmanız veya bir roles talebine değerleri kopyalamak için oturum açma sonrası bir eylem kullanmanız gerekir.

2. Adım: Veri API'si oluşturucusunu yapılandırma

Kimlik doğrulama sağlayıcısını Custom olarak ayarlayın ve JWT ayarlarını yapılandırın:

CLI

# Set the authentication provider
dab configure \
  --runtime.host.authentication.provider Custom

# Set the expected audience
dab configure \
  --runtime.host.authentication.jwt.audience "<your-api-identifier>"

# Set the expected issuer
dab configure \
  --runtime.host.authentication.jwt.issuer "https://<your-issuer>/"

Sonuçta elde edilen yapılandırma

{
  "runtime": {
    "host": {
      "authentication": {
        "provider": "Custom",
        "jwt": {
          "audience": "<your-api-identifier>",
          "issuer": "https://<your-issuer>/"
        }
      }
    }
  }
}

3. Adım: Varlık izinlerini yapılandırma

Kimlik sağlayıcınızın atadığına ilişkin roller için izinleri tanımlayın:

CLI

# Allow authenticated users to read
dab update Book \
  --permissions "authenticated:read"

# Allow users with 'admin' role full access
dab update Book \
  --permissions "admin:*"

Sonuçta elde edilen yapılandırma

{
  "entities": {
    "Book": {
      "source": "dbo.Books",
      "permissions": [
        {
          "role": "authenticated",
          "actions": ["read"]
        },
        {
          "role": "admin",
          "actions": ["*"]
        }
      ]
    }
  }
}

4. Adım: Kimlik sağlayıcınızdaki rolleri yapılandırma

DAB, bir roles talepteki rolleri önemser. Kimlik sağlayıcınızı bu talebi içerecek şekilde yapılandırın.

Okta: Grupları rol olarak ekleme

  1. Okta Yönetim Konsolu'nda Güvenlik>API'sine gidin.
  2. Yetkilendirme sunucunuzu seçin.
  3. Talepler sekmesine gidin.
  4. Talep ekleyin:
    • İsim: roles
    • Belirteç türüne ekle: Erişim Belirteci
    • Değer türü: Gruplar
    • Filtre: Eklenecek grupları seçin

Auth0: Eylem ile rol ekleme

  1. Auth0 Pano'da Eylemler>Kitaplık bölümüne gidin.
  2. Yeni bir Eylem oluşturun (Oturum Açma Sonrası tetikleyicisi).
  3. Rolleri eklemek için kod ekleyin:
exports.onExecutePostLogin = async (event, api) => {
  const roles = event.authorization?.roles || [];
  if (roles.length > 0) {
    api.accessToken.setCustomClaim('roles', roles);
  }
};
  1. Eylemi dağıtın ve Oturum Açma akışınıza ekleyin.

Tip

Okta ile JWT taleplerini yapılandırma hakkında ayrıntılı yönergeler için bkz. Okta'nın SDK'sı ile Gelişmiş JWT Talepleri Uygulama.

5. Adım: Yapılandırmayı test edin

  1. Veri API'si oluşturucusunu başlatma:

    dab start
    
  2. Kimlik sağlayıcınızdan bir belirteç alın. Sağlayıcınızın SDK'sını veya Postman gibi bir aracı kullanın.

  3. Doğrulamak için jwt.io belirteci inceleyin:

    • İddia aud yapılandırılmış hedef kitlenizle uyuşuyor.
    • Talep, iss yapılandırılan vereninizle eşleşir
    • Talep roles beklenen değerleri içerir
  4. API'yi çağırın:

    curl -X GET "http://localhost:5000/api/Book" \
      -H "Authorization: Bearer <your-token>"
    
  5. Özel rol kullanmak için X-MS-API-ROLE üst bilgisini ekleyin.

    curl -X GET "http://localhost:5000/api/Book" \
      -H "Authorization: Bearer <your-token>" \
      -H "X-MS-API-ROLE: admin"
    

JWT doğrulama ayrıntıları

Veri API'sinin oluşturucusu, JWT'nin şu yönlerini doğrular:

Kontrol Description
İmza Yapılandırılmış jwt.issuer otorite (OpenID Connect meta verileri / JWKS) aracılığıyla keşfedilen imzalama anahtarları kullanılarak doğrulandı.
İhraç Eden Yapılandırmayla tam olarak eşleşmelidir jwt.issuer
Seyirci jwt.audience yapılandırmayla tam olarak eşleşmelidir.
Bitiş tarihi Jeton süresi dolmamalıdır (exp talep)
Daha Önce Değil Belirteç, eğer mevcutsa (nbf iddiası), geçerli olmalıdır.

Sorun giderme

Semptom Olası nedeni Çözüm
401 Unauthorized İhraççı uyuşmazlığı İddianın tam olarak eşleştiğini kontrol edin (sondaki eğik çizgi dahil)
401 Unauthorized hedef kitle uyuşmazlığı Talebin aud yapılandırılan değerinizle eşleşir olup olmadığını denetleyin
401 Unauthorized Belirtecin süresi doldu Yeni bir belirteç edinin
401 Unauthorized Meta veriler kullanılamıyor DAB'in ulaşabildiğinden emin olun <issuer>/.well-known/openid-configuration
403 Forbidden Rol belirteçte değil Rolü IdP yapılandırmanıza ekleme
403 Forbidden Rol talebi eksikliği IdP'nizi bir roles talebi içerecek şekilde yapılandırın
403 Forbidden Yanlış talep adı DAB talep türünü roles kullanır (düzeltildi, yapılandırılamaz)

Önemli

DAB şu anda tüm rol denetimleri için talep türünü roles kullanır. Bu değer sabit kodlanmıştır ve groups, permissions veya diğer talep adları olarak değiştirilemez. Kimlik sağlayıcınızı roles adlı bir talepteki rolleri yaymak için yapılandırın.

Yaygın veren biçimleri

Provider Veren biçimi
Okta https://<domain>.okta.com veya https://<domain>.okta.com/oauth2/default
Kimlik Doğrulaması0 https://<tenant>.auth0.com/ (sondaki eğik çizgiyi not edin)
Azure AD B2C https://<tenant>.b2clogin.com/<tenant-id>/v2.0/
Keycloak https://<host>/realms/<realm>

Yapılandırmayı tamamlama örneği

Okta yapılandırması

{
  "$schema": "https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json",
  "data-source": {
    "database-type": "mssql",
    "connection-string": "@env('SQL_CONNECTION_STRING')"
  },
  "runtime": {
    "host": {
      "authentication": {
        "provider": "Custom",
        "jwt": {
          "audience": "0oa1234567890abcdef",
          "issuer": "https://dev-12345.okta.com"
        }
      }
    }
  },
  "entities": {
    "Book": {
      "source": "dbo.Books",
      "permissions": [
        {
          "role": "authenticated",
          "actions": ["read"]
        },
        {
          "role": "editor",
          "actions": ["create", "read", "update"]
        }
      ]
    }
  }
}

Auth0 yapılandırması

{
  "$schema": "https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json",
  "data-source": {
    "database-type": "mssql",
    "connection-string": "@env('SQL_CONNECTION_STRING')"
  },
  "runtime": {
    "host": {
      "authentication": {
        "provider": "Custom",
        "jwt": {
          "audience": "https://my-api.example.com",
          "issuer": "https://my-tenant.auth0.com/"
        }
      }
    }
  },
  "entities": {
    "Book": {
      "source": "dbo.Books",
      "permissions": [
        {
          "role": "authenticated",
          "actions": ["read"]
        },
        {
          "role": "admin",
          "actions": ["*"]
        }
      ]
    }
  }
}