JavaScript tarayıcı SDK'sı
@keenauth/js, KeenAuth'un tarayıcı çekirdeğidir. Kullanıcıları tek sayfalık uygulamanıza giriş yaptırır, belirteçlerini saklar ve API'nizi çağırır. Çalışma zamanı bağımlılığı yoktur ve React bileşenleri bunun üzerine kuruludur. Paket henüz npm'de yayımlanmamıştır.
Yönlendirme ile giriş yap
SDK, standart bir OpenID Connect genel istemcisidir:
- PKCE (S256) kullanır ve DPoP'a bağlı belirteçler kullanır.
- Geri çağırmada
state,nonceveissdeğerlerini kontrol eder. - ID belirtecinin imzasını ve taleplerini ortamınızın anahtarlarına karşı doğrular.
import { KeenAuth } from "@keenauth/js";
const auth = new KeenAuth({
issuer: "https://acme.eu.keenauth.app", // your environment's issuer, exactly
clientId: "app_01j9zzzzzzzzzzzzzzzzzzzz",
redirectUri: "https://app.acme.example/callback",
postLogoutRedirectUri: "https://app.acme.example/",
});
// On your sign-in button:
await auth.signInRedirect({ appState: "/orders" });
// On https://app.acme.example/callback:
const { appState } = await auth.handleRedirectCallback();
handleRedirectCallback bir yanıtı yalnızca bir kez kabul eder. Şu durumlarda KeenAuthError ile başarısız olur:
stateveyaisseşleşmez;- bekleyen giriş 10 dakikadan eskidir;
- ID belirteci geçerli değildir.
Sunucunun geri gönderdiği bir hata, OAuth error kodunu taşıyan bir KeenAuthOAuthError olarak yükseltilir.
API'nizi çağırın
API'niz için bir erişim belirteci almak üzere, API tanımlayıcısını resource olarak geçin (RFC 8707). Bu değer yetkilendirme isteğinde, kod değişiminde ve her yenilemede gönderilir; belirtecin aud değeri bu tanımlayıcıdır:
const auth = new KeenAuth({
issuer: "https://acme.eu.keenauth.app",
clientId: "app_01j9zzzzzzzzzzzzzzzzzzzz",
redirectUri: "https://app.acme.example/callback",
resource: "https://api.acme.example", // your API's identifier
scope: "openid profile email offline_access messages:read",
});
- Değer, parça (
#) içermeyen mutlak bir URI olmalıdır. Olduğu gibi gönderilir; bu nedenle API tanımlayıcısını kayıtlı haliyle kullanın. Geçersiz bir değer, yapıcıdanconfig_invalidkoduyla birKeenAuthErrorfırlatır. signInRedirect({ resource })tek bir giriş için bunu geçersiz kılar.resourceolmadan, uygulama için bir varsayılan API ayarlanmışsa sunucu onu kullanır; aksi halde hiçbir API kapsamı verilmez.- Seçenek bir dizi de kabul eder; RFC 8707'nin izin verdiği şekilde tekrarlanan
resourceparametreleri olarak gönderilir. KeenAuth erişim belirtecinin tam olarak bir hedef kitlesi (audience) vardır; bu nedenle sunucu birden fazla değeriinvalid_targetile reddeder (bu birKeenAuthOAuthError'dır).
const res = await auth.authorizedFetch("https://api.acme.example/v1/orders");
// Or take the token yourself; it is refreshed when it is about to expire.
const token = await auth.getAccessToken();
authorizedFetch, belirtece bağlı taze bir kanıtla Authorization: DPoP gönderir. Sunucu bir DPoP nonce isterse, o nonce ile bir kez yeniden dener. Eşzamanlı çağrılar tek bir yenileme isteğini paylaşır ve her yenileme yenileme belirtecini döndürür. Bu belirteçleri API'nizde doğrulamak için bkz. API'nizde belirteçleri doğrulama.
Çıkış yap
await auth.signOut();
signOut belirteçleri siler ve yenileme belirtecini iptal eder. Ardından tarayıcıyı ortamınızın çıkış uç noktasına yönlendirir; bu uç nokta da onu postLogoutRedirectUri adresine geri döndürür.
Belirteçlerin tutulduğu yer
- Erişim, yenileme ve ID belirteçleri yalnızca bellekte tutulur; localStorage, sessionStorage, IndexedDB, çerezler veya URL'de hiçbir zaman tutulmaz. Sayfa yenilendikten sonra kullanıcı yönlendirme ile yeniden giriş yapar; SDK oturumu geri yüklemez.
- sessionStorage yalnızca devam eden bir girişin tek kullanımlık değerlerini tutar.
- DPoP anahtarı, varsayılan olarak bellekte tutulan dışa aktarılamayan bir WebCrypto anahtarıdır.
Gömülü giriş
Aynı nesne, gömülü bileşenlere bir ön yüz API istemcisi de sağlar:
- giriş adımları için
transactions; - hesabın profili ve
user_metadata, e-postalar (kod doğrulamalı), passkey'ler ve oturumlar içinme; - passkey işlemleri için
webauthn.
Bu çağrılar ortamınızın çerezlerini ve bir CSRF üstbilgisini kullanır. Sunucu bunları yalnızca ortamın kendi giriş kaynağından kabul eder.
Yönlendirme olmadan giriş yap
Giriş kaynağınızın dışındaki bir sayfada, işlemi clientId'nizle başlatın. SDK bunu çerezler yerine kendi DPoP anahtarına bağlar:
let tx = await auth.transactions.create({ client_id: "app_01j9...", organization: "acme" });
tx = await auth.transactions.step("identifier", { identifier: "ada@acme.example" });
tx = await auth.transactions.step("password", { password });
if (tx.state === "completed") await auth.complete(tx); // { kind: "signed_in" }
- Uygulama birinci taraf bir uygulama olmalı ve sayfa kaynağı, izin verilen web kaynaklarından biri olmalıdır.
- Her çağrı bir DPoP kanıtı taşır ve çerez taşımaz. Sunucu bir DPoP nonce isterse SDK o nonce ile bir kez yeniden dener.
- SDK PKCE doğrulayıcısını,
statevenoncedeğerlerini kendisi oluşturur ve bellekte tutar.scopeveresourceseçeneklerden gelir;create'eorganizationveuiLocalesgeçebilirsiniz. Burada tek birresourcedeğeri kullanın. completeyanıtı kontrol eder, yetkilendirme kodunu aynı DPoP anahtarıyla değiştirir ve belirteçleri bellekte tutar. Sayfa yönlendirilmez ve kod hiçbir zaman kodunuza döndürülmez.- Her
stepçağrısı,client_idile veya onsuz, tarayıcının saat diliminiIdp-Zoneinfoüstbilgisinde gönderir. Adım girişi tamamladığında ve kullanıcı bir saat dilimi seçmediyse KeenAuth bunu, barındırılan giriş sayfasının yaptığı gibi profilinzoneinfoalanına kaydeder. Tarayıcı kullanılabilir bir bölge bildirmezse üstbilgi eklenmez ve adım değişmez. - Giriş, kullanıcının görmesi gereken bir sayfaya ihtiyaç duyarsa (onay, yasal şartlar, kuruluş seçimi), son adım
authorization_failedkodlu birKeenAuthProblemErrorile başarısız olur. Bu kullanıcı içinsignInRedirectkullanın.
Kendi kaynağınızdan hesap çağrıları
Kullanıcı giriş yaptıktan ve SDK bir yenileme belirteci tuttuktan sonra (varsayılan kapsam offline_access ister), me ve organizations çağrıları artık giriş sunucusunun oturum çerezine ihtiyaç duymaz:
- SDK,
resource=<issuer>/fapiile yenileme yapar ve ön yüz API'si için kısa ömürlü bir erişim belirteci alır. Bu belirteç DPoP'a bağlıdır ve diğer belirteçler gibi yalnızca bellekte tutulur. - Her hesap çağrısı
Authorization: DPoP <token>ve o çağrıya ait bir DPoP kanıtı gönderir; çerez göndermez. Sunucu bir DPoP nonce isterse SDK o nonce ile bir kez yeniden dener; belirteç artık geçerli değilse yeni bir tane alır ve bir kez daha dener. - Yenileme belirteci her yenilemede döner; bu yüzden SDK yenilemeleri birbiri ardına çalıştırır.
- Bu yalnızca, izin verilen web kaynakları arasında sayfanızın kaynağı bulunan birinci taraf bir uygulama için çalışır.
- Belirteç yoksa SDK, daha önce olduğu gibi oturum çerezini kullanır.
Sunucu kuralları için bkz. Ön yüz API erişim belirteci.
Kuruluşu değiştirme
organizations.switch(orgId), giriş yapmış kullanıcıyı sayfa yenilemeden başka bir kuruluşa taşır. organizations.listMine() çıktısından bir kuruluşun org_… kimliğini geçin:
const { data } = await auth.organizations.listMine();
await auth.organizations.switch(data[1].id);
- Yukarıdaki hesap çağrılarıyla aynı gereksinimlere ihtiyaç duyar: bir yenileme belirteci,
redirectUrive sayfanızın kaynağının izin verilen web kaynakları arasında bulunduğu birinci taraf bir uygulama. - SDK, ön yüz API belirteciyle bir geçiş isteği gönderir, kodu aynı anahtarın kanıtıyla değiştirir ve
org_iddeğeri kuruluş olan yeni belirteçleri tutar. Sahip olduğunuz belirteçler, bunların tümü başarılı olana kadar kalır. - Kuruluş, kullanıcının görmesi gereken bir sayfa (MFA, SSO, onay) gerektiriyorsa çağrı
authorization_failedkodlu birKeenAuthProblemErrorile başarısız olur. Bu kullanıcı içinsignInRedirect({ organization })kullanın.
Bugünkü sınırlar
- Profil yazmaları (
me.update,me.updateMetadata), son profil okuma veya yazmanınETagdeğeriyleIf-Matchgönderir. Profil bu arada başka bir yerde değiştiyse, yazmaprecondition_failedkodlu birKeenAuthProblemErrorile başarısız olur; yeniden denemeden önceme.get()çağırın. - Telefon numaraları henüz kullanılamıyor:
me.phonesdeğeriundefined'dır.