【发布时间】:2014-03-01 11:56:18
【问题描述】:
我一直在尝试让新的 iOS Game Center GKPlayer 方法 generateIdentityVerificationSignatureWithCompletionHandler 正常工作,以便我们可以安全地依赖 Game Center 凭据进行身份验证。我们使用 Node.js 作为后端服务器,我一直在尝试验证签名但无济于事。
这是我拥有的服务器端的代码 - 如果有任何人可以指出缺少的内容,那将不胜感激。这个问题已经在这里得到了一些回答:How to authenticate the GKLocalPlayer on my 'third party server'?,但是 Node.js 还没有被专门解决。请注意,下面的代码并不能确保具有签名机构的证书的有效性(目前)。
//Client sends the payload below
//json.playerId - UTF-8 string
//json.bundleId - UTF-8 string
//json.timestamp - Hex string
//json.salt - base64 encoded
//json.publicKeyURL - UTF-8 string
//json.signature - base64 encoded
var json = JSON.parse(req.body);
console.log(JSON.stringify(json));
//get the certificate
getCertificate(json.publicKeyURL, function(cert){
//read file from fs for now, since getCertificate returns cert in DER format
fs = require('fs');
fs.readFile('/gc-sb.pem', 'utf8', function (err,data) {
if (err) {
console.log(err);
} else {
console.log(data);
var verifier = crypto.createVerify("sha1WithRSAEncryption");
verifier.write(json.playerId, "utf8");
verifier.write(json.bundleId, "utf8");
verifier.write(json.hexTimestamp, "hex");
verifier.write(json.salt, "base64");
var isValid = verifier.verify(data, json.signature, "base64");
console.log("isvalid: " + isValid);
}
});
});
我发现在 node.js 中使用加密模块的一件事是它似乎需要 PEM 格式的证书,我相信从 Apple 检索的格式是 DER。在我弄清楚如何将 DER 文件转换为 PEM 之前,我暂时使用
openssl x509 -in gc-sb.cer -inform der -outform pem -out gc-sb.pem
对我来说最重要的是能够首先验证签名。稍后将转换证书并根据签名机构对其进行验证:)
编辑:我已经弄清楚了——我正在对 playerId、bundleId、timestamp 和 salt 进行哈希处理,然后使用哈希值作为信息进行验证。我只需要将这些信息放入验证器即可在没有 SHA-1 哈希的情况下进行验证(因为验证器会处理它)。我已经修改了上面的代码以“让它工作”。希望这对遇到此问题的人有所帮助。
【问题讨论】:
标签: ios node.js authentication ssl-certificate game-center