cloudkit - Node JS 上的 CloudKit 服务器到服务器身份验证出现 401 错误
问题描述
我正在尝试使用服务器到服务器身份验证查询我的公共 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 ===
我的日期生成的本地时间不准确,因为格式暗示 Zulu/UTC 时间(因为Z
)。
解决方法是添加.utc()
到 Moment:
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
})
有了这些修复程序,现在似乎工作得很好。
推荐阅读
- mongodb - MongoDB 中的文档是什么?
- c# - 在 ViewFlipper 中将视图添加到 LinearLayout
- three.js - 如何相对于视口中心移动 a-entities [使用 object3D.position.set(x, y, z) ]
- java - 我想删除最后两个字母形成一个动词并使用 StringBuilder 将其结合
- javascript - 使用nodejs连续存储'get'并将数据存储在mongodb中
- r - 为什么我在加载 tidyverse 包时会出错?
- python - 是否可以从数据库中的字符串数据中获取平均整数值?
- java - 为什么无法从列表中提取文本
- python - 替换数字变量中单个出现的字符串值 - Python Pandas
- c# - LINQ 内部查询返回 null