Rychlý start: jakákoli knihovna OIDC
Usher je standardní poskytovatel OpenID Connect. Pokud má váš jazyk certifikovaného klienta OIDC, máte už všechno, co potřebujete: nasměrujte ho na dokument discovery svého prostředí a použijte tok autorizačního kódu s PKCE.
Nastavení
| Nastavení | Hodnota |
|---|---|
| Vydavatel | https://<handle>.usherid.com |
| Adresa discovery | https://<handle>.usherid.com/.well-known/openid-configuration |
| Tok | Autorizační kód (response_type=code) |
| PKCE | Povinné, code_challenge_method=S256 |
| Rozsahy | openid profile email offline_access |
| Ověření klienta | Podle seznamu v token_endpoint_auth_methods_supported |
Označení svého prostředí najdete v Usher Console vedle jeho vydavatele. Vývojová prostředí dostanou náhodné, například wise-otter-42; produkční prostředí mají označení, které jste zvolili. Produkční prostředí může místo toho sídlit na vaší vlastní doméně, například login.acme.com: ta je pak jeho vydavatelem, jakmile doménu nasměrujete na Usher záznamem CNAME.
Přečtěte si dokument discovery
Je v něm každý koncový bod a klíč, který váš klient potřebuje. Nechte ho načíst svou knihovnu, místo abyste adresy URL kopírovali do kódu.
curl -s https://acme.usherid.com/.well-known/openid-configuration | jq{
"issuer": "https://acme.usherid.com",
"authorization_endpoint": "https://acme.usherid.com/api/auth/oauth2/authorize",
"token_endpoint": "https://acme.usherid.com/api/auth/oauth2/token",
"userinfo_endpoint": "https://acme.usherid.com/api/auth/oauth2/userinfo",
"jwks_uri": "https://acme.usherid.com/api/auth/jwks",
"introspection_endpoint": "https://acme.usherid.com/api/auth/oauth2/introspect",
"revocation_endpoint": "https://acme.usherid.com/api/auth/oauth2/revoke",
"end_session_endpoint": "https://acme.usherid.com/api/auth/oauth2/end-session",
"scopes_supported": ["openid", "profile", "email", "offline_access"],
"response_types_supported": ["code"],
"grant_types_supported": ["authorization_code", "refresh_token", "client_credentials"],
"code_challenge_methods_supported": ["S256"]
}Tok
Pošlete člověka na autorizační koncový bod
Vytvořte náhodný ověřovač PKCE a uložte ho spolu s náhodnou hodnotou state tam, kam se dostane jen relace tohoto prohlížeče (dobře poslouží krátkodobá cookie s příznakem httpOnly). Pak přesměrujte s response_type=code, svým client_id a redirect_uri, rozsahy výše, hodnotou state a výzvou code_challenge S256 ze svého ověřovače.
Nechte člověka přihlásit se
Odtud to převezme Lobby: uvede vaši aplikaci, nabídne metody přihlášení, které vaše prostředí povoluje, a poprvé požádá o souhlas.
Zkontrolujte návrat (callback)
Usher přesměruje na vaše redirect_uri s code a state. Odpověď odmítněte, pokud state neodpovídá hodnotě, kterou jste uložili. Kód je jednorázový a platí pět minut.
Vyměňte kód za tokeny
Ze svého serveru odešlete kód a ověřovač PKCE na koncový bod tokenu:
curl -s -X POST https://acme.usherid.com/api/auth/oauth2/token \
-u "$CLIENT_ID:$CLIENT_SECRET" \
-d grant_type=authorization_code \
-d code="$CODE" \
-d redirect_uri=https://app.acme.example/callback \
-d code_verifier="$CODE_VERIFIER"Ověřte ID token
Zkontrolujte jeho podpis proti klíčům na jwks_uri a to, že iss je váš vydavatel, aud je vaše ID klienta a exp je v budoucnosti. Vaše knihovna to udělá za vás; ujistěte se, že to nemá vypnuté.
V Node.js
openid-client zvládne všechno výše uvedené, včetně ověření:
import * as client from 'openid-client'
// discovery: every endpoint and key comes from the issuer
const config = await client.discovery(
new URL('https://acme.usherid.com'),
process.env.USHER_CLIENT_ID!,
process.env.USHER_CLIENT_SECRET!,
)
// 1. send them to the Lobby, with PKCE (S256) and a state to check later
const codeVerifier = client.randomPKCECodeVerifier()
const state = client.randomState()
const url = client.buildAuthorizationUrl(config, {
redirect_uri: 'https://app.acme.example/callback',
scope: 'openid profile email offline_access',
code_challenge: await client.calculatePKCECodeChallenge(codeVerifier),
code_challenge_method: 'S256',
state,
})
// keep codeVerifier and state in a short-lived httpOnly cookie, then redirect to url
// 2. back at /callback: swap the code for tokens
const tokens = await client.authorizationCodeGrant(config, new URL(request.url), {
pkceCodeVerifier: codeVerifier,
expectedState: state,
})
const { sub, email, name } = tokens.claims()!V dalších jazycích
Tyto rozšířené knihovny mluví standardním OpenID Connect a se službou Usher fungují bez čehokoli specifického pro Usher:
| Jazyk | Knihovna |
|---|---|
| Python | Authlib |
| Go | coreos/go-oidc s golang.org/x/oauth2 |
| Java | Spring Security OAuth 2.0 Client |
| .NET | Microsoft.AspNetCore.Authentication.OpenIdConnect |
| Ruby | omniauth_openid_connect |
| PHP | jumbojett/openid-connect-php |
Trvalé přihlášení
S rozsahem offline_access obsahuje odpověď s tokeny i obnovovací token. Použijte ho s grant_type=refresh_token a získejte nový přístupový token, když tomu starému vyprší platnost. Obnovovací tokeny se vyměňují: každé použití vrátí nový a starý přestane fungovat.
Odhlášení
Nejdřív vymažte vlastní relaci a pak přesměrujte na end_session_endpoint s post_logout_redirect_uri (a s id_token_hint, pokud ho máte), aby na člověka zapomněla i Lobby.