为了账号安全,请及时绑定邮箱和手机立即绑定

CloudKit 服务器到服务器身份验证:继续获取 401 身份验证失败

CloudKit 服务器到服务器身份验证:继续获取 401 身份验证失败

慕田峪7331174 2023-04-25 17:08:37
我最近一直在探索 CloudKit 和相关框架。我与我的应用程序以及使用 CloudKitJS 的网站进行了通信。我挣扎的地方是服务器到服务器的通信(我需要从csv中的公共数据库导出数据。我已经尝试过其他人建议的Python 包requests-cloudkit 。我创建了一个服务器到服务器令牌,并且在创建 eckey.pem 文件后仅复制了 START 和 END 行之间的密钥。然后我得到了这段代码:from requests_cloudkit import CloudKitAuthfrom restmapper import restmapperimport jsonKEY_ID = '[my key ID from CK Dashboard]'SECRET_FILE_KEY = 'eckey.pem'AUTH = CloudKitAuth(KEY_ID, SECRET_FILE_KEY)PARAMS = {        'query':{                'recordType': '[my record type]'        },}CloudKit = restmapper.RestMapper("https://api.apple-cloudkit.com/database/1/[my container]/development/")cloudkit = CloudKit(auth=AUTH)response = cloudkit.POST.public.records.query(json.dumps(PARAMS))然后我收到401 身份验证失败的响应。我坚持了好几天,所以如果有任何帮助或建议,我将不胜感激。😊
查看完整描述

1 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

创建服务器到服务器密钥是重要的第一步,但为了在此之后发出 HTTP 请求,您必须对每个请求进行签名。


这有点令人费解,但您必须仔细构建签名标头以包含在您发出的每个请求中。我不熟悉如何在 Python 中执行此操作,但这是我在 NodeJS 中执行此操作的方法,这可能会有所帮助:

//Get the timestamp in a very specific format

let date = moment().utc().format('YYYY-MM-DD[T]HH:mm:ss[Z]')


//Construct the subpath

let endpoint = '/records/lookup'

let path = '/database/1/iCloud.*****/development/public'

let subpath = path+endpoint


//Get the key file

let privateKeyFile = fs.readFileSync('../../'+SECRET_FILE_KEY, 'utf8')


//Make a string out of your JSON query

let query = {

  recordType: '[my record type]'

}

let requestBody = JSON.stringify(query)


//Hash the query

let bodyHash = crypto.createHash('sha256').update(requestBody, 'utf8').digest('base64')


//Assemble the components you just generated in a special format

//[Current date]:[Request body]:[Web service URL subpath]

let message = date+':'+bodyHash+':'+subpath

  

//Sign it

let signature = crypto.createSign('RSA-SHA256').update(message).sign(privateKeyFile, 'base64')


//Assemble your headers and include them in your HTTP request

let headers = {

  'X-Apple-CloudKit-Request-KeyID': KEY_ID,

  'X-Apple-CloudKit-Request-ISO8601Date': date,

  'X-Apple-CloudKit-Request-SignatureV1': signature

}

起初这有点毛茸茸,但我只是将所有这些东西放在一个函数中,每当我需要发出请求时我都会重用它。


Apple 的文档几乎已被废弃,如今很难找到有关 CloudKit Web 服务的好帮助。


查看完整回答
反对 回复 2023-04-25
  • 1 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信