Hurtig start: ethvert OIDC-bibliotek
Usher er en almindelig OpenID Connect-udbyder. Har dit sprog en certificeret OIDC-klient, har du allerede alt, hvad du skal bruge: peg den mod dit miljøs discovery-dokument, og brug autorisationskodeflowet med PKCE.
Indstillingerne
| Indstilling | Værdi |
|---|---|
| Udsteder | https://<handle>.usherid.com |
| Discovery-URL | https://<handle>.usherid.com/.well-known/openid-configuration |
| Flow | Autorisationskode (response_type=code) |
| PKCE | Påkrævet, code_challenge_method=S256 |
| Scopes | openid profile email offline_access |
| Klientgodkendelse | Som angivet i token_endpoint_auth_methods_supported |
Dit miljøs handle står i Usher Console ved siden af dets udsteder. Udviklingsmiljøer får et tilfældigt handle, f.eks. wise-otter-42; produktionsmiljøer har det handle, du har valgt. Et produktionsmiljø kan i stedet ligge på dit eget domæne, f.eks. login.acme.com: så er det dets udsteder, når du har peget domænet mod Usher med en CNAME-post.
Læs discovery-dokumentet
Alle de slutpunkter og nøgler, din klient skal bruge, står her. Lad dit bibliotek læse dokumentet i stedet for at kopiere URL’er ind i din kode.
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"]
}Flowet
Send personen til autorisationsslutpunktet
Lav en tilfældig PKCE-verifikator, og gem den sammen med en tilfældig state et sted, som kun denne browsers session kan nå (en kortlivet httpOnly-cookie fungerer godt). Omdiriger derefter med response_type=code, dit client_id og din redirect_uri, scopes ovenfor, state og S256-code_challenge for din verifikator.
Lad personen logge ind
Lobbyen tager over herfra: den nævner din app, tilbyder de loginmetoder, dit miljø tillader, og beder om samtykke første gang.
Tjek callbacket
Usher omdirigerer til din redirect_uri med code og state. Afvis svaret, medmindre state matcher den, du gemte. Koden er til engangsbrug og gælder i fem minutter.
Byt koden til tokens
Send koden og PKCE-verifikatoren fra din server til token-slutpunktet:
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"Valider id-tokenet
Tjek signaturen mod nøglerne på jwks_uri, og tjek, at iss er din udsteder, aud er dit klient-id, og exp ligger i fremtiden. Dit bibliotek gør det for dig; sørg for, at det ikke er slået fra.
I Node.js
openid-client klarer alt ovenstående, inklusive validering:
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()!I andre sprog
Disse udbredte biblioteker taler alle almindelig OpenID Connect og virker med Usher uden noget Usher-specifikt:
| Sprog | Bibliotek |
|---|---|
| Python | Authlib |
| Go | coreos/go-oidc med 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 |
Forbliv logget ind
Med scopet offline_access indeholder tokensvaret et opdateringstoken. Brug det med grant_type=refresh_token til at få et nyt adgangstoken, når det gamle udløber. Opdateringstokens roteres: hver brug giver et nyt, og det gamle holder op med at virke.
Log ud
Ryd først din egen session, og omdiriger derefter til end_session_endpoint med post_logout_redirect_uri (og id_token_hint, hvis du har det), så Lobbyen også glemmer personen.