คีย์ API App Store Connect (.p8): วิธีสร้างและใช้งาน
โดย Mehdi Azizi
เผยแพร่เมื่อ , 10 นาที
คีย์ API App Store Connect (.p8) ดาวน์โหลดได้เพียงครั้งเดียว มาดูเรื่องบทบาท, Issuer ID, Key ID, การเพิกถอน และการใช้กับ Expo, fastlane หรือสคริปต์
คีย์ API App Store Connect ช่วยให้เครื่องมืออย่าง EAS, fastlane, RevenueCat หรือสคริปต์ของคุณเอง ทำงานกับบัญชีของคุณได้โดยไม่ต้องใช้รหัสผ่านหรือการยืนยันตัวตนสองขั้นตอน Apple เก็บครึ่งที่เป็นสาธารณะของคีย์ไว้ ส่วนคุณดาวน์โหลดครึ่งที่เป็นส่วนตัว ซึ่งก็คือไฟล์ .p8 ได้เพียงครั้งเดียว เมื่อมีไฟล์นี้ บวกกับ Issuer ID และ Key ID คุณก็เซ็นโทเค็นที่ใช้ได้นานสุด 20 นาทีสำหรับคำขอส่วนใหญ่ได้
ผมเผยแพร่แอป iOS ของผม รวมถึง TradaZen และ Nolera ด้วย Expo ผมใช้คีย์ทีมที่มีบทบาท App Manager หนึ่งดอกกับ RevenueCat, กับการ build ของ Expo และกับเครื่องมือบรรทัดคำสั่งที่ใช้แก้ไขหน้าแอปของผม คู่มือนี้อ้างอิงหน้าเอกสารของ Apple, Expo และ fastlane ที่ผมอ่านทวนเมื่อวันที่ 3 พฤศจิกายน 2026 อย่าสับสนกับคีย์ของบริการต่าง ๆ ที่ใส่ไว้ในโค้ดของแอปนะครับ เรื่องนั้นอยู่ในบทความ คีย์ API ลับในแอป Expo
คีย์ API App Store Connect ทำอะไรได้
ตามเอกสารของ Apple API ของ App Store Connect ต้องใช้โทเค็น JWT ในทุกคำขอ คุณสร้างและเซ็นโทเค็นนี้ด้วยคีย์ส่วนตัวของคุณ คีย์นี้ใช้ได้กับ API นี้เท่านั้น เอาไปใช้กับบริการอื่นของ Apple ไม่ได้
ข้อดีของมันสรุปได้ในประโยคเดียว: ไม่ต้องมีใครมากดยืนยันการเข้าสู่ระบบ Apple ID ของคุณติดการยืนยันตัวตนสองขั้นตอน ซึ่งทำให้ระบบอัตโนมัติทำงานไม่ได้ คู่มือ EAS Submit สำหรับ iOS แสดงให้เห็นว่าเรื่องนี้เปลี่ยนการส่งแอป Expo ไปอย่างไร
ก่อนอื่น: ขอสิทธิ์เข้าถึง API
คุณสร้างคีย์ดอกแรกทันทีไม่ได้ หน้าช่วยเหลือของ App Store Connect บอกไว้ชัดเจน: Account Holder ต้องขอสิทธิ์เข้าถึง API ก่อน โดยเปิด Users and Access คลิก Integrations แล้วคลิก Request Access จากนั้น Apple จะพิจารณาคำขอเป็นราย ๆ ไป
Account Holder คือคนที่สมัครบัญชีนั้น ถ้าคุณเพิ่งเริ่มต้น ก็คือตัวคุณเอง คู่มือ บัญชีนักพัฒนา Apple อธิบายขั้นตอนสมัครไว้อย่างละเอียด
คีย์ทีมหรือคีย์ส่วนบุคคล
Apple มีคีย์ให้สองประเภท นี่คือความแตกต่าง ซึ่งผมสรุปจากเอกสารและหน้าช่วยเหลือของ App Store Connect:
| เกณฑ์ | คีย์ทีม | คีย์ส่วนบุคคล |
|---|---|---|
| ใครสร้างได้ | Account Holder หรือ Admin | ผู้ใช้เกือบทุกคน |
| แอปที่เข้าถึงได้ | ทั้งหมด ไม่มีข้อยกเว้น | แอปของผู้ใช้คนนั้น |
| สิทธิ์ | ตามบทบาทที่เลือก | ตามสิทธิ์ของผู้ใช้ |
| จำนวนคีย์ | หลายดอก | ใช้งานได้คนละหนึ่งดอก |
| ใบรับรองและโปรไฟล์ | ได้ ขึ้นกับบทบาท | ไม่ได้ |
| ยอดขาย การเงิน notaryTool | ขึ้นกับบทบาท | ไม่ได้ |
| ฟิลด์ในโทเค็น | iss = Issuer ID | sub = user |
"ผู้ใช้เกือบทุกคน" ตามที่ Apple ระบุ หมายถึง Account Holder, Admin, App Manager, Customer Support, Developer และ Marketing ยกเว้นกรณีที่ Admin หรือ Account Holder ถอนสิทธิ์สร้างคีย์ส่วนบุคคลของพวกเขาไปแล้ว
ถ้าใช้กับ Expo หรือ fastlane ให้เลือกคีย์ทีม คีย์ส่วนบุคคลเข้าถึง endpoint สำหรับ provisioning ซึ่งเป็นตัวสร้างใบรับรองและโปรไฟล์ไม่ได้ เอกสารของ fastlane ก็ยืนยันว่าการเข้าถึงที่เกี่ยวกับ provisioning ทั้งหมดต้องใช้คีย์ทีม
ควรให้บทบาทอะไรกับคีย์ของคุณ
คีย์ทีมเข้าถึงทุกแอปในบัญชีได้ ไม่ว่าจะมีบทบาทอะไร บทบาทเป็นตัวกำหนดว่ามันทำอะไรได้บ้าง Apple เตือนว่าคีย์ Admin สร้างและลบผู้ใช้ได้ จึงควรให้บทบาทที่เล็กที่สุดที่ครอบคลุมการใช้งานของคุณ สิทธิ์ด้านล่างมาจากตารางบทบาทของ Apple
| การใช้งานคีย์ | บทบาทที่ทำได้ |
|---|---|
| ส่ง build | Admin, App Manager, Developer |
| จัดการ build ใน TestFlight | Admin, App Manager |
| สร้างใบรับรองและโปรไฟล์ | Admin, App Manager |
| ส่งแอปเข้ารีวิว | Admin, App Manager |
| นำเข้าสินค้าและราคา (RevenueCat) | อย่างน้อย App Manager |
| สร้างคีย์ทีมดอกอื่น | Admin |
แถวของ RevenueCat มาจากเอกสารของ RevenueCat ส่วนคู่มือของ Expo ให้บทบาท Admin กับคีย์ แต่สำหรับแอปของผม บทบาท App Manager ก็พอแล้ว EAS ใช้มันสร้างโปรไฟล์สำหรับเผยแพร่ได้ และ RevenueCat ก็นำเข้าสินค้าได้
เมื่อสร้างคีย์แล้ว คุณจะแก้ไขทั้งชื่อและบทบาทของมันไม่ได้อีก ถ้าอยากเปลี่ยน ต้องเพิกถอนแล้วสร้างดอกใหม่
สร้างคีย์ทีมทีละขั้นตอน
คุณต้องใช้บัญชี Admin หรือ Account Holder ตามที่ Apple ระบุ:
- เปิด Users and Access แล้วไปที่แท็บ Integrations
- เลือก App Store Connect API ในคอลัมน์ซ้าย แล้วไปที่แท็บ Team Keys
- คลิก Generate API Key หรือปุ่ม +
- ตั้งชื่อคีย์ ชื่อนี้มีไว้ให้คุณดูเท่านั้น ไม่ได้เป็นส่วนหนึ่งของคีย์ ตั้งตามชื่อเครื่องมือที่จะใช้มัน
- เลือกบทบาท ใต้ Access แล้วคลิก Generate
- ดาวน์โหลดคีย์ส่วนตัว ผ่านลิงก์ Download API Key
ลิงก์ดาวน์โหลดจะหายไปทันทีที่คุณดาวน์โหลดไฟล์ และ Apple ไม่เก็บสำเนาไว้เลย เก็บไฟล์
.p8ให้เรียบร้อยก่อนปิดหน้านั้น
จากนั้นจดตัวระบุทั้งสองไว้ ตามหน้าของ Apple เรื่องโทเค็น Issuer ID แสดงอยู่ด้านบนของหน้า Integrations พร้อมปุ่ม Copy ส่วน Key ID อยู่ในรายการคีย์ที่ใช้งานอยู่ ให้เอาเมาส์ไปวางเพื่อให้ Copy Key ID โผล่ขึ้นมา Issuer ID เหมือนกันสำหรับคีย์ทีมทุกดอกในบัญชี ส่วน Key ID เป็นของคีย์แต่ละดอก
สำหรับคีย์ส่วนบุคคลจะสั้นกว่า: เปิดโปรไฟล์ผู้ใช้ของคุณ เลื่อนลงไปที่ Individual API Key แล้วคลิก Generate API Key การดาวน์โหลดก็ทำได้ครั้งเดียวเช่นกัน
เก็บไฟล์ .p8 ให้ดี
Apple ขอให้ปฏิบัติกับคีย์เหมือนรหัสผ่าน: อย่าแชร์ อย่าเก็บไว้ใน repository โค้ด และอย่าฝังไว้ในโค้ดของแอปเด็ดขาด วิธีที่ผมทำเป็นประจำ:
- โฟลเดอร์นอกโปรเจกต์ หรือตัวจัดการ secret ของเครื่องมือ CI ที่คุณใช้
- ใส่โฟลเดอร์คีย์ไว้ใน
.gitignoreถ้าไฟล์ต้องอยู่ในโปรเจกต์ชั่วคราวระหว่างการส่ง - กำหนดสิทธิ์ไฟล์ให้เข้มงวด เครื่องมือบรรทัดคำสั่งตัวหนึ่งสำหรับ App Store Connect ปฏิเสธไฟล์
.p8ของผม ตราบใดที่บัญชีอื่นยังอ่านไฟล์ได้ พอสั่งchmod 600ปัญหาก็หายไป - หนึ่งคีย์ต่อหนึ่งเครื่องมือ Apple ให้คุณสร้างคีย์ได้หลายดอก ด้วยบทบาทที่คุณเลือก
ข้อสุดท้ายนี้ตอนแรกผมไม่ได้ทำ คีย์ App Manager ของผมใช้ทั้งกับ RevenueCat, กับการ build และกับเครื่องมือแก้หน้าแอป ถ้าต้องเพิกถอน เครื่องมือทั้งสามจะพังพร้อมกัน ถ้าให้ทำใหม่ ผมจะสร้างคีย์แยกสำหรับแต่ละเครื่องมือ เพื่อจะตัดดอกหนึ่งได้โดยไม่กระทบดอกอื่น
ใช้กับ Expo
มีสามวิธีในการส่งคีย์ให้ EAS:
- ให้ EAS จัดการให้
eas credentials --platform iosสร้างคีย์และเก็บไว้บนเซิร์ฟเวอร์ของ Expo ได้ เป็นทางที่ง่ายที่สุด - ประกาศไว้ใน
eas.jsonโปรไฟล์submitรับascApiKeyPath,ascApiKeyIssuerIdและascApiKeyIdตามเอกสารอ้างอิงของ eas.json ฟิลด์เหล่านี้รับตัวแปรสภาพแวดล้อมได้ เช่น$ASC_API_KEY_PATH - ส่งผ่านตัวแปรสภาพแวดล้อม repository ของ EAS CLI ระบุ
EXPO_ASC_API_KEY_PATH,EXPO_ASC_KEY_IDและEXPO_ASC_ISSUER_IDไว้ ถ้าเป็นคีย์ส่วนบุคคลก็ไม่ต้องใส่ Issuer ID
มีข้อจำกัดเรื่อง build ที่ควรรู้: Expo ระบุว่า API ทางการผูก App Group, Merchant ID หรือ CloudKit container ไม่ได้ กรณีนั้นต้องล็อกอินด้วย Apple ID ของคุณบนเครื่อง ผมเจอเรื่องนี้กับ Nolera ตอนทำ App Group ของวิดเจ็ต คีย์เปิด capability ให้ได้ แต่ไม่ผูกกลุ่มให้ ผมเลยไปผูกเองใน developer portal ของ Apple ถ้าการซิงก์ capability ติดขัด EXPO_NO_CAPABILITY_SYNC=1 จะปิดมันไป แล้วคุณก็เปิด capability เองบน App ID รายละเอียดการเซ็น build อยู่ในบทความ ใบรับรองและ provisioning profile ของ iOS
ใช้กับ fastlane
fastlane อ่านคีย์จากไฟล์ JSON ฟิลด์ key_id, issuer_id และ key ซึ่งเป็นเนื้อหาของไฟล์ .p8 เป็นฟิลด์บังคับ ส่วน duration และ in_house ใส่หรือไม่ใส่ก็ได้ ตัวอย่างค่าสมมุติ:
{
"key_id": "XXXXXXXXXX",
"issuer_id": "your-issuer-id",
"key": "-----BEGIN PRIVATE KEY-----\nMIGT...\n-----END PRIVATE KEY-----",
"duration": 1200,
"in_house": false
}
จากนั้นส่งไฟล์นี้ให้ action เช่น fastlane pilot distribute --api_key_path fastlane/cle.json ใน Fastfile action app_store_connect_api_key รับ key_id, issuer_id และ key_filepath ระยะเวลา session ต้องไม่เกิน 1,200 วินาที หรือ 20 นาที และไม่ใช่ทุก action ที่รองรับ เช่น fastlane แจ้งว่า produce และ pem ใช้กับคีย์ API ไม่ได้
ใช้ในสคริปต์ของคุณเอง
ถ้าไม่ใช้เครื่องมือ คุณต้องสร้างโทเค็นเอง Apple กำหนดสูตรไว้แล้ว:
- Header:
algเป็นES256,kidเป็น Key ID ของคุณ,typเป็นJWT - Payload สำหรับคีย์ทีม:
issคือ Issuer ID ของคุณ,iatคือเวลาที่สร้าง,expคือเวลาหมดอายุ,audมีค่าเป็นappstoreconnect-v1 - Payload สำหรับคีย์ส่วนบุคคล: ใช้
subที่มีค่าเป็นuserแทนiss - ระยะเวลา: ถ้าเกิน 20 นาที Apple จะปฏิเสธโทเค็นสำหรับคำขอส่วนใหญ่
ใน Python ใช้ไลบรารี PyJWT พร้อม dependency ด้านการเข้ารหัส ติดตั้งด้วย pip install pyjwt[crypto] ตามเอกสารของมัน ใน Terminal ของ Mac ให้ใส่เครื่องหมายคำพูด: pip install "pyjwt[crypto]" ไม่อย่างนั้น zsh จะไม่ยอมรับวงเล็บเหลี่ยม
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)
จากนั้นส่งมันใน header Authorization ตามตัวอย่างของ Apple:
curl -H "Authorization: Bearer $TOKEN" "https://api.appstoreconnect.apple.com/v1/apps"
ผมรันสคริปต์นี้เมื่อวันที่ 3 พฤศจิกายน 2026 ด้วยคีย์ทิ้งที่สร้างบนเครื่องของผม header และ payload ของโทเค็นตรงกับหน้าของ Apple และลายเซ็น ES256 ตรวจสอบผ่าน ผมไม่ได้ส่งมันไปที่ API ของ Apple ด้วยคีย์ทดสอบนี้ เพราะคีย์นี้ไม่มีอยู่ในระบบของ Apple ใช้โทเค็นเดิมซ้ำตราบที่ยังไม่หมดอายุ Apple แนะนำแบบนี้เพื่อประสิทธิภาพที่ดีกว่า
เพิกถอนคีย์
เพิกถอนคีย์ทันทีที่มันหาย ถูกเจาะ หรือไม่มีเครื่องมือไหนใช้แล้ว ตามหน้าช่วยเหลือของ App Store Connect โดยใช้บัญชี Account Holder หรือ Admin:
- เปิด Users and Access แล้วไปที่ Integrations
- เลือก Team Keys หรือ Individual Keys แล้วคลิก Edit
- ติ๊กคีย์ที่จะเพิกถอน แล้วกด Revoke Key
- ยืนยันด้วย Revoke
คีย์ที่ถูกเพิกถอนแล้วจะเปิดใช้ใหม่ไม่ได้อีกเลย Apple จะแสดงมันไว้ใต้ Revoked เป็นเวลา 30 วัน ทุกเครื่องมือที่เคยใช้คีย์นั้นจะยืนยันตัวตนไม่ผ่าน กับ Expo ข้อความที่ได้คือ "App Store Connect rejected the API authentication credentials" ข้อความนี้และความล้มเหลวในการส่งแบบอื่น ๆ อธิบายไว้ในข้อผิดพลาดตอนส่งด้วย EAS และวิธีแก้ ถ้าคีย์ไม่ได้ถูกเจาะ ให้เตรียมดอกใหม่ไว้ก่อนตัดดอกเก่า แต่ถ้าถูกเจาะ Apple ขอให้เพิกถอนทันที
สำหรับคีย์ส่วนบุคคลของคุณเอง: ไปที่โปรไฟล์ของคุณ, Individual API Key แล้วกด Revoke
เช็กลิสต์คีย์ .p8 ของผม
- Account Holder ขอสิทธิ์เข้าถึง API แล้ว
- ใช้คีย์ทีม ถ้าคีย์ใช้กับการ build หรือโปรไฟล์
- บทบาทเล็กที่สุดที่ครอบคลุมการใช้งาน และชื่อบอกว่าเครื่องมือไหนใช้มัน
- เก็บไฟล์
.p8ไว้นอก repository กำหนดสิทธิ์เข้มงวด และมีสำเนาสำรองที่เข้ารหัส - จด Issuer ID และ Key ID แยกไว้ โดยไม่เก็บรวมกับไฟล์
- แต่ละเครื่องมือมีคีย์ของตัวเอง เพื่อจะเพิกถอนทีละดอกได้
ทำการเผยแพร่ให้เป็นอัตโนมัติโดยไม่ทำคีย์หลุด
คีย์เป็นแค่ชิ้นส่วนหนึ่งของเส้นทางทั้งหมด iOS & Android Kit เริ่มจากโค้ดตั้งต้นของแอปผม รวมระบบสมัครสมาชิกด้วย และพาคุณผ่านสี่ขั้นตอนจนถึง App Store ตามจังหวะของคุณเอง ถ้าคุณเชื่อม RevenueCat ด้วยคีย์นี้ การตั้งค่าทั้งหมดอยู่ใน RevenueCat และการสมัครสมาชิกในแอป iOS
ถ้าคุณกำลังเตรียมเปิดตัวแอปแรก ทำแบบประเมินฟรี แล้วจะรู้ว่าอะไรที่ขวางคุณอยู่จริง ๆ พร้อมรับเช็กลิสต์กันโดน Apple ปฏิเสธของผม หน้า เผยแพร่แอปบน App Store สรุปทุกขั้นตอน ตั้งแต่หน้าแอปจนถึงการอนุมัติ
คำถามที่พบบ่อย
สร้างคีย์ API App Store Connect อย่างไร?
Account Holder ต้องขอสิทธิ์เข้าถึง API ก่อน จากนั้น Admin เปิด Users and Access แท็บ Integrations, App Store Connect API, Team Keys คลิก Generate API Key ตั้งชื่อและเลือกบทบาท สร้างคีย์ แล้วดาวน์โหลดไฟล์ .p8
ดาวน์โหลดคีย์ .p8 ที่หายไปใหม่ได้ไหม?
ไม่ได้ ไฟล์ดาวน์โหลดได้ครั้งเดียว และ Apple ไม่เก็บสำเนาไว้ ให้เพิกถอนคีย์ที่หาย แล้วสร้างดอกใหม่ และอัปเดตทุกเครื่องมือที่เคยใช้มัน
หา Issuer ID และ Key ID ได้ที่ไหน?
ใน App Store Connect เมนู Users and Access แท็บ Integrations Issuer ID แสดงอยู่ด้านบนของหน้า Key ID อยู่ในรายการคีย์ที่ใช้งานอยู่ คีย์ส่วนบุคคลไม่ใช้ Issuer ID
ควรให้บทบาทอะไรกับคีย์ที่ Expo ใช้?
คู่มือของ Expo ให้บทบาท Admin แต่ตามตารางบทบาทของ Apple บทบาท App Manager ก็พอสำหรับส่ง build และสร้างใบรับรองกับโปรไฟล์ นี่คือบทบาทของคีย์ที่ผมใช้ build แอป Expo
เปลี่ยนบทบาทของคีย์ API ได้ไหม?
ไม่ได้ Apple ไม่ให้แก้ไขทั้งชื่อและบทบาทของคีย์หลังสร้างแล้ว ให้เพิกถอน แล้วสร้างดอกใหม่ด้วยบทบาทที่ถูกต้อง
คีย์ API App Store Connect หมดอายุไหม?
หน้าเอกสารของ Apple ไม่ได้พูดถึงการหมดอายุของคีย์ พูดถึงแค่การเพิกถอน สิ่งที่หมดอายุคือโทเค็นที่เซ็นด้วยคีย์นั้น ซึ่งอยู่ได้นานสุด 20 นาทีสำหรับคำขอส่วนใหญ่

