使用App Store Connect API发送POST请求时持续遭遇METHOD_NOT_ALLOWED错误
解决App Store Connect API POST请求返回METHOD_NOT_ALLOWED的问题
结合你的情况,这个问题大概率是JWT Scope格式错误导致的,给你几个排查和修复方向:
1. 修正JWT Payload中的Scope格式
App Store Connect API的Scope不是用POST /v1/certificates这种路径+方法的格式,而是采用资源:操作的格式。比如创建证书对应的正确Scope是certificates:create,创建Profile是profiles:create。
你的JWT Payload应该修改为:
{ "iss": "KEY ISSUER", "iat": Math.floor(Date.now() / 1000), "exp": Math.floor(Date.now() / 1000) + (60 * 10), "aud": "appstoreconnect-v1", "scope": [ "certificates:create" ] }
2. 确认请求头包含正确的Content-Type
POST请求必须携带Content-Type: application/json头,不管是用NodeJS还是curl,都要确保这个头存在。比如curl命令要加-H "Content-Type: application/json",NodeJS的请求配置里也要显式设置。
3. 验证请求URL和请求体格式
- 确认请求URL是
https://api.appstoreconnect.apple.com/v1/certificates,注意是复数形式,没有拼写错误; - 请求体的
type字段必须和端点对应(这里是certificates),certificateType的枚举值要完全匹配(比如IOS_DISTRIBUTION是正确的); csrContent要确保是完整的PEM格式,包括-----BEGIN CERTIFICATE REQUEST-----和-----END CERTIFICATE REQUEST-----,不要有多余的空白字符。
4. 测试用例参考
curl示例(修正后)
curl -X POST "https://api.appstoreconnect.apple.com/v1/certificates" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "data": { "type": "certificates", "attributes": { "certificateType": "IOS_DISTRIBUTION", "csrContent": "-----BEGIN CERTIFICATE REQUEST-----...-----END CERTIFICATE REQUEST-----" } } }'
NodeJS示例(用node-fetch)
const fetch = require('node-fetch'); const jwt = require('jsonwebtoken'); const fs = require('fs'); const privateKey = fs.readFileSync('path/to/your/private-key.p8', 'utf8'); const token = jwt.sign( { iss: 'KEY ISSUER', iat: Math.floor(Date.now() / 1000), exp: Math.floor(Date.now() / 1000) + 600, aud: 'appstoreconnect-v1', scope: ['certificates:create'] }, privateKey, { algorithm: 'ES256', header: { alg: 'ES256', kid: 'KEY ID', typ: 'JWT' } } ); const requestBody = { data: { type: 'certificates', attributes: { certificateType: 'IOS_DISTRIBUTION', csrContent: "-----BEGIN CERTIFICATE REQUEST-----...-----END CERTIFICATE REQUEST-----" } } }; fetch('https://api.appstoreconnect.apple.com/v1/certificates', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify(requestBody) }) .then(res => res.json()) .then(data => console.log(data)) .catch(err => console.error(err));
如果按照以上步骤修正后还是报错,可以检查你的API密钥是否有对应的权限(比如是否开启了Certificates相关的操作权限),或者尝试更换密钥重新生成JWT。
内容的提问来源于stack exchange,提问作者IdoPickle
相关产品推荐
相关产品推荐

