Přeskočit na hlavní obsah

Magic Link autentizace

Magic Link poskytuje autentizaci bez hesla prostřednictvím e-mailu. Uživatelé kliknou na bezpečný, časově omezený odkaz a přihlásí se bez zadávání hesla.

Jak to funguje

┌──────────┐         ┌──────────┐         ┌──────────┐         ┌──────────┐
│ Uživatel │ │ Vaše App │ │ Klubero │ │ E-mail │
│ │ │ │ │ SSO │ │ Server │
└────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │ │
│ 1. Zadá email │ │ │
│ ──────────────────►│ │ │
│ │ │ │
│ │ 2. Požádá o magic │ │
│ │ link │ │
│ │ ──────────────────►│ │
│ │ │ │
│ │ │ 3. Odešle email │
│ │ │ ──────────────────►│
│ │ │ │
│ 4. Obdrží email │ │ │
│ ◄───────────────────────────────────────────────────────────│
│ │ │ │
│ 5. Klikne na link │ │ │
│ ────────────────────────────────────────► │
│ │ │ │
│ 6. Přihlášen, redirect do aplikace │ │
│ ◄───────────────────────────────────────│ │

Endpoint: POST /api/magiclink/send

curl -X POST https://your-sso-domain.com/api/magiclink/send \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"returnUrl": "/connect/authorize?client_id=my-app&redirect_uri=https://myapp.com/callback&response_type=code&scope=openid%20profile%20email&state=xyz"
}'

Tělo požadavku:

PolePovinnéPopis
emailAnoE-mailová adresa uživatele
returnUrlNeOAuth autorizační URL pro pokračování po autentizaci

Odpověď:

{
"success": true,
"message": "If an account exists, a magic link has been sent."
}
Bezpečnostní poznámka

Odpověď je vždy úspěšná, aby se zabránilo útokům typu email enumeration. Uživatel obdrží e-mail pouze pokud jeho účet existuje.

Krok 2: Uživatel klikne na odkaz

E-mail obsahuje odkaz v tomto formátu:

https://your-sso-domain.com/Account/MagicLink?token=BASE64URL_TOKEN&ticket=ENCRYPTED_OAUTH_PARAMS

Krok 3: Dokončení autentizace

Když uživatel klikne na odkaz:

  1. Token je validován (existuje, nevypršel, nebyl použit)
  2. Uživatel je přihlášen pomocí cookie
  3. Pokud jsou přítomny OAuth parametry: Redirect na /connect/authorize (pokračuje normální flow)
  4. Pokud nejsou OAuth parametry: Redirect na uživatelský portál

Charakteristiky tokenu

VlastnostHodnota
Formát256-bitová náhodná hodnota, URL-safe Base64 kódování
Životnost15 minut
PoužitíPouze jednorázové (spotřebován při kliknutí)
UloženíSHA256 hash uložen v databázi

Validace tokenu (bez spotřebování)

Endpoint: GET /api/magiclink/validate

Ověření platnosti tokenu bez jeho spotřebování:

curl "https://your-sso-domain.com/api/magiclink/validate?token=TOKEN_VALUE"

Odpověď (platný):

{
"valid": true,
"email": "j***@example.com",
"expiresAt": "2024-01-01T12:15:00Z"
}

Odpověď (neplatný):

{
"valid": false,
"error": "TokenExpired"
}

Zrušení všech čekajících odkazů

Endpoint: POST /api/magiclink/revoke-all

Zrušení všech čekajících magic linků pro autentizovaného uživatele:

curl -X POST https://your-sso-domain.com/api/magiclink/revoke-all \
-H "Authorization: Bearer ACCESS_TOKEN"

Chybové kódy

Kód chybyPopisAkce uživatele
TokenNotFoundToken neexistujePožádejte o nový magic link
TokenExpiredToken vypršel (>15 minut)Požádejte o nový magic link
TokenAlreadyUsedToken byl již použitPožádejte o nový magic link
UserNotFoundUživatelský účet nenalezenKontaktujte podporu
UserNotActiveUživatelský účet deaktivovánKontaktujte podporu
UserLockedÚčet uzamčen (příliš mnoho neúspěšných pokusů)Počkejte nebo kontaktujte podporu
InvalidTokenFormatToken je poškozenýPožádejte o nový magic link

Integrace s OAuth flow

Pro integraci magic linku s vaším OAuth flow:

  1. Sestavte autorizační URL (stejně jako u normálního flow)
  2. Když uživatel požádá o magic link, zahrňte autorizační URL jako returnUrl
  3. Po kliknutí na odkaz uživatel automaticky pokračuje v OAuth flow

Příklad:

# Sestavení autorizační URL
AUTH_URL="/connect/authorize?client_id=my-app&redirect_uri=https://myapp.com/callback&response_type=code&scope=openid%20profile%20email&state=xyz"

# Požádání o magic link s returnUrl
curl -X POST https://your-sso-domain.com/api/magiclink/send \
-H "Content-Type: application/json" \
-d "{
\"email\": \"user@example.com\",
\"returnUrl\": \"$AUTH_URL\"
}"