Przejdź do głównej zawartości

Uwierzytelnianie

Uwierzytelnianie zamienia głównego Client w klienta uwierzytelnionego. Klient główny wybiera środowisko KSeF, a metoda uwierzytelnienia wybiera kontekst, w którym działa aplikacja.

Te nazwy są używane w przykładach i przez profile ksef2-cli:

ZmiennaZnaczenie
KSEF2_ENVtest, demo albo production w przykładach SDK.
KSEF2_NIPNIP podatnika/kontekstu używany przy uwierzytelnianiu.
KSEF2_TOKENToken KSeF dla uwierzytelniania tokenem.
KSEF2_PROFILENazwa profilu wybierana przez ksef2-cli i uwierzytelnianie profilami w SDK.
KSEF2_CONFIGOpcjonalna ścieżka do pliku konfiguracji profili CLI.
KSEF2_KEY_PASSWORDOpcjonalne hasło zaszyfrowanego klucza PEM.
KSEF2_P12_PASSWORDOpcjonalne hasło archiwum PKCS#12/PFX.
Okno terminala
export KSEF2_ENV=test
export KSEF2_NIP=5261040828
export KSEF2_TOKEN=podmien-na-prawdziwy-token-ksef

SDK czyta KSEF2_PROFILE i KSEF2_CONFIG, gdy używasz client.authentication.with_profile(). Przy bezpośrednim uwierzytelnianiu tokenem albo certyfikatem trzymaj granicę konfiguracji jawną w aplikacji:

import os
from ksef2 import Client, Environment
environment_name = os.environ.get("KSEF2_ENV", "test").upper()
client = Client(Environment[environment_name])

Użyj tokenu KSeF, gdy aplikacja ma już ważny token dla danego kontekstu. Token działa w TEST, DEMO i PRODUCTION.

import os
auth = client.authentication.with_token(
ksef_token=os.environ["KSEF2_TOKEN"],
nip=os.environ["KSEF2_NIP"],
context_type="nip",
)

ksef2-cli ma już obsługę lokalnych profili. Profil przechowuje niesekretne ustawienia: środowisko, NIP, metodę uwierzytelnienia, ścieżki certyfikatów i nazwę zmiennej środowiskowej z sekretem.

Okno terminala
ksef2 profile create test-company \
--env test \
--nip 5261040828 \
--test-cert
ksef2 profile create prod-token \
--env production \
--nip "$KSEF2_NIP" \
--token-env KSEF2_TOKEN

Wybierz profil dla komend CLI:

Okno terminala
export KSEF2_PROFILE=prod-token
ksef2 profile current

Użyj tego samego pliku profili w kodzie SDK:

from ksef2 import Client, Environment
from ksef2.profiles import Profile, ProfileStore, TokenProfileAuth
store = ProfileStore.default()
store.save(
"prod-token",
Profile(
environment=Environment.PRODUCTION,
nip="5261040828",
auth=TokenProfileAuth(token_env="KSEF2_TOKEN"),
),
activate=True,
overwrite=True,
)
client = Client(Environment.PRODUCTION)
auth = client.authentication.with_profile()
# Albo jawnie wybrany profil.
auth = client.authentication.with_profile("prod-token")

Środowisko klienta głównego musi zgadzać się ze środowiskiem wybranego profilu. Przekaż config_path="...", gdy plik profili nie znajduje się w domyślnej lokalizacji ~/.config/ksef2-cli/config.toml.

  1. Umieść sekrety w zmiennych środowiskowych.

    Użyj KSEF2_TOKEN, KSEF2_KEY_PASSWORD albo KSEF2_P12_PASSWORD.

  2. Trzymaj niesekretne ustawienia w jednym miejscu.

    Dla w pełni własnych konfiguracji użyj konfiguracji aplikacji. Jeśli to samo środowisko obsługujesz też z terminala, skorzystaj z profili ksef2-cli.

  3. Utwórz klienta głównego dla środowiska.

    Użyj Client(Environment.TEST), Client(Environment.DEMO) albo Client(Environment.PRODUCTION).

  4. Uwierzytelnij się raz i przekaż klienta do przepływów.

    Klient uwierzytelniony przechowuje tokeny dostępu i udostępnia gałęzie przepływów.

Błędy sklasyfikowane przez SDK łap przez KSeFException. Błędy transportu HTTP łap osobno.

import httpx
from ksef2 import KSeFException
try:
auth = client.authentication.with_test_certificate(nip="5261040828")
except KSeFException as exc:
print(exc)
except httpx.HTTPError as exc:
print(f"Transport failed: {exc}")