Przejdź do treści

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.

PaczkaDo czego służyWymaga
@kleora-io/browserLogowanie z aplikacji jednostronicowej.Node 22+ do zbudowania; aktualne przeglądarki
@kleora-io/nuxtTo samo, w postaci modułu Nuxta.Nuxt 4, Node 22+
@kleora-io/nodeSprawdzanie tokenów dostępu w API na Node i wywołania API zarządzania.Node 20+
kleoraTo samo w Pythonie.Python 3.12+
django-kleoraIntegracja 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:

OpcjaDomyślnieZnaczenie
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.
scopeopenid profile email offline_accessBez 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).
storagememorymemory 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ł:

EksportCzym jest
useKleora(){ client, user, isAuthenticated, isLoading, hasLikelySession, login, logout, getAccessToken, restore, settle }.
useKleoraUser()Ref z zalogowanym użytkownikiem albo null.
useKleoraApi(), $kleoraApiInstancja $fetch z adresem bazowym Twojego API i tokenem w każdym żądaniu.
middleware kleora-authRejestrowany globalnie, działa tylko na stronach z definePageMeta({ auth: true }).
/auth/callbackStrona 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.