Powrót do bloga

Pierwsze krokiPrzewodnik

Bezpieczne przechowywanie klucza API: zmienna środowiskowa, .gitignore, naprawa wycieku

Trzymaj klucz CheapTokens poza kodem i gitem: ustaw zmienną środowiskową, dodaj .env do .gitignore i wiedz, co robić, jeśli klucz wycieknie.

Autor: CheapTokens TeamOpublikowano 5 min czytania

Terminal z eksportem zmiennej środowiskowej i linią .gitignore dla klucza API
Na tej stronie
  1. Dlaczego klucz nie należy do twojego kodu
  2. Krok 1: umieść klucz w zmiennej środowiskowej
  3. Krok 2: używaj pliku .env, ale go nie commituj
  4. Jeśli klucz wyciekł: co robić, po kolei
  5. Sprawdź się

Trzymaj klucz w zmiennej środowiskowej, a nie w kodzie, i nie wrzucaj pliku .env do gita — dopisz odpowiednią linię do .gitignore. Jeśli klucz już trafił w miejsce publiczne, najpierw zajmij się kluczem, a porządki zrób później: czyszczenie historii gita, gdy klucz wciąż siedzi w kodzie i narzędziach, niczego nie naprawia.

To cała idea. Ten przewodnik to wersja praktyczna (podstawy są w What is an API key): trzy polecenia, jedno działające zapytanie i krótki plan na zły dzień.

Dlaczego klucz nie należy do twojego kodu#

Klucz API to hasło, które wydaje twoje pieniądze. Każdy, kto go ma, może wysyłać zapytania na twoje konto, a usługa nie odróżni go od ciebie.

Zwykle kończy się to nudno. Wklejasz klucz do skryptu, żeby pierwsze zapytanie zadziałało, skrypt działa, robisz git push, a repozytorium jest publiczne. Albo wysyłasz koledze plik konfiguracyjny. Albo robisz zrzut ekranu błędu z kluczem widocznym w rogu. Za każdym razem efekt jest ten sam.

GitHub dobrze zna ten schemat. Jego skanowanie sekretów (dokumentacja GitHub, sprawdzone 29 października 2026) przeszukuje całą historię Gita na wszystkich gałęziach w poszukiwaniu zaszytych na stałe danych uwierzytelniających, a także issues, pull requesty, dyskusje, wiki i sekretne gisty, i zgłasza alert, gdy coś znajdzie. To oznacza, że usunięcie linii w następnym commicie niczego nie zmienia: stary commit wciąż ją zawiera.

Oto ten sam skrypt przed i po.

Porównaj

Ten sam skrypt, klucz przeniesiony poza kod

Klucz w kodzie

python
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key="<your-key>",  # pasted here: ends up in git
)

Klucz ze środowiska

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

Drugą wersję możesz bez zmian wysłać na GitHuba, na czat albo do code review. Klucz żyje na twojej maszynie, poza plikiem.

Krok 1: umieść klucz w zmiennej środowiskowej#

Zmienna środowiskowa to nazwana wartość, którą terminal przekazuje każdemu uruchamianemu programowi. Skrypt prosi o CHEAPTOKENS_API_KEY po nazwie i nigdy nie widzi, skąd pochodzi.

Na macOS i Linuksie:

bash
export CHEAPTOKENS_API_KEY="<your-key>"

W Windows PowerShell:

powershell
setx CHEAPTOKENS_API_KEY "<your-key>"

Dwa szczegóły często zaskakują. export działa tylko w tym oknie terminala, więc aby go zachować, dopisz linię do profilu powłoki (~/.zshrc lub ~/.bashrc). A setx nie zmienia okna, w którym go wpisałeś: przed testem otwórz nowy terminal.

Teraz pełne zapytanie. Korzysta z endpointu zgodnego z OpenAI, https://api.cheaptokens.dev/v1, oraz z DeepSeek-V4-Flash z pełnym identyfikatorem (deepseek-ai/DeepSeek-V4-Flash-0731; identyfikatory bierz z dokumentacji CheapTokens, bo nazwy różnią się między dostawcami):

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

resp = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    messages=[{"role": "user", "content": "Say hi in five words."}],
)
print(resp.choices[0].message.content)
print(resp.usage)

Krótkie powitanie to zapytanie o około 20 tokenów na wejściu i 20 na wyjściu, co przy obecnych cenach daje $0.0000023 (pełna lista jest na stronie z cenami). Jeśli nie wysłałeś jeszcze pierwszego zapytania, Your first API request with CheapTokens przeprowadzi cię przez to od zera.

Odpowiedź modelu wraca w choices[0].message.content, a usage pokazuje zliczone tokeny. Klucz nigdy nie pojawia się w pliku.

Terminal showing the .env and .gitignore commands
The three commands that keep the key out of git

Krok 2: używaj pliku .env, ale go nie commituj#

Wpisywanie export w każdym nowym oknie się nudzi. Plik .env trzyma wartość w jednym miejscu, obok projektu:

text
CHEAPTOKENS_API_KEY=<your-key>

Python czyta go przez python-dotenv (pip install python-dotenv):

python
from dotenv import load_dotenv
load_dotenv()  # fills os.environ from .env

Plik jest bezpieczny tylko wtedy, gdy git go nie widzi. Dodaj go do .gitignore przed pierwszym commitem:

bash
echo ".env" >> .gitignore
git check-ignore -v .env

Jeśli wszystko jest w porządku, drugie polecenie wypisze coś w rodzaju .gitignore:1:.env .env: git mówi, która reguła ignoruje plik. Jeśli nic nie wypisze, reguła nie działa. W Windows utwórz .gitignore w edytorze z linią .env albo użyj Add-Content .gitignore .env: >> w PowerShellu potrafi zapisać UTF-16, które git może zignorować.

Jedna pułapka: .gitignore działa tylko na plikach, których git jeszcze nie śledzi. Jeśli .env został już raz zacommitowany, uruchom git rm --cached .env, żeby git przestał go śledzić, i traktuj znajdujący się w nim klucz jako ujawniony (więcej o tym poniżej). Dobrym nawykiem jest commitowanie .env.example z nazwą zmiennej i placeholderem zamiast wartości, żeby kolega z zespołu wiedział, co ustawić.

Jeśli klucz wyciekł: co robić, po kolei#

Może klucz trafił do publicznego repo, może był na zrzucie ekranu, a może wkleiłeś całą konfigurację na forum. Kolejność ma większe znaczenie niż szybkość pojedynczego kroku.

Wskazówki samego GitHuba (ta sama strona, sprawdzone 29 października 2026) mówią, żeby natychmiast wymienić dane uwierzytelniające; przepisywanie historii Gita jest opcjonalne i często zbędne, gdy dane uwierzytelniające zostały unieważnione. Ludzie zwykle robią to odwrotnie: spędzają godzinę na czyszczeniu historii, podczas gdy klucz wciąż działa. Nie rób tego.

Wybierz swój przypadek

Co się stało z twoim kluczem? Wybierz najbliższy przypadek

Klucz był w commicie, który jest teraz publiczny

Najpierw usuń klucz z kodu, przejdź na zmienną środowiskową, dodaj .env do .gitignore i sprawdź saldo pod kątem zapytań, których nie wysłałeś. Czyszczenie historii to miły dodatek na później, a nie pilna część.

Klucz był na zrzucie ekranu lub w udostępnionym pliku

Ta sama kolejność: przestań używać tego klucza w narzędziach i przejdź na zmienną środowiskową, a potem usuń post lub plik, jeśli możesz. Usunięty zrzut ekranu mógł już zostać skopiowany, więc nie licz tylko na usunięcie.

Ten sam klucz jest używany w kilku narzędziach

Przejdź przez każde miejsce, które trzymało klucz: profil powłoki, pliki .env, narzędzia edytora i terminala, i w każdym wskaż zmienną środowiskową, żeby było jedno miejsce do zmiany. Jeśli narzędzie nie potrafi odczytać zmiennej, 401/404 troubleshooting guide pokazuje, jak wygląda błąd.

Three steps after a leak: take the key out of the code, update every tool, send a test request
Key out of the code first, then every tool, then a test request

Po porządkach wyślij jedno małe zapytanie testowe, jak w kroku 1, i sprawdź saldo. Jeśli odpowiada, a saldo i liczba zapytań wyglądają normalnie, porządki są zakończone; obserwuj saldo przez kilka następnych dni. Klucz, który był publiczny, należy traktować jako ujawniony nawet po usunięciu go z kodu, więc pilnuj salda i liczby zapytań pod kątem czegoś, czego nie wysłałeś, i nie używaj tego klucza w nowych miejscach. Gdzie klucz zwykle bywa, opisuje Where to plug in your own API key.

Sprawdź się#

Spróbuj samSpróbuj: usuń zmienną i uruchom skrypt. Co widzisz?Pokaż odpowiedź

Python zatrzymuje się z KeyError: 'CHEAPTOKENS_API_KEY', zanim jakiekolwiek zapytanie opuści twoją maszynę. To dobra porażka: skrypt odmawia uruchomienia bez klucza, zamiast po cichu użyć wklejonego. Jeśli zamiast tego widzisz 401, zmienna jest ustawiona, ale klucz jest błędny; sprawdź klucz i adres w 401/404 guide.