# Kunci API App Store Connect (.p8): cara cipta dan guna

> Kunci API App Store Connect (.p8) hanya boleh dimuat turun sekali. Peranan, Issuer ID, Key ID, pembatalan, dan penggunaannya dengan Expo, fastlane atau skrip.

Halaman asal: [Kunci API App Store Connect (.p8): cara cipta dan guna](https://devoria.fr/ms/blog/kunci-api-app-store-connect-p8)
Pengarang: [Mehdi Azizi](https://devoria.fr/ms/mehdi-azizi)
Diterbitkan: 2026-11-04
Semakan kandungan terakhir: 2026-11-04


Kunci API App Store Connect membolehkan sesuatu alat, seperti EAS, fastlane, RevenueCat atau skrip anda sendiri, bertindak pada akaun anda tanpa kata laluan dan tanpa pengesahan dua faktor. **Apple menyimpan separuh awam kunci itu, dan anda memuat turun separuh peribadinya, iaitu fail `.p8`, sekali sahaja.** Dengan fail ini, Issuer ID dan Key ID, anda menandatangani token yang sah paling lama 20 minit untuk kebanyakan permintaan.

Saya menerbitkan app iOS saya, termasuk TradaZen dan Nolera, dengan Expo. Satu kunci pasukan berperanan App Manager digunakan untuk RevenueCat, build Expo saya dan satu alat baris perintah yang menyunting halaman app saya. Panduan ini berdasarkan halaman Apple, Expo dan fastlane yang saya semak pada 3 November 2026. Jangan keliru dengan kunci perkhidmatan yang diselitkan dalam kod app: itu dibincangkan dalam [kunci API rahsia dalam app Expo](https://devoria.fr/ms/blog/kunci-api-rahsia-aplikasi-expo).

## Apa yang dilakukan oleh kunci API App Store Connect

Menurut [dokumentasi Apple](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), API App Store Connect memerlukan token JWT untuk setiap permintaan. Anda menjananya dan menandatanganinya dengan kunci peribadi anda. Kunci ini hanya untuk API ini: anda tidak boleh menggunakannya untuk perkhidmatan Apple yang lain.

Kelebihannya boleh diringkaskan dalam satu ayat: **tiada sesiapa perlu mengesahkan log masuk.** Apple ID anda tersekat pada pengesahan dua faktor, dan itu menghalang sebarang automasi. Panduan [EAS Submit iOS](https://devoria.fr/ms/blog/eas-submit-ios-terbitkan-app-expo-app-store) menunjukkan perbezaannya untuk menghantar app Expo.

## Sebelum apa-apa: mohon akses ke API

Kunci pertama tidak boleh terus dicipta. [Bantuan App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api) jelas: **Account Holder mesti memohon akses ke API terlebih dahulu.** Dia membuka Users and Access, klik Integrations, kemudian Request Access. Apple menilai permohonan satu per satu.

Account Holder ialah orang yang mendaftarkan akaun. Kalau anda baru bermula, itu anda: panduan [akaun pembangun Apple](https://devoria.fr/ms/blog/akaun-pembangun-apple-harga-percuma-atau-berbayar) menerangkan pendaftarannya.

## Kunci pasukan atau kunci individu

Apple menawarkan dua jenis kunci. Ini perbezaannya, diambil daripada [dokumentasi](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) dan [bantuan App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api):

| Kriteria                     | Kunci pasukan               | Kunci individu               |
| ---------------------------- | --------------------------- | ---------------------------- |
| Siapa boleh menjananya       | Account Holder atau Admin   | Hampir semua pengguna        |
| App yang boleh diakses       | Semua, tanpa kecuali        | App milik pengguna itu       |
| Hak                          | Peranan yang dipilih        | Hak pengguna itu             |
| Bilangan kunci               | Beberapa                    | Satu aktif bagi setiap orang |
| Sijil dan profil             | Ya, bergantung pada peranan | Tidak                        |
| Jualan, kewangan, notaryTool | Bergantung pada peranan     | Tidak                        |
| Medan token                  | `iss` = Issuer ID           | `sub` = `user`               |

"Hampir semua pengguna" bermaksud, menurut Apple: Account Holder, Admin, App Manager, Customer Support, Developer dan Marketing, kecuali jika Admin atau Account Holder telah menarik balik hak mereka untuk menjana kunci individu.

**Untuk Expo atau fastlane, pilih kunci pasukan.** Kunci individu tidak boleh mengakses titik akhir provisioning, iaitu yang mencipta sijil dan profil. [Dokumentasi fastlane](https://docs.fastlane.tools/app-store-connect-api/) mengesahkannya: kunci pasukan diperlukan untuk sebarang akses berkaitan provisioning.

## Peranan apa untuk kunci anda

Kunci pasukan boleh mengakses semua app dalam akaun, apa pun peranannya. Peranan menentukan apa yang boleh dilakukannya. **Apple memberi amaran bahawa kunci Admin boleh mencipta dan memadam pengguna**: beri peranan paling kecil yang meliputi keperluan anda. Hak di bawah diambil daripada [jadual peranan Apple](https://developer.apple.com/help/account/access/roles/).

| Kegunaan kunci                           | Peranan yang membenarkannya    |
| ---------------------------------------- | ------------------------------ |
| Menghantar build                         | Admin, App Manager, Developer  |
| Mengurus build TestFlight                | Admin, App Manager             |
| Mencipta sijil dan profil                | Admin, App Manager             |
| Menghantar app untuk semakan             | Admin, App Manager             |
| Mengimport produk dan harga (RevenueCat) | Sekurang-kurangnya App Manager |
| Menjana kunci pasukan lain               | Admin                          |

Baris RevenueCat datang daripada [dokumentasinya](https://www.revenuecat.com/docs/service-credentials/itunesconnect-app-specific-shared-secret/app-store-connect-api-key-configuration). Panduan Expo pula [memberi peranan Admin](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md) kepada kunci. Untuk app saya, peranan App Manager sudah cukup: EAS mencipta profil pengedaran dengannya, dan RevenueCat mengimport produk.

Selepas kunci dijana, [anda tidak boleh lagi mengubah nama atau peranannya](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api). Untuk menukarnya, anda perlu membatalkannya dan menjana kunci lain.

## Cipta kunci pasukan, langkah demi langkah

Anda perlukan akaun Admin atau Account Holder. Menurut [Apple](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api):

1. **Buka Users and Access**, kemudian tab Integrations.
2. **Pilih App Store Connect API** di lajur kiri, kemudian tab Team Keys.
3. **Klik Generate API Key**, atau butang +.
4. **Beri nama kepada kunci.** Nama itu hanya untuk anda, ia bukan sebahagian daripada kunci. Namakan mengikut alat yang akan menggunakannya.
5. **Pilih peranan** di bawah Access, kemudian klik Generate.
6. **Muat turun kunci peribadi** melalui pautan Download API Key.

> Pautan muat turun hilang sebaik sahaja anda memuat turun fail, dan Apple tidak menyimpan sebarang salinan. Simpan `.p8` sebelum menutup halaman.

Kemudian catat dua pengecam itu. Menurut [halaman Apple tentang token](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests), **Issuer ID dipaparkan di bahagian atas halaman Integrations**, dengan butang Copy. Key ID muncul dalam senarai kunci aktif: halakan tetikus padanya untuk memaparkan Copy Key ID. Issuer ID sama untuk semua kunci pasukan dalam akaun. Key ID unik bagi setiap kunci.

Untuk kunci individu, lebih ringkas: buka profil pengguna anda, tatal ke Individual API Key dan klik Generate API Key. Muat turunnya juga sekali sahaja.

## Simpan fail .p8

Apple meminta anda melayan kunci ini seperti kata laluan: **jangan kongsikannya, jangan simpan dalam repositori kod, jangan sekali-kali masukkan ke dalam kod app.** Rutin saya:

- **Folder di luar projek**, atau pengurus rahsia alat integrasi berterusan anda.
- **Folder kunci dalam `.gitignore` anda**, jika fail itu perlu berada dalam projek semasa penghantaran.
- **Kebenaran yang ketat.** Satu alat baris perintah untuk App Store Connect menolak `.p8` saya selagi fail itu boleh dibaca oleh akaun lain. `chmod 600` menyelesaikan masalah itu.
- **Satu kunci bagi setiap alat.** Apple membenarkan anda [menjana beberapa kunci](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), dengan peranan pilihan anda.

Perkara terakhir ini saya tidak buat pada mulanya. Kunci App Manager saya digunakan serentak oleh RevenueCat, build saya dan alat halaman app saya. Kalau saya perlu membatalkannya, tiga alat rosak sekali gus. **Kalau saya boleh ulang, saya akan cipta satu kunci bagi setiap alat**, supaya boleh memutuskan satu tanpa menjejaskan yang lain.

## Gunakan dengan Expo

Tiga cara memberikan kunci kepada EAS:

- **Biar EAS menguruskannya.** `eas credentials --platform ios` boleh mencipta kunci dan menyimpannya di pelayan Expo. Ini cara paling mudah.
- **Isytiharkan dalam `eas.json`.** Profil `submit` menerima `ascApiKeyPath`, `ascApiKeyIssuerId` dan `ascApiKeyId`. Menurut [rujukan eas.json](https://docs.expo.dev/eas/json/), medan ini menerima pemboleh ubah persekitaran, seperti `$ASC_API_KEY_PATH`.
- **Hantar melalui persekitaran.** [Repositori EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/README.md) mendokumenkan `EXPO_ASC_API_KEY_PATH`, `EXPO_ASC_KEY_ID` dan `EXPO_ASC_ISSUER_ID`. Untuk kunci individu, Issuer ID ditinggalkan.

Satu had yang perlu diketahui untuk build: [Expo menyatakan](https://docs.expo.dev/build-reference/ios-capabilities/) bahawa API rasmi tidak boleh mengaitkan App Group, Merchant ID atau bekas CloudKit. Anda perlu log masuk dengan Apple ID anda, secara tempatan. Saya mengalaminya pada Nolera dengan kumpulan app untuk widgetnya: kunci itu mengaktifkan keupayaan, tetapi tidak mengaitkan kumpulan. Saya membuat kaitan itu dalam portal pembangun Apple. **Jika penyegerakan keupayaan tersekat, `EXPO_NO_CAPABILITY_SYNC=1` mematikannya**, dan anda aktifkan keupayaan itu sendiri pada pengecam app. Penandatanganan build diterangkan dalam [sijil dan provisioning profile iOS](https://devoria.fr/ms/blog/sijil-pembangun-ios-provisioning-profile-expo).

## Gunakan dengan fastlane

[fastlane](https://docs.fastlane.tools/app-store-connect-api/) membaca kunci daripada fail JSON. Medan `key_id`, `issuer_id` dan `key`, iaitu kandungan `.p8`, adalah wajib. `duration` dan `in_house` adalah pilihan. Nilai contoh:

```json
{
  "key_id": "XXXXXXXXXX",
  "issuer_id": "your-issuer-id",
  "key": "-----BEGIN PRIVATE KEY-----\nMIGT...\n-----END PRIVATE KEY-----",
  "duration": 1200,
  "in_house": false
}
```

Kemudian anda hantar fail ini kepada satu tindakan, contohnya `fastlane pilot distribute --api_key_path fastlane/cle.json`. Dalam Fastfile, tindakan `app_store_connect_api_key` menerima `key_id`, `issuer_id` dan `key_filepath`. Tempoh sesi tidak melebihi 1,200 saat, iaitu 20 minit. Bukan semua tindakan menyokongnya: contohnya, fastlane menyatakan bahawa `produce` dan `pem` tidak berfungsi dengan kunci API.

## Gunakan dalam skrip anda sendiri

Tanpa alat, anda bina token sendiri. [Apple menetapkan resipinya](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests):

- **Pengepala**: `alg` bernilai `ES256`, `kid` bernilai Key ID anda, `typ` bernilai `JWT`.
- **Kandungan, kunci pasukan**: `iss`, Issuer ID anda; `iat`, masa dicipta; `exp`, masa tamat; `aud`, bernilai `appstoreconnect-v1`.
- **Kandungan, kunci individu**: `sub` bernilai `user` sebagai ganti `iss`.
- **Tempoh**: melebihi 20 minit, Apple menolak token untuk kebanyakan permintaan.

Dalam Python, dengan pustaka PyJWT dan kebergantungan kriptografinya, dipasang dengan `pip install pyjwt[crypto]` menurut [dokumentasinya](https://pyjwt.readthedocs.io/en/stable/installation.html). Dalam terminal Mac, gunakan tanda petik: `pip install "pyjwt[crypto]"`, jika tidak zsh menolak tanda kurung siku.

```python
import time
import jwt

KEY_ID = "XXXXXXXXXX"
ISSUER_ID = "your-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)
```

Kemudian anda hantarnya dalam pengepala `Authorization`, seperti dalam contoh Apple:

```bash
curl -H "Authorization: Bearer $TOKEN" "https://api.appstoreconnect.apple.com/v1/apps"
```

Saya menjalankan skrip ini pada 3 November 2026 dengan kunci pakai buang yang dijana pada mesin saya: pengepala dan kandungan token sepadan dengan halaman Apple, dan tandatangan ES256 berjaya disahkan. Saya tidak menghantarnya ke API Apple dengan kunci ujian ini, kerana kunci itu tidak wujud di Apple. **Gunakan semula token yang sama selagi ia masih sah**: Apple mengesyorkannya untuk prestasi yang lebih baik.

## Batalkan kunci

Batalkan kunci sebaik sahaja ia hilang, terdedah, atau tidak lagi digunakan oleh mana-mana alat. Menurut [bantuan App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api), dengan akaun Account Holder atau Admin:

1. Buka Users and Access, kemudian Integrations.
2. Pilih Team Keys, atau Individual Keys, kemudian klik Edit.
3. Tandakan kunci yang hendak dibatalkan, kemudian Revoke Key.
4. Sahkan dengan Revoke.

**Kunci yang dibatalkan tidak boleh diaktifkan semula.** [Apple memaparkannya](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) selama 30 hari di bawah Revoked. Setiap alat yang menggunakannya akan gagal disahkan. Dengan Expo, mesejnya ialah "[App Store Connect rejected the API authentication credentials](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts)". Mesej ini dan kegagalan penghantaran lain diterangkan dalam ralat penghantaran dengan EAS dan cara membetulkannya. Jika kunci tidak terdedah, sediakan kunci baharu sebelum memutuskan yang lama. Jika terdedah, Apple meminta anda membatalkannya serta-merta.

Untuk kunci individu anda sendiri: profil anda, Individual API Key, kemudian Revoke.

## Senarai semak kunci .p8 saya

- Account Holder telah memohon akses ke API.
- Kunci itu kunci pasukan jika digunakan untuk build atau profil.
- Peranannya yang paling kecil meliputi kegunaannya, dan namanya menunjukkan alat mana yang menggunakannya.
- `.p8` disimpan di luar repositori, dengan kebenaran ketat dan salinan sandaran yang disulitkan.
- Issuer ID dan Key ID dicatat berasingan, tanpa fail itu.
- Setiap alat ada kuncinya sendiri, supaya boleh membatalkan satu sahaja.

## Automasikan penerbitan anda tanpa mendedahkan kunci

Kunci ini hanya satu bahagian daripada perjalanan. [iOS & Android Kit](https://devoria.fr/ms/kits/ios) bermula daripada kod permulaan app saya, termasuk langganan, dan mengikuti empat langkah hingga ke App Store, mengikut rentak anda. Jika anda menyambungkan RevenueCat dengan kunci ini, persediaan lengkapnya ada dalam [RevenueCat dan langganan dalam app iOS](https://devoria.fr/ms/blog/revenuecat-langganan-dalam-aplikasi-ios).

Jika anda sedang menyediakan pelancaran pertama, [buat diagnostik percuma anda](https://devoria.fr/ms/diagnostic): ia memberitahu apa yang benar-benar menghalang anda dan menghantar senarai semak anti-penolakan Apple saya. Halaman [terbitkan aplikasi di App Store](https://devoria.fr/ms/expertise/terbitkan-aplikasi-di-app-store) merangkumi setiap langkah, dari halaman app hingga kelulusan.

## Soalan lazim

### Bagaimana mencipta kunci API App Store Connect?

Account Holder memohon akses ke API terlebih dahulu. Kemudian, Admin membuka Users and Access, tab Integrations, App Store Connect API, Team Keys. Dia klik Generate API Key, memilih nama dan peranan, menjana kunci, kemudian memuat turun fail `.p8`.

### Bolehkah kunci .p8 yang hilang dimuat turun semula?

Tidak. Fail itu dimuat turun sekali sahaja, dan Apple tidak menyimpan sebarang salinan. Batalkan kunci yang hilang, kemudian jana kunci baharu dan kemas kini setiap alat yang menggunakannya.

### Di mana mencari Issuer ID dan Key ID?

Dalam App Store Connect, menu Users and Access, tab Integrations. Issuer ID dipaparkan di bahagian atas halaman. Key ID ada dalam senarai kunci aktif. Kunci individu tidak menggunakan Issuer ID.

### Peranan apa untuk kunci yang digunakan oleh Expo?

Panduan Expo memberi peranan Admin. Menurut jadual peranan Apple, App Manager sudah cukup untuk menghantar build dan mencipta sijil serta profil. Itulah peranan kunci saya, yang digunakan untuk build Expo saya.

### Bolehkah peranan kunci API diubah?

Tidak. Apple tidak membenarkan nama atau peranan kunci diubah selepas ia dicipta. Batalkannya, kemudian jana kunci baharu dengan peranan yang betul.

### Adakah kunci API App Store Connect tamat tempoh?

Halaman Apple tidak menyebut sebarang tarikh tamat untuk kunci, hanya pembatalannya. Yang tamat tempoh ialah token yang ditandatangani dengannya, selepas paling lama 20 minit untuk kebanyakan permintaan.


## Projek anda

[Review Kit](https://devoria.fr/ms/kits/app-review): Senarai semak review App Store saya, penolakan Apple yang telah saya betulkan, senarai semak Google Play dan tiga skill Claude Code. RM 219.

[iOS & Android Kit](https://devoria.fr/ms/kits/ios): Bina app iPhone dan Android anda dengan Claude Code: kod permulaan app saya, laluan hingga ke store dan semua kit. RM 449.

[Diagnostik: apa yang memisahkan anda daripada app iPhone anda](https://devoria.fr/ms/diagnostic): 7 soalan, 60 saat: anda tahu apa yang benar-benar menghalang anda menerbitkan app iPhone, laluan 4 langkah anda dan kit yang sesuai dengan anda.
