CloudKitJS服务器到服务器配置

CloudKitJS Server to Server Configure

本文关键字:服务器配置 服务器 CloudKitJS      更新时间:2023-09-26

我很难让它工作。我一直得到以下错误:

[Error: No key provided to sign]

这是我的配置代码:

CloudKit.configure({
  services: {
    fetch: fetch
  },
  containers: [{
    containerIdentifier: 'iCloud.io.shakd.Command-Center',
    environment: 'development',
    serverToServerKeyAuth: {
        keyID: "MyKeyId",
        privateKeyFile: "./eckey.pem",
        privateKeyPassPhrase: "MyPassPhrase"
    }
  }]
})

另外,什么是privateKeyPassPhrase?是在终端中生成的代码吗?

苹果公司在CloudKit Catalog:An Introduction to CloudKit(Cocoa和JavaScript)上的示例代码显示,privateKeyFile所需的语法是将__dirname(执行Node脚本的目录)前置到eckey.pem文件。来自config.js:

serverToServerKeyAuth: {
    keyID: '<insert key ID>',
    privateKeyFile: __dirname + '/eckey.pem'
}

第二个关键信息是,在配置CloudKit之后,您必须使用setUpAuth()显式登录。来自index.js:

var container = CloudKit.getDefaultContainer();
var database = container.publicCloudDatabase; // We'll only make calls to the public database.
// Sign in using the keyID and public key file.
container.setUpAuth().then(function (userInfo) {
    println("userInfo", userInfo);
    return database.performQuery({ recordType: 'Test' });
}).then(function (response) {
    println("Queried Records", response.records);
}).catch(function (error) {
    console.warn(error);
});

在我的JavaScript代码中进行了这两次更改后,我的脚本通过了读写CloudKit数据库的身份验证。

如果您的privateKeyFile是用密码短语加密的,那么您只需要privateKeyPassPhrase。

错误

[Error: No key provided to sign] 

直接来自节点的加密模块。

看起来你的eckey.pem文件不包含私钥。您可以尝试以下方法进行验证:

var fs = require('fs');
var crypto = require('crypto');
var privateKey = fs.readFileSync('./eckey.pem', 'utf8');
var signer = crypto.createSign('RSA-SHA256');
signer.update('message');
console.log(signer.sign(privateKey, 'base64'));

如果有效,那么您的配置应该是:

CloudKit.configure({
  services: {
    fetch: fetch
  },
  containers: [{
    containerIdentifier: 'iCloud.io.shakd.Command-Center',
    environment: 'development',
    serverToServerKeyAuth: {
        //that looks suspicious, please use the real keyID
        keyID: "MyKeyId",
        privateKeyFile: "./eckey.pem"
    }
  }]
})