Przejdź do treści

Szybki start

Załóż aplikację, podłącz SDK przeglądarkowe i zaloguj się po raz pierwszy — w całości w sandboksie.

Na końcu tej strony przeglądarka zaloguje się do Twojej własnej aplikacji i przekaże Twojemu kodowi token dostępu. Wszystko dzieje się w sandboksie, gdzie użytkowników możesz kasować bez żalu.

1. Załóż aplikację

Zaloguj się do konsoli. Konto bez żadnej aplikacji wita kreator w trzech krokach, którego drugi krok to formularz tworzenia; jeśli masz już jakąś aplikację, kolejną zakładasz przyciskiem Utwórz aplikację na liście Aplikacje.

Z nazwy powstaje slug, a ze sluga dwa stałe adresy:

ŚrodowiskoAdres
Produkcjahttps://acme.kleora.eu
Sandboxhttps://acme.sandbox.kleora.eu

To są adresy wydawcy (issuer) tej aplikacji. Sluga nie da się później zmienić: to on stoi w polu iss każdego wydanego tokenu i to jego zapamiętała każda usługa, która kiedykolwiek sprawdziła Twój token. Wybierz go tak uważnie jak domenę.

Po zakończeniu kreatora trafiasz na przegląd środowiska sandbox — a tam są trzy wartości potrzebne na dalszej części tej strony: issuer, identyfikator domyślnego klienta i adres dokumentu discovery.

2. Zarejestruj adresy powrotne

Wejdź w Integracja → Klienci i otwórz klienta o nazwie Default. Jest to klient typu spa, tworzony razem z aplikacją, i nie ma ani jednego adresu powrotnego. Dopóki go nie dodasz, endpoint autoryzacyjny nie ma dokąd odesłać przeglądarki.

Dodaj dwa, których użyje Twój serwer deweloperski:

PoleWartość
Redirect URIhttp://localhost:5173/callback
Post-logout redirect URIhttp://localhost:5173/

Oba są porównywane dokładnie. Ukośnik na końcu, inny port albo dodatkowy parametr w query to z punktu widzenia endpointu autoryzacyjnego zupełnie inny adres.

3. Zainstaluj SDK przeglądarkowe

npm install @kleora-io/browser

Paczka nie ma zależności w czasie działania i jest publikowana wyłącznie jako moduły ES. Pozostałe cztery opisuje Instalacja SDK.

4. Zaloguj się

Do klienta trafiają trzy wartości: issuer i identyfikator klienta ze strony przeglądu oraz redirect URI zarejestrowany przed chwilą.

import { createKleora } from '@kleora-io/browser'

const kleora = createKleora({
  issuer: 'https://acme.sandbox.kleora.eu',
  clientId: '<client_id>',
  redirectUri: location.origin + '/callback',
})

if (location.pathname === '/callback') {
  await kleora.handleRedirectCallback()
} else if (!(await kleora.checkSession())) {
  await kleora.loginWithRedirect()
}

const user = kleora.getUser()
const token = await kleora.getAccessToken()

Uruchom. Przeglądarka wychodzi na hostowaną stronę logowania Twojej aplikacji, gdzie możesz od razu założyć pierwszego użytkownika — samodzielna rejestracja jest w nowym środowisku włączona — i wraca na /callback z kodem autoryzacyjnym. handleRedirectCallback() wymienia go na tokeny, sprawdza ID token, zapisuje wynik i usuwa kod z paska adresu.

Wylogowanie to jedno wywołanie, a returnTo musi być jednym z zarejestrowanych adresów po wylogowaniu:

await kleora.logout({ returnTo: location.origin + '/' })

5. Sprawdź token w swoim API

Token dostępu to podpisany JWT. Twoje API sprawdza go względem zestawu kluczy publikowanego przez Twój issuer — bez odpytywania nas i bez współdzielonego sekretu.

import { authenticate } from '@kleora-io/node'

const claims = await authenticate(request, {
  issuer: 'https://acme.sandbox.kleora.eu',
  audience: '<client_id>',
})

console.log(claims.sub, claims.tenant, claims.permissions)

authenticate przyjmuje cokolwiek, co ma własność headers.authorization, więc zadziała z dowolnym frameworkiem w Node; @kleora-io/node dostarcza też middleware dla Express i Fastify. claims.roles i claims.permissions są już w tokenie, więc autoryzacja żądania kosztuje tyle, co sprawdzenie elementu na liście.

Co SDK robi za Ciebie

WywołanieCzym się zajmuje
loginWithRedirect()Generuje state, nonce i weryfikator PKCE, po czym przechodzi na endpoint autoryzacyjny.
handleRedirectCallback()Sprawdza state i iss, wymienia kod, weryfikuje ID token, zapisuje tokeny, czyści adres.
getAccessToken()Oddaje token z pamięci, dopóki do jego wygaśnięcia zostało więcej niż 30 sekund; potem odświeża. Tokeny odświeżania rotują przy każdym użyciu.
checkSession()Odtwarza sesję przy wczytaniu strony, po cichu, bez pokazywania logowania od nowa.
logout({ returnTo })Czyści stan lokalny i kończy sesję u wydawcy.
onAuthChange(cb)Odpala się przy zalogowaniu, wylogowaniu i odświeżeniu tokenu. Zwraca funkcję odsubskrybowania.

Gdzie leżą tokeny

Domyślnie oba tokeny są trzymane w pamięci, w domknięciu. Nic nie przeżywa przeładowania strony — i właśnie dlatego przy wczytaniu wywołuje się checkSession(). Opcja storage: 'session' dodatkowo odkłada token odświeżania w sessionStorage, który należy do jednej karty i znika razem z nią.

localStorage nie jest opcją i nie będzie. Trwa w nieskończoność, dzielą go wszystkie karty tego samego origin i czyta go każdy skrypt, jaki się tam kiedykolwiek wykona — w tym ten, który jutro przyjedzie w zależności wdrożonej dziś.

Dalej

  • Instalacja SDK — Nuxt, Node, Python i Django.
  • TOTP, zaproszenia do przestrzeni roboczych czy oznaczenie strony logowania własną marką włączysz z konsoli; żadna z tych rzeczy nie zmienia kodu powyżej.