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

# Autentizace

> OAuth2 tokeny a cache v GoPay SDK.

# Autentizace

SDK se k GoPay přihlašuje pomocí OAuth2 `client_credentials`.

<Info>
  Token endpoint **nevolejte ručně** při běžném použití API — SDK ukládá access tokeny do cache a obnovuje je před expirací.
</Info>

## Jak to funguje

Při prvním volání API:

1. SDK odešle `POST /oauth2/token`
2. Token uloží do cache s časem expirace
3. Token znovu používá, dokud se neblíží konec platnosti
4. Před expirací obnoví (okno podle `tokenRefreshMarginSeconds`)

## Požadavek na token endpoint

SDK odesílá:

* `grant_type=client_credentials`
* nakonfigurovaný `scope` (výchozí `payment-all`)
* `Authorization: Basic <base64(clientId:clientSecret)>`

## Cache tokenů

Výchozí je `InMemoryTokenCache`.

<Tip>
  Sdílená cache (Redis, memcached, …) se hodí při **více instancích serveru**, aby se zbytečně nenásobily OAuth požadavky.
</Tip>

Vlastní cache pro sdílení tokenů mezi procesy:

```ts theme={null}
import { createGoPayClient, type TokenCache } from 'gopay-sdk';

class RedisLikeCache implements TokenCache {
  private readonly storage = new Map<string, any>();

  get(key: string) {
    return this.storage.get(key);
  }

  set(key: string, value: any) {
    this.storage.set(key, value);
  }

  delete(key: string) {
    this.storage.delete(key);
  }
}

const client = createGoPayClient(
  {
    goid: 8123456789,
    clientId: process.env.GOPAY_CLIENT_ID!,
    clientSecret: process.env.GOPAY_CLIENT_SECRET!,
    gatewayUrl: 'https://gw.sandbox.gopay.com/api',
  },
  {
    tokenCache: new RedisLikeCache(),
  },
);
```

## Souběh

Správce tokenů slučuje paralelní požadavky na token:

* pokud více volání potřebuje token najednou, proběhne jen jedno HTTP volání na token
* všichni čekají na stejný probíhající promise

Tím se sníží zátěž token endpointu.

## Doporučená nastavení

* ponechte výchozí `tokenRefreshMarginSeconds` (`30`), pokud infrastruktura nevyžaduje větší rezervu
* přihlašovací údaje držte v proměnných prostředí nebo secret manageru
* při rotaci credential koordinujte nasazení napříč uzly
