Como autenticar o usuário do Game Center no servidor node.j de terceiros
Estou tentando obter o novo método iOS Game Center GKPlayer,generateIdentityVerificationSignatureWithCompletionHandler, trabalhando para que possamos confiar com segurança nas credenciais do Game Center para autenticação. Estamos usando o Node.js como servidor back-end e estou tentando verificar a assinatura, mas sem sucesso.
Aqui está o código que eu tenho no servidor - se houver alguém que possa comentar o que está faltando, isso seria apreciado. A pergunta foi respondida um pouco aqui:Como autenticar o GKLocalPlayer no meu 'servidor de terceiros'?, mas o Node.js não foi abordado especificamente. Observe que o código abaixo não garante a validade do certificado com uma autoridade de assinatura (ainda).
//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);
}
});
});
Uma coisa que descobri usando o módulo de criptografia no node.js é que ele parece querer o certificado no formato PEM, e acredito que o formato recuperado da Apple seja o DER. Até descobrir como converter o arquivo DER para PEM, eu o convertei temporariamente usando
openssl x509 -in gc-sb.cer -inform der -outform pem -out gc-sb.pem
O principal para mim é poder validar a assinatura primeiro. A conversão do certificado e a verificação contra uma autoridade de assinatura ocorrerão mais tarde :)
EDITAR: Eu descobri - eu estava fazendo o hash do playerId, bundleId, timestamp e salt e, em seguida, usando o valor do hash como informações para verificar. Eu precisava apenas colocar essas informações no verificador para verificar sem o hash SHA-1 (já que o verificador cuidará disso). Eu modifiquei o código acima para "fazê-lo funcionar". Espero que isso ajude qualquer um que se depare com isso.