OAuth i prijava putem Sportyja

Tok authorization code

Cijeli tok sa stvarnim zahtjevima, od slanja osobe na Sporty do osvježavanja tokena.

Authorization code s PKCE-om tok je za svaku aplikaciju koja djeluje u ime osobe. Svaki primjer u nastavku stvarni je zahtjev.

1. Napravite PKCE verifier i challenge

PKCE je obavezan, i za povjerljive klijente, a prihvaća se samo S256 — plain se odbija.

VERIFIER=$(openssl rand -base64 60 | tr -d '\n=+/' | cut -c1-64)
CHALLENGE=$(printf '%s' "$VERIFIER" | openssl dgst -sha256 -binary | openssl base64 | tr '+/' '-_' | tr -d '=')

Sačuvajte verifier; trebat će vam u 4. koraku.

2. Pošaljite člana na Sporty

https://api.sporty.plus/oauth2/authorize
  ?response_type=code
  &client_id=YOUR_CLIENT_ID
  &redirect_uri=https://yourapp.example/callback
  &scope=openid%20profile%20email%20club.courts.read
  &state=RANDOM_PER_REQUEST
  &code_challenge=CHALLENGE
  &code_challenge_method=S256
ParametarNapomene
stateNasumičan, nepogodiv, zaseban za svaki zahtjev. Provjerite ga pri povratku — upravo to jamči da je povratni poziv vaš.
nonceNeobavezan. Ako ga pošaljete, vraća se u id_token. Koristite ga ako vam treba.
club_idNeobavezan. Ima smisla samo za klijenta s pristupom više klubova, da kaže o kojem je riječ.

Član na my.sporty.plus vidi zaslon za privolu koji jednostavnim riječima navodi točno ono što ste zatražili. Može odobriti i manje od toga; zatraženo se nikad ne proširuje.

3. Član se vraća na vaš redirect URI

https://yourapp.example/callback?code=...&state=...

Ako je odbio, ili je nešto bilo pogrešno:

https://yourapp.example/callback?error=access_denied&error_description=...&state=...

Prije bilo čega drugog usporedite state s onim što ste poslali.

4. Zamijenite kod za token

Unutar nekoliko minuta i samo jednom. Kod je jednokratan.

curl -X POST https://api.sporty.plus/oauth2/token \
  -H 'Accept: application/json' \
  -d grant_type=authorization_code \
  -d client_id=YOUR_CLIENT_ID \
  -d client_secret=YOUR_SECRET \
  -d redirect_uri=https://yourapp.example/callback \
  -d code_verifier="$VERIFIER" \
  -d code=THE_CODE

Za javnog klijenta izostavite client_secret.

{
  "token_type": "Bearer",
  "expires_in": 3600,
  "access_token": "eyJ0eXAiOiJKV1Qi...",
  "refresh_token": "def5020089ab...",
  "id_token": "eyJ0eXAiOiJKV1Qi..."
}

id_token je prisutan samo ako ste zatražili openid. Pogledajte Prijava putem Sportyja.

5. Koristite ga

curl https://api.sporty.plus/api/partner/v1/clubs/me \
  -H "Authorization: Bearer $ACCESS_TOKEN"

6. Osvježite ga

Pristupni tokeni traju sat vremena, a refresh tokeni trideset dana (dan za klijenta koji se registrirao sam).

curl -X POST https://api.sporty.plus/oauth2/token \
  -H 'Accept: application/json' \
  -d grant_type=refresh_token \
  -d client_id=YOUR_CLIENT_ID \
  -d client_secret=YOUR_SECRET \
  -d refresh_token=THE_REFRESH_TOKEN

7. Opozovite ga kad završite

curl -X POST https://api.sporty.plus/oauth2/token/revoke \
  -d client_id=YOUR_CLIENT_ID \
  -d client_secret=YOUR_SECRET \
  -d token=THE_ACCESS_TOKEN

Ovo uvijek odgovara 200, što god poslali — tako nalaže RFC 7009, pa se krajnja točka ne može koristiti za provjeru je li token valjan.

Navedite pristupni token, ne refresh token. Opoziv pristupnog tokena opoziva i refresh tokene izdane uz njega, što u praksi znači „završi ovu sesiju”. Sam refresh token ovdje se zasad ne može navesti.

Član vas također može opozvati u bilo kojem trenutku, putem Autorizirane aplikacije u svojem profilu. Kad se to dogodi, svaki token koji imate odmah prestaje raditi, a člana biste trebali ponovno provesti kroz tok umjesto da pokušavate iznova.

Pogreške koje možete očekivati

PogreškaŠto se dogodilo
invalid_requestObično nedostaje code_challenge ili je plain. Obavezan je PKCE sa S256.
invalid_scopeOpseg koji ne postoji ili koji ova vrsta klijenta ne smije tražiti.
invalid_grantKod je već iskorišten ili je istekao, ili se code_verifier ne podudara.
access_deniedČlan je odbio, ili je aplikacija suspendirana.
insufficient_scope (403)Token je valjan, ali ovaj mu opseg nije odobren. Zaglavlje WWW-Authenticate navodi što je potrebno.

Na neregistrirani redirect_uri nikad se ne preusmjerava. Pogrešku ćete umjesto toga vidjeti na Sportyju — i upravo je to svrha.