亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號