Exercício – proteger payloads de webhook com um segredo
Neste exercício, você protegerá sua carga útil do webhook com um segredo e aprenderá a validar se as cargas úteis são realmente do GitHub usando sua Função do Azure.
Obter uma chave para a sua Função do Azure
No portal do Azure, retorne ao Aplicativo de Função que você criou no primeiro exercício no módulo.
No painel de menu esquerdo, em Funções, selecione Funções. O painel Funções é apresentado para a Aplicação de Funções.
Selecione o HttpTrigger1 que você criou. O painel HtttpTrigger1 é exibido para sua função.
No painel de menu esquerdo, em Desenvolvedor, selecione Código + Teste. O painel Código + Teste é exibido para sua Função.
No ficheiro JavaScript index.js da sua função, adicione uma referência à biblioteca crypto-js no início do ficheiro, acima da instrução
module.exports
.const Crypto = require('crypto');
Na barra de menu superior, selecione Salvar. O painel Logs aparece na parte inferior do painel.
No painel de menu esquerdo, em Desenvolvedor, selecione Teclas de Função. O painel Teclas de Função é apresentado para a sua Função.
Na coluna Valor, selecione o link Mostrar valor.
Selecione o ícone Copiar para área de transferência e salve essa chave para uso na próxima etapa.
No painel de menu esquerdo, em Desenvolvedor, selecione Código + Teste. O painel Código + Teste é exibido para sua Função.
No bloco de código, após a
context.log
instrução, adicione o código a seguir. Substitua <a chave> padrão pela chave padrão que você acabou de copiar para a área de transferência:const hmac = Crypto.createHmac("sha1", "<default key>"); const signature = hmac.update(JSON.stringify(req.body)).digest('hex');
Este código calcula o hash da chave através do mesmo mecanismo do GitHub.
Adicione outro
const
que se antecipesha1=
ao início da chave, para que corresponda ao formato de no cabeçalho dax-hub-signature
solicitação. Adicione o código seguinte à sua função.const shaSignature = `sha1=${signature}`;
Adicione o código seguinte para obter a assinatura do GitHub a partir do cabeçalho do pedido:
const gitHubSignature = req.headers['x-hub-signature'];
Compare as duas cadeias. Caso correspondam, processe o pedido da seguinte forma:
if (!shaSignature.localeCompare(gitHubSignature)) { // Existing code if (req.body.pages[0].title) { ... } else { ... } }
Se as cadeias não corresponderem, devolva uma resposta HTTP 401 (Não Autorizado) com uma mensagem a indicar ao remetente que as assinaturas não correspondem.
if (!shaSignature.localeCompare(gitHubSignature)) { ... } else { context.res = { status: 401, body: "Signatures don't match" }; }
A função concluída deve ter um aspeto semelhante ao seguinte:
const Crypto = require('crypto'); module.exports = async function (context, req) { context.log('JavaScript HTTP trigger function processed a request.'); const hmac = Crypto.createHmac("sha1", "<default key>"); const signature = hmac.update(JSON.stringify(req.body)).digest('hex'); const shaSignature = `sha1=${signature}`; const gitHubSignature = req.headers['x-hub-signature']; if (!shaSignature.localeCompare(gitHubSignature)) { if (req.body.pages[0].title) { context.res = { body: "Page is " + req.body.pages[0].title + ", Action is " + req.body.pages[0].action + ", Event Type is " + req.headers['x-github-event'] }; } else { context.res = { status: 400, body: ("Invalid payload for Wiki event") } } } else { context.res = { status: 401, body: "Signatures don't match" }; } };
Na barra de menu superior, selecione Salvar. O painel Logs aparece com uma instrução Connected! .
Atualizar o segredo do webhook
Mude para a sua conta do GitHub no portal do GitHub.
Selecione o seu repositório.
Na barra de menu superior, selecione Configurações. O painel Configurações é exibido.
Na barra lateral, selecione Webhooks. O painel Webhooks é exibido.
Selecione Edit (Editar) junto ao seu webhook.
Na caixa de texto Segredo , introduza a tecla predefinida da sua função que guardou anteriormente neste exercício.
Role para baixo até a parte inferior da página e selecione Atualizar webhook. O painel Webhooks/Manage webhooks é exibido.
Testar o webhook e a Função do Azure
Selecione a guia Entregas recentes .
Selecione a entrada de entrega mais recente (superior) selecionando o botão de reticências (...).
Selecione Redeliver (Enviar novamente). Na caixa de diálogo Reentregar carga útil? exibida, selecione Sim, reentregar esta carga.
Esta ação simula você editando sua página Wiki novamente.
Selecione a entrada de entrega mais recente (superior) selecionando o botão de reticências (...).
Na seção Cabeçalhos, você verá o
x-hub-signature
arquivo . Também verá o código de resposta 200 a indicar que o pedido foi processado com êxito.Request URL: https://testwh123456.azurewebsites.net/api/HttpTrigger1?code=aUjXIpqdJ0ZHPQuB0SzFegxGJu0nAXmsQBnmkCpJ6RYxleRaoxJ8cQ%3D%3D Request method: POST content-type: application/json Expect: User-Agent: GitHub-Hookshot/16496cb X-GitHub-Delivery: ce122460-6aae-11e9-99d4-de6a298a424a X-GitHub-Event: gollum X-Hub-Signature: sha1=<hash of default key>
Testar uma assinatura inválida
No portal GitHub, na página webhooks, selecione a guia Configurações .
Na caixa Teste secreto, selecione Alterar segredo.
Introduza uma cadeia aleatória, desloque-se para baixo e selecione Update webhook (Atualizar o webhook).
A chave utilizada pelo webhook já não deve corresponder à chave esperada pela função do Azure.
Selecione a guia Entregas recentes .
Selecione a entrada de entrega mais recente (superior) selecionando o botão de reticências (...).
Selecione Reentregar e, na caixa de diálogo Reentregar carga útil exibida, selecione Sim, reentregar esta carga.
Desta vez, verá o código de resposta 401 a indicar que o pedido não foi autorizado.
Selecione a última entrada de entrega (superior) (reentrega) selecionando o botão de reticências (...).
Selecione a guia Resposta e, na seção Corpo , verifique se a mensagem "Assinaturas não correspondem" aparece.