如何从第三方node.js服务器validationGame Center用户

我一直在试图获得新的iOS Game Center GKPlayer方法generateIdentityVerificationSignatureWithCompletionHandler ,所以我们可以安全地依靠Game Center凭证进行身份validation。 我们使用Node.js作为后端服务器,我一直在尝试validation签名,但是无济于事。

这里是我有的服务器端的代码 – 如果有人谁可以在什么缺less的钟声,这将不胜感激。 这个问题在这里有所回答: 如何在我的“第三方服务器”上validationGKLocalPlayer? ,但是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中使用encryption模块的一件事是它似乎想要PEM格式的证书,我相信从苹果检索的格式是DER。 直到我找出如何将DER文件转换为PEM,我暂时使用它转换

 openssl x509 -in gc-sb.cer -inform der -outform pem -out gc-sb.pem 

对我来说最重要的是能够首先validation签名。 证书的转换和对签名授权的validation将在以后进行:)

编辑 :我已经想通了 – 我hashing播放器,bundleId,时间戳和盐,然后使用哈希值作为信息来validation。 我需要将这些信息放入validation器,以validation没有SHA-1散列(因为validation器将会处理它)。 我已经修改了上面的代码来“使其工作”。 希望这有助于任何人遇到这个问题。

以下是您如何使用nodejsvalidationgamecenter身份。 它也将der证书格式转换成pem。

 var crypto = require('crypto'); var request = require('request'); var ref = require('ref'); var token = require('./test.json'); request({url: token.publicKeyURL, encoding: null}, function (error, response, body) { if (!error && response.statusCode == 200) { var verifier = crypto.createVerify("sha1"); verifier.update(token.playerId, "utf8"); verifier.update(token.bundleId, "utf8"); var buf = ref.alloc('uint64'); ref.writeUInt64BE(buf, 0, token.timestamp.toString()); verifier.update(buf); verifier.update(token.salt, 'base64'); var pmd = '-----BEGIN CERTIFICATE-----'; var base64 = body.toString('base64'); var size = base64.length; for (var i = 0; i < size; i = i + 64) { var end = i + 64 < size ? i + 64 : size; pmd = pmd + '\n' + base64.substring(i, end); } pmd = pmd + '\n-----END CERTIFICATE-----'; var valid = verifier.verify(pmd, token.signature, "base64"); console.log(valid); } }); 

今天我们注意到需要SHA256来validation用户,SHA1失败。