Как аутентифицировать пользователя Game Center с сервера стороннего узла node.js
мы пытались получить новый метод iOS Game Center GKPlayer,generateIdentityVerificationSignatureWithCompletionHandlerработая так, чтобы мы могли надежно полагаться на учетные данные Game Center для аутентификации. Мы'использовать Node.js в качестве внутреннего сервера, и япытался проверить подпись, но безрезультатно.
Вот код на стороне сервера, который у меня есть - если естьЛюбой, кто может вмешиваться в то, чтоотсутствует, этобуду признателен. На вопрос был дан ответ несколько здесь:Как аутентифицировать GKLocalPlayer на моем компьютере?сторонний сервер '?, но Node.js не имеетЭто было специально решено. Обратите внимание, что приведенный ниже код неt обеспечивает действительность сертификата с подписывающим органом (пока).
//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);
}
});
});
Одна вещь, которую яс помощью модуля crypto в файле 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 (так как верификатор позаботится об этом). Я'мы изменили код выше для "сделай так, чтоб это работало", Надеюсь, это поможет любому, кто сталкивается с этим.