Klucz API App Store Connect (.p8): jak go utworzyć i używać
Autor: Mehdi Azizi
Opublikowano , 10 min
Klucz API App Store Connect (.p8) pobierzesz tylko raz. Rola, Issuer ID, Key ID, unieważnianie i użycie z Expo, fastlane lub własnym skryptem.
Klucz API App Store Connect pozwala narzędziu, takiemu jak EAS, fastlane, RevenueCat czy twój własny skrypt, działać na twoim koncie bez hasła i bez weryfikacji dwuetapowej. Apple przechowuje publiczną połowę klucza, a ty pobierasz prywatną połowę, plik .p8, tylko raz. Za pomocą tego pliku, Issuer ID i Key ID podpisujesz tokeny ważne maksymalnie 20 minut dla większości żądań.
Publikuję swoje aplikacje iOS, w tym TradaZen i Nolera, przez Expo. Jeden klucz zespołowy z rolą App Manager obsługuje RevenueCat, moje buildy Expo i narzędzie wiersza poleceń, którym edytuję strony aplikacji. Ten poradnik opiera się na stronach Apple, Expo i fastlane przeczytanych ponownie 3 listopada 2026. Nie myl go z kluczami usług wstawianymi do kodu aplikacji: o nich piszę w artykule tajny klucz API w aplikacji Expo.
Do czego służy klucz API App Store Connect
Według dokumentacji Apple API App Store Connect wymaga tokenu JWT przy każdym żądaniu. Generujesz go i podpisujesz swoim kluczem prywatnym. Klucz działa wyłącznie z tym API: nie użyjesz go do innych usług Apple.
Jego zaleta mieści się w jednym zdaniu: nikt nie musi zatwierdzać logowania. Twój Apple ID zatrzymuje się na weryfikacji dwuetapowej, co blokuje każdą automatyzację. Poradnik EAS Submit iOS pokazuje, co to zmienia przy wysyłce aplikacji Expo.
Najpierw: poproś o dostęp do API
Pierwszego klucza nie utworzysz od razu. Pomoc App Store Connect mówi jasno: Account Holder musi najpierw poprosić o dostęp do API. Otwiera Users and Access, klika Integrations, a potem Request Access. Apple rozpatruje każdy wniosek indywidualnie.
Account Holder to osoba, która zarejestrowała konto. Jeśli zaczynasz, to ty: poradnik konto dewelopera Apple opisuje rejestrację krok po kroku.
Klucz zespołowy czy indywidualny
Apple oferuje dwa typy kluczy. Oto różnice, zebrane z dokumentacji i pomocy App Store Connect:
| Kryterium | Klucz zespołowy | Klucz indywidualny |
|---|---|---|
| Kto może go wygenerować | Account Holder lub Admin | Prawie każdy użytkownik |
| Dostępne aplikacje | Wszystkie, bez wyjątku | Te, do których ma dostęp użytkownik |
| Uprawnienia | Wybrana rola | Uprawnienia użytkownika |
| Liczba kluczy | Wiele | Jeden aktywny na osobę |
| Certyfikaty i profile | Tak, zależnie od roli | Nie |
| Sprzedaż, finanse, notaryTool | Zależnie od roli | Nie |
| Pole w tokenie | iss = Issuer ID | sub = user |
„Prawie każdy użytkownik” oznacza według Apple: Account Holder, Admin, App Manager, Customer Support, Developer i Marketing, chyba że Admin lub Account Holder odebrał im prawo do generowania klucza indywidualnego.
Do Expo lub fastlane wybierz klucz zespołowy. Klucz indywidualny nie ma dostępu do endpointów provisioningu, czyli tych, które tworzą certyfikaty i profile. Dokumentacja fastlane to potwierdza: klucze zespołowe są wymagane do wszystkiego, co dotyczy provisioningu.
Jaką rolę nadać kluczowi
Klucz zespołowy ma dostęp do wszystkich aplikacji na koncie, niezależnie od roli. Rola decyduje o tym, co może robić. Apple ostrzega, że klucz Admin może tworzyć i usuwać użytkowników: nadaj najmniejszą rolę, która pokrywa twoje potrzeby. Uprawnienia poniżej pochodzą z tabeli ról Apple.
| Zastosowanie klucza | Role, które na to pozwalają |
|---|---|
| Wysyłanie buildów | Admin, App Manager, Developer |
| Zarządzanie buildami TestFlight | Admin, App Manager |
| Tworzenie certyfikatów i profili | Admin, App Manager |
| Wysyłanie aplikacji do recenzji | Admin, App Manager |
| Import produktów i cen (RevenueCat) | Co najmniej App Manager |
| Generowanie innych kluczy zespołowych | Admin |
Wiersz o RevenueCat pochodzi z jego dokumentacji. Poradnik Expo z kolei nadaje kluczowi rolę Admin. W moich aplikacjach rola App Manager wystarcza: EAS tworzy z nią profile dystrybucyjne, a RevenueCat importuje produkty.
Po wygenerowaniu klucza nie możesz już zmienić ani jego nazwy, ani roli. Żeby coś zmienić, musisz go unieważnić i wygenerować nowy.
Tworzenie klucza zespołowego krok po kroku
Potrzebujesz konta Admin lub Account Holder. Według Apple:
- Otwórz Users and Access, a potem zakładkę Integrations.
- Wybierz App Store Connect API w lewej kolumnie, a potem zakładkę Team Keys.
- Kliknij Generate API Key albo przycisk +.
- Nadaj kluczowi nazwę. Służy tylko tobie, nie jest częścią klucza. Nazwij go od narzędzia, które będzie go używać.
- Wybierz rolę w sekcji Access, a potem kliknij Generate.
- Pobierz klucz prywatny linkiem Download API Key.
Link do pobrania znika, gdy tylko pobierzesz plik, a Apple nie zachowuje żadnej kopii. Schowaj
.p8, zanim zamkniesz stronę.
Następnie zapisz oba identyfikatory. Według strony Apple o tokenach Issuer ID wyświetla się u góry strony Integrations, z przyciskiem Copy. Key ID znajdziesz na liście aktywnych kluczy: najedź na niego kursorem, a pojawi się Copy Key ID. Issuer ID jest taki sam dla wszystkich kluczy zespołowych na koncie. Key ID jest unikalny dla każdego klucza.
W przypadku klucza indywidualnego jest krócej: otwórz swój profil użytkownika, przewiń do Individual API Key i kliknij Generate API Key. Tu również pobierasz plik tylko raz.
Przechowywanie pliku .p8
Apple każe traktować klucz jak hasło: nie udostępniaj go, nie trzymaj go w repozytorium kodu, nigdy nie wstawiaj go do kodu aplikacji. Moja rutyna:
- Folder poza projektem albo menedżer sekretów twojego narzędzia CI.
- Folder z kluczami w
.gitignore, jeśli plik musi na czas wysyłki leżeć w projekcie. - Restrykcyjne uprawnienia. Pewne narzędzie wiersza poleceń do App Store Connect odrzucało mój
.p8, dopóki plik był czytelny dla innych kont.chmod 600rozwiązał problem. - Jeden klucz na narzędzie. Apple pozwala wygenerować wiele kluczy z wybranymi rolami.
Tego ostatniego punktu na początku nie zastosowałem. Mój klucz App Manager obsługuje jednocześnie RevenueCat, moje buildy i narzędzie do stron aplikacji. Jeśli będę musiał go unieważnić, padną trzy narzędzia naraz. Gdybym robił to od nowa, utworzyłbym jeden klucz na narzędzie, żeby móc wyłączyć jeden bez ruszania pozostałych.
Użycie z Expo
Trzy sposoby na przekazanie klucza do EAS:
- Zostawić zarządzanie EAS.
eas credentials --platform iosmoże utworzyć klucz i przechowywać go na serwerach Expo. To najprostsza droga. - Zadeklarować go w
eas.json. ProfilsubmitprzyjmujeascApiKeyPath,ascApiKeyIssuerIdiascApiKeyId. Według dokumentacji eas.json te pola przyjmują zmienne środowiskowe, np.$ASC_API_KEY_PATH. - Przekazać go przez środowisko. Repozytorium EAS CLI dokumentuje
EXPO_ASC_API_KEY_PATH,EXPO_ASC_KEY_IDiEXPO_ASC_ISSUER_ID. Przy kluczu indywidualnym pomijasz Issuer ID.
Jedno ograniczenie przy buildach: Expo zaznacza, że oficjalne API nie potrafi przypisać App Group, Merchant ID ani kontenera CloudKit. Potrzebne jest wtedy lokalne logowanie Apple ID. Przerobiłem to na Nolerze z grupą aplikacji dla jej widżetu: klucz włączał capability, ale nie przypisywał grupy. Przypisanie zrobiłem w portalu deweloperskim Apple. Jeśli synchronizacja capabilities się blokuje, EXPO_NO_CAPABILITY_SYNC=1 ją wyłącza, a capability włączasz sam na identyfikatorze aplikacji. Podpisywanie buildów opisuję w artykule certyfikat i provisioning profile iOS.
Użycie z fastlane
fastlane odczytuje klucz z pliku JSON. Pola key_id, issuer_id i key, czyli zawartość .p8, są obowiązkowe. duration i in_house są opcjonalne. Przykładowe wartości:
{
"key_id": "XXXXXXXXXX",
"issuer_id": "twoj-issuer-id",
"key": "-----BEGIN PRIVATE KEY-----\nMIGT...\n-----END PRIVATE KEY-----",
"duration": 1200,
"in_house": false
}
Następnie przekazujesz ten plik do akcji, np. fastlane pilot distribute --api_key_path fastlane/cle.json. W Fastfile akcja app_store_connect_api_key przyjmuje key_id, issuer_id i key_filepath. Czas sesji nie przekracza 1200 sekund, czyli 20 minut. Nie wszystkie akcje to obsługują: fastlane podaje na przykład, że produce i pem nie działają z kluczem API.
Użycie we własnym skrypcie
Bez narzędzia budujesz token sam. Apple określa przepis:
- Nagłówek:
algtoES256,kidto twój Key ID,typtoJWT. - Treść, klucz zespołowy:
iss, twój Issuer ID;iat, czas utworzenia;exp, czas wygaśnięcia;aud, równeappstoreconnect-v1. - Treść, klucz indywidualny:
subrówneuserzamiastiss. - Czas ważności: powyżej 20 minut Apple odrzuca token dla większości żądań.
W Pythonie użyj biblioteki PyJWT z zależnością kryptograficzną, instalowanej przez pip install pyjwt[crypto] według jej dokumentacji. W terminalu na Macu dodaj cudzysłowy: pip install "pyjwt[crypto]", inaczej zsh odrzuci nawiasy kwadratowe.
import time
import jwt
KEY_ID = "XXXXXXXXXX"
ISSUER_ID = "twoj-issuer-id"
with open("AuthKey_XXXXXXXXXX.p8") as f:
private_key = f.read()
now = int(time.time())
token = jwt.encode(
{"iss": ISSUER_ID, "iat": now, "exp": now + 20 * 60, "aud": "appstoreconnect-v1"},
private_key,
algorithm="ES256",
headers={"kid": KEY_ID, "typ": "JWT"},
)
print(token)
Potem wysyłasz go w nagłówku Authorization, jak w przykładzie Apple:
curl -H "Authorization: Bearer $TOKEN" "https://api.appstoreconnect.apple.com/v1/apps"
Uruchomiłem ten skrypt 3 listopada 2026 z jednorazowym kluczem wygenerowanym na moim komputerze: nagłówek i treść tokenu zgadzają się ze stroną Apple, a podpis ES256 się weryfikuje. Nie wysłałem go do API Apple z tym testowym kluczem, który u Apple nie istnieje. Używaj tego samego tokenu, dopóki jest ważny: Apple zaleca to dla lepszej wydajności.
Unieważnianie klucza
Unieważnij klucz, gdy tylko zostanie zgubiony, skompromitowany albo gdy żadne narzędzie już go nie używa. Według pomocy App Store Connect, z konta Account Holder lub Admin:
- Otwórz Users and Access, a potem Integrations.
- Wybierz Team Keys lub Individual Keys, a potem kliknij Edit.
- Zaznacz klucze do unieważnienia, a potem Revoke Key.
- Potwierdź przyciskiem Revoke.
Unieważnionego klucza nigdy nie da się przywrócić. Apple wyświetla go przez 30 dni w sekcji Revoked. Każde narzędzie, które go używało, przestaje się uwierzytelniać. W Expo komunikat brzmi „App Store Connect rejected the API authentication credentials”. Ten komunikat i inne błędy wysyłki wyjaśniam w artykule błędy wysyłki z EAS i jak je naprawić. Jeśli klucz nie jest skompromitowany, przygotuj nowy, zanim wyłączysz stary. Jeśli jest, Apple każe unieważnić go natychmiast.
Dla twojego własnego klucza indywidualnego: twój profil, Individual API Key, potem Revoke.
Moja checklista klucza .p8
- Account Holder poprosił o dostęp do API.
- Klucz jest zespołowy, jeśli służy do buildów lub profili.
- Jego rola jest najmniejszą, która pokrywa zastosowanie, a nazwa mówi, które narzędzie go używa.
.p8leży poza repozytorium, z restrykcyjnymi uprawnieniami i zaszyfrowaną kopią zapasową.- Issuer ID i Key ID są zapisane osobno, bez pliku.
- Każde narzędzie ma swój klucz, żeby można było unieważnić tylko jeden.
Automatyzuj publikację, nie zostawiając w niej klucza
Klucz to tylko jeden element całej drogi. iOS & Android Kit startuje od kodu bazowego moich aplikacji, razem z subskrypcjami, i prowadzi przez cztery etapy aż do App Store, w twoim tempie. Jeśli podłączasz RevenueCat tym kluczem, pełną konfigurację znajdziesz w artykule RevenueCat i subskrypcja in-app na iOS.
Jeśli przygotowujesz swoją pierwszą premierę, zrób darmową diagnozę: powie ci, co naprawdę cię blokuje, i wyśle ci moją checklistę przeciw odrzuceniom przez Apple. Strona publikacja aplikacji w App Store omawia każdy etap, od strony aplikacji po zatwierdzenie.
Najczęściej zadawane pytania
Jak utworzyć klucz API App Store Connect?
Account Holder najpierw prosi o dostęp do API. Następnie Admin otwiera Users and Access, zakładkę Integrations, App Store Connect API, Team Keys. Klika Generate API Key, wybiera nazwę i rolę, generuje klucz, a potem pobiera plik .p8.
Czy można ponownie pobrać zgubiony klucz .p8?
Nie. Plik pobierasz tylko raz, a Apple nie zachowuje żadnej kopii. Unieważnij zgubiony klucz, wygeneruj nowy i zaktualizuj każde narzędzie, które go używało.
Gdzie znaleźć Issuer ID i Key ID?
W App Store Connect, w menu Users and Access, zakładka Integrations. Issuer ID wyświetla się u góry strony. Key ID jest na liście aktywnych kluczy. Klucz indywidualny nie używa Issuer ID.
Jaką rolę nadać kluczowi używanemu przez Expo?
Poradnik Expo podaje rolę Admin. Według tabeli ról Apple App Manager wystarcza do wysyłania buildów oraz tworzenia certyfikatów i profili. Taką rolę ma mój klucz, używany do moich buildów Expo.
Czy można zmienić rolę klucza API?
Nie. Apple nie pozwala zmienić ani nazwy, ani roli klucza po jego utworzeniu. Unieważnij go i wygeneruj nowy z właściwą rolą.
Czy klucz API App Store Connect wygasa?
Strony Apple nie wspominają o wygasaniu klucza, tylko o jego unieważnieniu. Wygasają tokeny nim podpisane, po maksymalnie 20 minutach dla większości żądań.

