Instalacja SDK
Pięć paczek, które publikujemy, do czego służy każda z nich i jakiej konfiguracji wymaga.
Pięć paczek, wszystkie na licencji Apache-2.0 i wszystkie opcjonalne: Kleora jest dostawcą OAuth 2.1 i OpenID Connect, więc dowolna biblioteka kliencka zadziała z nią tak samo.
| Paczka | Do czego służy | Wymaga |
|---|---|---|
@kleora-io/browser | Logowanie z aplikacji jednostronicowej. | Node 22+ do zbudowania; aktualne przeglądarki |
@kleora-io/nuxt | To samo, w postaci modułu Nuxta. | Nuxt 4, Node 22+ |
@kleora-io/node | Sprawdzanie tokenów dostępu w API na Node i wywołania API zarządzania. | Node 20+ |
kleora | To samo w Pythonie. | Python 3.12+ |
django-kleora | Integracja z Django, zbudowana na kleora. | Python 3.12+ |
@kleora-io/browser
Klient kodu autoryzacyjnego z PKCE. Bez zależności w czasie działania, wyłącznie moduły ES.
npm install @kleora-io/browser
createKleora() przyjmuje trzy opcje obowiązkowe i cztery opcjonalne:
| Opcja | Domyślnie | Znaczenie |
|---|---|---|
issuer | — | Adres środowiska, np. https://acme.kleora.eu. Ukośnik na końcu jest normalizowany. |
clientId | — | client_id klienta. Musi to być klient typu spa. |
redirectUri | — | Jeden z zarejestrowanych adresów powrotnych tego klienta, porównywany dokładnie. |
scope | openid profile email offline_access | Bez offline_access nie dostaniesz tokenu odświeżania, więc tokenu dostępu nie da się po cichu odnowić. |
audience | — | Audience API środowiska, o ile zostało ustawione. |
tenant | — | Przypina każde logowanie do jednej przestrzeni roboczej (po slugu). |
storage | memory | memory albo session. Nigdy localStorage. |
Działającą stronę od początku do końca pokazuje szybki start.
@kleora-io/nuxt
Moduł do Nuxta 4 opakowujący SDK przeglądarkowe: automatycznie importowane
composable, strażnik trasy, strona callbacku i instancja $fetch z tokenem.
npm install @kleora-io/nuxt
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@kleora-io/nuxt'],
kleora: { issuer: '<issuer>', clientId: '<client_id>' },
})
W tej konfiguracji nie ma redirectUri, bo moduł domyślnie kieruje na własną
stronę callbacku pod adresem tej samej witryny — /auth/callback. Ten adres i
tak trzeba zarejestrować na kliencie.
Co daje moduł:
| Eksport | Czym jest |
|---|---|
useKleora() | { client, user, isAuthenticated, isLoading, hasLikelySession, login, logout, getAccessToken, restore, settle }. |
useKleoraUser() | Ref z zalogowanym użytkownikiem albo null. |
useKleoraApi(), $kleoraApi | Instancja $fetch z adresem bazowym Twojego API i tokenem w każdym żądaniu. |
middleware kleora-auth | Rejestrowany globalnie, działa tylko na stronach z definePageMeta({ auth: true }). |
/auth/callback | Strona dodawana przez moduł: kończy logowanie i wraca na stronę, z której się zaczęło. |
Każdą opcję można podać ze środowiska zamiast w pliku konfiguracyjnym:
NUXT_PUBLIC_KLEORA_ISSUER, …_CLIENT_ID, …_REDIRECT_URI, …_SCOPE,
…_AUDIENCE, …_TENANT, …_STORAGE oraz NUXT_PUBLIC_API_BASE dla adresu
API. Jedynym wyjątkiem jest callbackPath — decyduje, pod jakim adresem
montuje się strona callbacku, więc ustala się go na etapie budowania.
@kleora-io/node
Sprawdzanie tokenów dostępu z cache'em JWKS, middleware dla Express i Fastify oraz typowany klient API zarządzania. Jedyna zależność w czasie działania to biblioteka JOSE; Express i Fastify są opcjonalnymi peer dependencies.
npm install @kleora-io/node
Weryfikacja nie zależy od frameworka — authenticate() przyjmuje cokolwiek, co
ma własność headers.authorization, a verifyAccessToken() sam token jako
tekst. Obie funkcje zwracają claimy tokenu: sub, tenant, roles,
permissions, scope, env i resztę.
kleora (Python)
Ta sama weryfikacja w Pythonie, a do tego klient API zarządzania w wersji synchronicznej i asynchronicznej.
pip install kleora
import { verifyAccessToken } from '@kleora-io/node'
const claims = await verifyAccessToken(token, {
issuer: 'https://acme.sandbox.kleora.eu',
audience: '<client_id>',
})
Obie pobierają zestaw kluczy Twojego środowiska raz, trzymają go tak długo, jak mówi odpowiedź, i odmawiają weryfikacji, gdy stanie się nieosiągalny. Żadna z nich nie czyta zmiennych środowiskowych: issuer, audience i ewentualny klucz API podajesz samodzielnie.
django-kleora
Klasa uwierzytelniania dla django-ninja, middleware, dekorator uprawnień i
słownik ustawień KLEORA, zbudowane na kleora, którą paczka instaluje za
Ciebie. Sama nie weryfikuje żadnego tokenu: pamięć podręczna zestawu kluczy i
błędy tokenów pochodzą z kleora.
pip install django-kleora
# settings.py
INSTALLED_APPS = [..., "django_kleora"]
MIDDLEWARE = [..., "django_kleora.KleoraAuthMiddleware"]
KLEORA = {
"ISSUER": "https://acme.sandbox.kleora.eu",
"AUDIENCE": "<client_id>",
}
from django_kleora import KleoraAuthentication, requires_permission
from ninja import NinjaAPI
api = NinjaAPI(auth=KleoraAuthentication())
@api.get("/invoices")
@requires_permission("invoices:read")
def invoices(request):
return {"tenant": request.kleora.tenant}
requires_permission odpowiada 401, gdy nie ma zweryfikowanego tokenu, 403,
gdy token nie ma uprawnienia, i 503, gdy nie udało się odczytać zestawu kluczy
issuera — to te same trzy odpowiedzi i te same dokumenty problemu, co w
middleware dla Node. Middleware służy widokom, których django-ninja nie widzi:
ustawia request.kleora i sam nigdy nie odrzuca żądania.
Zupełnie bez SDK
Hostowane strony i endpointy OAuth są standardowe. Wszystko, czego potrzebuje
dowolny klient OpenID Connect, stoi pod adresem
{issuer}/.well-known/openid-configuration, a zestaw kluczy, który tam jest
wskazany, weryfikuje token. Jedynym obsługiwanym przepływem przeglądarkowym jest
kod autoryzacyjny z PKCE; przepływu implicit ani hasłowego nie udostępniamy.