Exercício – Proteger conteúdos do webhook com um segredo
Neste exercício, você protegerá o conteúdo do webhook com um segredo e aprenderá a validar se os conteúdos são realmente do GitHub usando a Função do Azure.
Obter a chave para a sua Função do Azure
No portal do Azure, retorne para seu Aplicativo de Funções criado no primeiro exercício do módulo.
No painel de menu esquerdo, em Functions, selecione Functions. O painel Funções aparece para o seu aplicativo de funções.
Selecione o HttpTrigger1 que você criou. O painel HtttpTrigger1 é exibido para a sua função.
No painel de menu esquerdo, em Desenvolvedor, selecione Código + Teste. O painel Codificar + Testar é exibido para sua função.
No arquivo JavaScript index.js da função, adicione uma referência à biblioteca crypto-js no início do arquivo, acima da instrução
module.exports
.const Crypto = require('crypto');
Na barra de menus superior, selecione Salvar. O painel Logs é exibido na parte inferior do painel.
No painel de menu esquerdo, em Desenvolvedor, selecione Chaves de Função. O painel Chaves de Função é exibido 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 Codificar + Testar é exibido para sua função.
No bloco de código, após a instrução
context.log
, adicione o código a seguir. Substitua <chave padrão> pela chave padrão que você acabou de copiar na área de transferência:const hmac = Crypto.createHmac("sha1", "<default key>"); const signature = hmac.update(JSON.stringify(req.body)).digest('hex');
Esse código calcula o hash da chave usando o mesmo mecanismo que o GitHub.
Adicione outro
const
que precedesha1=
ao início da chave para que corresponda ao formato dox-hub-signature
no cabeçalho da solicitação. Adicione o seguinte código à sua função.const shaSignature = `sha1=${signature}`;
Adicione o seguinte código para recuperar a assinatura do GitHub do cabeçalho da solicitação:
const gitHubSignature = req.headers['x-hub-signature'];
Compare as duas cadeias de caracteres. Se elas corresponderem, processe a solicitação da seguinte maneira:
if (!shaSignature.localeCompare(gitHubSignature)) { // Existing code if (req.body.pages[0].title) { ... } else { ... } }
Se as cadeias de caracteres não corresponderem, retorne uma resposta HTTP 401 (Não Autorizado), com uma mensagem informando o remetente de 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 esta aparência:
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 menus superior, selecione Salvar. O painel Logs é exibido mostrando a instrução Conectado.
Atualizar o segredo do webhook
Alterne para sua conta do GitHub no portal do GitHub.
Selecione seu repositório.
Na barra de menus superior, selecione Configurações. O painel Configurações é exibido.
Na barra lateral, escolha Webhooks. O painel Webhooks é exibido.
Selecione Edit (Editar) ao lado de seu webhook.
Na caixa de texto Segredo, insira a chave padrão de sua função que você salvou anteriormente neste exercício.
Role para a parte inferior da página e selecione Atualizar webhook. O painel Webhooks/Gerenciar webhooks é exibido.
Teste 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 (Entregar Novamente). Na caixa de diálogo Entregar o conteúdo novamente? que aparece, selecione Sim, entregar novamente esse conteúdo.
Essa ação simula que você está 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
. Você também verá que o código de resposta é 200, indicando que a solicitação foi processada 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 do GitHub, na página webhooks, selecione a guia Configurações.
Na caixa de teste Segredo, selecione Alterar Segredo.
Insira uma cadeia de caracteres aleatória, role para baixo e selecione Update webhook (Atualizar webhook).
A chave usada pelo webhook não deve mais corresponder ao esperado 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 Entregar novamente e, na caixa de diálogo Entregar o conteúdo novamente? que aparece, selecione Sim, entregar novamente esse conteúdo.
Neste momento, você verá que o código de resposta é 401, que indica que a solicitação não foi autorizada.
Selecione a entrada de entrega (re-entrega) mais recente (superior) selecionando o respectivo botão de reticências (…).
Selecione a guia Resposta e, na seção Corpo, verifique se a mensagem "As assinaturas não correspondem" aparece.