Ошибка 401 при межсерверной аутентификации CloudKit на Node JS
Я пытаюсь запросить свою общедоступную базу данных CloudKit, используя межсерверную аутентификацию. Я сгенерировал ключ в соответствии с документами Apple, но независимо от того, что я делаю, я получаю эту ошибку:
401 - Unauthorized
data: {
uuid: '...',
serverErrorCode: 'AUTHENTICATION_FAILED',
reason: 'no auth method found'
}
Насколько я могу судить, я настроил все согласно документации, но, очевидно, я что-то делаю не так. Вот что у меня есть в приложении Node на данный момент:
let date = moment().format('YYYY-MM-DD[T]HH:mm:ss[Z]')
let domain = 'https://api.apple-cloudkit.com'
let subpath = '/database/1/iCloud.<my container>/development/public/users/current'
let key = fs.readFileSync(__dirname +'/../eckey.pem', 'utf8')
let keyID = 'abc123...'
let requestBody = ''
let bodyHash = crypto.createHash('SHA256').update(requestBody).digest('base64')
let message = date+':'+bodyHash+':'+subpath
let signature = crypto.createSign('RSA-SHA256').update(message).sign(key, 'base64')
let headers = {
'X-Apple-CloudKit-Request-KeyID': keyID,
'X-Apple-CloudKit-Request-ISO8601Date': date,
'X-Apple-CloudKit-Request-SignatureV1': signature
}
try{
await axios.post(domain+subpath, requestBody, { headers: headers })
console.log('--- :) ---')
}catch(error){
console.log('=== :( ===')
console.log(error)
}
Я уже просмотрел этот полезный пост SO, но я все еще застрял.
Кто-нибудь может понять, что я делаю не так?
1 ответ
Чтобы понять это, мне пришлось проделать массу поисков и устранения неполадок, но ради потомков вот в чем я ошибся:
=== Исправление №1 ===
Моя дата генерировала местное время, которое было неточным, потому что формат подразумевает время Zulu/UTC (из-за Z
).
Исправление заключалось в том, чтобы добавить .utc()
к моменту:
let date = moment().utc().format('YYYY-MM-DD[T]HH:mm:ss[Z]')
=== Исправление №2 ===
Видимо Axios не понравилось, как я форматировал запрос. Изменив его на это (сbaseURL
а также url
раздельный) работает:
let response = await axios({
method: 'post',
baseURL: baseURL,
url: '/records/modify',
data: query,
headers: headers
})
Кажется, теперь все отлично работает с этими исправлениями.