> ## Documentation Index
> Fetch the complete documentation index at: https://docs.livingsecurity.com/llms.txt
> Use this file to discover all available pages before exploring further.

# OAuth-asiakastunnukset

> Luo rajattu palvelutilin asiakasohjelma, käsittele kertaluonteiset salaisuudet ja toimi turvallisesti epävarmojen pyyntöjen jälkeen.

Käytä OAuth-asiakastunnuksia (client credentials), kun taustajärjestelmäintegraatiosi tarvitsee lyhytikäisiä
käyttöoikeustunnisteita tai kun tietoturvakäytäntösi edellyttää niitä. Kukin asiakasohjelma kuuluu
yhdelle palvelutilille ja yhdelle organisaatiolle. **OAuth on valinnainen:** rajattu
API-avain riittää yksityiseen palvelinintegraatioon, joka pystyy tallentamaan ja kierrättämään avaimen turvallisesti. Katso [Todennus](/fi/developers/v1/authentication), kun valitset
näiden kahden menetelmän välillä ja haluat ymmärtää, miten palvelutilit liittyvät asiaan.

<Note>
  OAuth-käyttö on otettava käyttöön organisaatiollesi. Käyttöönoton yhteydessä saat
  alueellisen token-päätepisteen, myöntäjän (issuer), kohderyhmän (audience) ja asiakkaan todennustavan.
  Jos tarvitset nämä asetukset tai sinulla ei ole pääsyä asiakasohjelmien hallintaan, ota yhteyttä
  Living Securityn tukeen.
</Note>

Client credentials -myöntötapa edustaa palvelutiliäsi. Se ei kirjaa henkilöä sisään
eikä pyydä asiakasta valtuuttamaan sovellusta. Selaimen kautta tapahtuva delegoitu valtuutus on
erillinen OAuth-ominaisuus, eikä näitä toimintoja tarjota sitä varten.

## Ennen aloittamista

* Luo [palvelutili](/fi/developers/developer-hub/service-accounts), jolla on vain
  integraation tarvitsemat oikeudet.
* Käytä hallintatunnistetta, jolla on `service_account:manage` sekä kaikki oikeudet,
  jotka haluat myöntää uudelle asiakasohjelmalle. Kohdetilillä on myös oltava nämä
  oikeudet. Asiakasohjelma ei voi laajentaa kummankaan tilin valtuuksia.
* Valitse organisaation [alue](/fi/developers/v1/regions). API-tunnisteet ja
  OAuth-käyttöoikeustunnisteet kuuluvat vastaavalle alueelliselle API-isännälle.
* Säilytä asiakassalaisuus ja tokenit palvelinpuolen salaisuuksien tallennustilassa. Älä koskaan sijoita
  niitä selainkoodiin, mobiilisovelluksiin, versionhallintaan tai pyyntölokeihin.

## Asiakasohjelman luominen

`POST /v1/oauth_clients` edellyttää `service_account_id`-arvoa, ei-tyhjää luetteloa nimenomaisista
`scopes`-arvoista ja `Idempotency-Key`-arvoa. Jokerimerkkejä ei hyväksytä. Asiakasohjelma tukee
enintään 100 oikeusaluetta (scope), joiden yhteispituus on enintään 4 096 merkkiä. Kullakin palvelutilillä
voi olla enintään 20 asiakasohjelmaa tai ratkaisematonta luonti- tai puhdistustoimintoa.
Mitätöinti estää API-käytön välittömästi. Asiakasohjelma tai epävarma palveluntarjoajan puolella
tehty luonti lasketaan edelleen rajaan, kunnes etäpuolen puhdistus on vahvistettu.
Hylätty varaus tai luonti, jonka on osoitettu epäonnistuneen ennen kuin palveluntarjoajan työ
alkoi, voi vapauttaa paikkansa turvallisesti. Sen uudelleenyrityksen avain kuuluu edelleen alkuperäiselle
yritykselle; palauta kuitti ennen kuin päätät, luodaanko korvaava asiakasohjelma.

Valitse tälle luontiyritykselle yksi uudelleenyritysavain ja tallenna se pysyvästi **ennen** pyynnön
lähettämistä. Käytä 1–255 näkyvää ASCII-merkkiä ilman välilyöntejä. Käytä samaa avainta uudelleen
samalla tilillä, samoilla oikeusalueilla, samalla hallintatunnisteella, samalla alueella ja samalla API-versiolla, kun vastaus on kadonnut. Hallintatunnisteen kierrättäminen saman palvelutilin alla
ei luo uutta uudelleenyrityksen identiteettiä.

Asenna Pythonin `requests`-paketti. Lataa seuraavat ympäristöarvot
tavanomaisen salaisuus- ja konfiguraationhallintasi kautta:

| Muuttuja | Arvo |
| - | - |
| `LIVING_SECURITY_API_KEY` | Hallinta-API-avain |
| `LIVING_SECURITY_REGION` | `us` tai `eu` |
| `LIVING_SECURITY_SERVICE_ACCOUNT_ID` | Kohdepalvelutilin tunnus |
| `LIVING_SECURITY_OAUTH_CREATE_KEY` | Aiemmin tallennettu uudelleenyritysavain |

```python Python theme={null}
import os
import requests

HOSTS = {
    "us": "https://api.us-east-1.livingsecurity.ai/v1",
    "eu": "https://api.eu-west-1.livingsecurity.ai/v1",
}
base = HOSTS[os.environ["LIVING_SECURITY_REGION"]]
response = requests.post(
    f"{base}/oauth_clients",
    auth=("apikey", os.environ["LIVING_SECURITY_API_KEY"]),
    headers={
        "Living-Security-Version": "2026-07-01",
        "Idempotency-Key": os.environ["LIVING_SECURITY_OAUTH_CREATE_KEY"],
    },
    json={
        "service_account_id": os.environ["LIVING_SECURITY_SERVICE_ACCOUNT_ID"],
        "scopes": ["organization:read"],
    },
    timeout=(5, 30),
    allow_redirects=False,
)
try:
    if response.status_code != 201:
        raise RuntimeError(
            f"Client creation needs review: HTTP {response.status_code}; "
            f"request_id={response.headers.get('Request-Id', 'unknown')}"
        )
    client = response.json()
    if client.get("object") != "oauth_client" or not client.get("id"):
        raise RuntimeError("Unexpected client receipt; preserve the retry key")
    if client.get("status") != "active" or not client.get("client_secret"):
        raise RuntimeError(
            f"Client {client['id']} needs recovery; no usable secret was returned"
        )
    # Persist client['id'], client['client_id'], and client['client_secret']
    # directly in your secret manager before using the client. Do not print them.
finally:
    response.close()
```

Esimerkki tekee yhden pyynnön ja säilyttää tuloksen muistissa. Lisää salaisuuksienhallintasi
kirjoitustoiminto merkittyyn kohtaan ennen tuotantokäyttöä.
Esimerkki edellyttää tarkoituksella päätöstä epävarman tuloksen jälkeen sen sijaan, että se loisi
hiljaa toisen asiakasohjelman. Myös verkkopoikkeukset edellyttävät alla kuvattuja palautusvaiheita.

Luonti- ja kuittivastaukset käyttävät `201`-arvoa ja sisältävät `oauth_client`-resurssin,
jossa on `id`, `service_account_id`, `client_id`, `scopes`, `status`, `created_at` ja
`client_secret`. Vastaukset merkitään arvolla `Cache-Control: no-store`.

* **`id`** tunnistaa alustan resurssin. Tallenna se hakua ja mitätöintiä varten.
* **`client_id`** tunnistaa asiakasohjelman tokenin vaihdon aikana. Se ei ole
  alustan resurssin tunnus. Se voi olla `null`, kun luonti on vielä kesken.
* **`client_secret`** palautetaan vain pyynnölle, joka saattaa luonnin päätökseen.
  Jokainen toistettu luontipyyntö palauttaa arvon `null`, myös uudelleenyritys kadonneen
  onnistumisvastauksen jälkeen. Haku ei koskaan palauta salaisuutta.

## Kadonneen tai keskeytyneen vastauksen palauttaminen

Toista sama luontipyyntö tallennetulla uudelleenyritysavaimella, jotta saat resurssin
kuitin. Kuitti kuvaa nykytilaa, joten mitätöity asiakasohjelma pysyy mitätöitynä.
Tämä toiminto ei käytä yleistä 24 tunnin välimuistissa olevan vastauksen toistosopimusta
eikä palauta `Idempotent-Replayed`-otsaketta.

| Tulos | Seuraava toimenpide |
| - | - |
| `active`, salaisuus mukana | Tallenna salaisuus turvallisesti ja jatka käyttöönottoa. |
| `active`, salaisuus puuttuu | Salaisuutta ei voi palauttaa. Mitätöi tämä asiakasohjelma, vahvista mitätöinti ja luo sitten korvaava asiakasohjelma uudella uudelleenyritysavaimella. |
| `pending` | Luontia ei ole vahvistettu. Säilytä sama uudelleenyritysavain. Hae resurssi tilan tarkistamiseksi; älä luo kaksoiskappaleita epävarmuuden kiertämiseksi. |
| `revoked`, `disabled` tai `expired` | Älä käytä tätä asiakasohjelmaa. Vahvista aiottu tilin konfiguraatio ennen korvaavan asiakasohjelman luomista. |
| `409 idempotency_key_reuse` | Pyyntö muuttui olemassa olevan avaimen alla. Palauta alkuperäinen toiminto ennen kuin päätät, tarvitaanko erillinen luonti. |
| `409 invalid_request` | Tarkista kohdetilin tila ja myönnetyt oikeudet. Jos sen asiakasohjelmaraja on täynnä, suorita puhdistus loppuun ennen uudelleenyritystä; uudelleenyritysavaimen vaihtaminen ei vapauta kapasiteettia. |
| `429` | Noudata arvoa `Retry-After`; säilytä sama avain ja pyyntö. |
| `500`, `503` tai verkon aikakatkaisu | Lopputulos voi olla tuntematon. Säilytä avain ja syötteet; palauta kuitti ennen kuin luot toisen asiakasohjelman. |
| `401` tai `403` | Ratkaise tunnisteiden, oikeuksien tai käyttöoikeuksien (entitlement) pääsyongelma ennen uudelleenyritystä. |
| `404` | Vahvista OAuthin käyttöönotto, alueellinen isäntä ja resurssin omistajuus. |

Katso pyyntötunnuksia ja palautustietoja koskevat ohjeet kohdasta [virheet](/fi/developers/v1/errors/overview).
Älä koskaan lähetä asiakassalaisuutta tai käyttöoikeustunnistetta tukipyynnön mukana.

## Tarkastelu ja mitätöinti

Käytä hallintatunnistettasi ja alustan resurssin `id`-arvoa:

| Toiminto | Pyyntö | Onnistuminen |
| - | - | - |
| Nykytilan tarkastelu | `GET /v1/oauth_clients/{id}` | `200`, asiakasohjelman resurssi ilman salaisuutta |
| Käyttöoikeuden mitätöinti | `DELETE /v1/oauth_clients/{id}` | `200`, mitätöity asiakasohjelman resurssi ilman salaisuutta |

Mitätöinti estää asiakasohjelman myöhemmät API-pyynnöt, myös jo myönnettyjä
tokeneita käyttävät pyynnöt. Se ei peruuta API:n jo hyväksymää työtä.
Etäpuolen tunnisteiden puhdistus voi valmistua myöhemmin. Mitätöinnin toistaminen on turvallista, eikä se
vaadi uudelleenyritysavainta. Jatka hallintatunnisteen käyttöä, jos
mitätöitävä asiakasohjelma on itse API-kutsuja.

## Kierrätys ilman käyttöoikeuden menetystä

Luo toinen asiakasohjelma, jolla on vaadittu oikeusalueiden yläraja. Tallenna sen salaisuus, hanki
token alueellisella token-päätepisteelläsi ja varmista, että integraatio toimii
sen kanssa. Vaihda integraatio käyttämään korvaavaa asiakasohjelmaa ja mitätöi sitten vanha resurssi.
Säilytä erillinen hallintatunniste, jotta voit palautua virheellisestä käyttöönotosta.

Käyttöoikeustunnisteet eivät voi myöntää enempää kuin asiakasohjelman oikeusalueet ja palvelutilin
nykyiset oikeudet sallivat. Tilin oikeuksien poistaminen tai asiakasohjelman mitätöinti
ohittaa tokenin jäljellä olevan voimassaoloajan. Älä pidä välimuistissa olevaa tokenia todisteena siitä,
että valtuutus on edelleen voimassa. Hanki uusi käyttöoikeustunniste ennen vanhenemista
todentamalla asiakasohjelma uudelleen; tämä myöntötapa ei käytä päivitystokeneita (refresh token).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.