Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo descreve como assinar uma solicitação HTTP com uma assinatura HMAC (código de autenticação de mensagem baseada em hash).
Note
É recomendável usar os SDKs do Azure para assinar uma solicitação HTTP. A abordagem descrita neste artigo é uma opção de fallback se os SDKs do Azure não puderem ser usados por qualquer motivo.
Neste tutorial, você aprenderá como:
- Crie uma mensagem de solicitação.
- Crie um hash de conteúdo.
- Compute uma assinatura.
- Crie uma cadeia de caracteres do cabeçalho de autorização.
- Adicionar cabeçalhos.
Prerequisites
- Criar uma conta do Azure com uma assinatura ativa. Se você não tiver uma assinatura do Azure, consulte Criar uma conta gratuitamente.
- Instale o Visual Studio.
- Criar um recurso dos Serviços de Comunicação do Azure. Se você não tiver um recurso, consulte Criar um recurso dos Serviços de Comunicação. Você precisa gravar seus parâmetros de
resourceEndpointeresourceAccessKeypara este tutorial.
Assinar uma solicitação HTTP com o C#
A autenticação de chave de acesso usa uma chave secreta compartilhada para gerar uma assinatura HMAC para cada solicitação HTTP. Essa assinatura é gerada com o algoritmo SHA256 e é enviada no cabeçalho Authorization usando o esquema HMAC-SHA256. Por exemplo:
Authorization: "HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=<hmac-sha256-signature>"
A hmac-sha256-signature é formada por:
- Verbo HTTP (por exemplo,
GETouPUT) - Caminho de solicitação HTTP
- x-ms-date
- Host
- x-ms-content-sha256
Configurar o cabeçalho de autorização
Conclua as etapas a seguir para construir o cabeçalho de autorização.
Criar um aplicativo em C#
Em uma janela de console, como cmd, PowerShell ou Bash, use o comando dotnet new para criar um aplicativo de console com o nome SignHmacTutorial. Esse comando cria um projeto simples em C# do tipo "Olá, Mundo" com um arquivo de origem único: Program.cs.
dotnet new console -o SignHmacTutorial
Altere o diretório para a pasta do aplicativo recém-criado. Para compilar seu aplicativo, use o dotnet build comando.
cd SignHmacTutorial
dotnet build
Instalar o pacote
Instale o pacote Newtonsoft.Json, que é usado para serialização do corpo.
dotnet add package Newtonsoft.Json
Atualize a declaração de método Main para dar suporte ao código assíncrono. Use o código a seguir para começar.
using System;
using System.Globalization;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace SignHmacTutorial
{
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("Azure Communication Services - Sign an HTTP request Tutorial");
// Tutorial code goes here.
}
}
}
Criar uma mensagem de solicitação
Para este exemplo, você assinará uma solicitação para criar uma identidade usando a API de Autenticação dos Serviços de Comunicação (versão 2021-03-07).
Adicione o seguinte código ao Main método.
string resourceEndpoint = "resourceEndpoint";
// Create a uri you are going to call.
var requestUri = new Uri($"{resourceEndpoint}/identities?api-version=2021-03-07");
// Endpoint identities?api-version=2021-03-07 accepts list of scopes as a body
var body = new
{
createTokenWithScopes = new[] { "chat" }
};
var serializedBody = JsonConvert.SerializeObject(body);
var requestMessage = new HttpRequestMessage(HttpMethod.Post, requestUri)
{
Content = new StringContent(serializedBody, Encoding.UTF8, "application/json")
};
Substitua resourceEndpoint pelo valor real do ponto de extremidade de recurso.
Criar um hash de conteúdo
O hash de conteúdo faz parte da sua assinatura HMAC. Use o código a seguir para calcular o hash de conteúdo. Você pode adicionar esse método a Program.cs no método Main.
static string ComputeContentHash(string content)
{
using var sha256 = SHA256.Create();
byte[] hashedBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(content));
return Convert.ToBase64String(hashedBytes);
}
Computar uma assinatura
Use o código a seguir para criar um método para computar sua assinatura HMAC.
static string ComputeSignature(string stringToSign)
{
string secret = "resourceAccessKey";
using var hmacsha256 = new HMACSHA256(Convert.FromBase64String(secret));
var bytes = Encoding.UTF8.GetBytes(stringToSign);
var hashedBytes = hmacsha256.ComputeHash(bytes);
return Convert.ToBase64String(hashedBytes);
}
Substitua resourceAccessKey por uma chave de acesso do recurso real dos Serviços de Comunicação.
Criar uma cadeia de caracteres do cabeçalho de autorização
Agora, você constrói a cadeia de caracteres que adiciona ao cabeçalho de autorização.
- Prepare os valores para os cabeçalhos a serem assinados.
- Especifique o carimbo de data/hora atual usando o fuso horário UTC (Tempo Universal Coordenado).
- Obtenha a autoridade de solicitação. Use o nome de host ou o endereço IP do DNS (Sistema de Nomes de Domínio) e o número da porta.
- Compute um hash de conteúdo.
- Prepare uma cadeia de caracteres para assinatura.
- Compute a assinatura.
- Concatene a cadeia de caracteres, que é usada no cabeçalho de autorização.
Adicione o seguinte código ao Main método.
// Specify the 'x-ms-date' header as the current UTC timestamp according to the RFC1123 standard.
var date = DateTimeOffset.UtcNow.ToString("r", CultureInfo.InvariantCulture);
// Get the host name corresponding with the 'host' header.
var host = requestUri.Authority;
// Compute a content hash for the 'x-ms-content-sha256' header.
var contentHash = ComputeContentHash(serializedBody);
// Prepare a string to sign.
var stringToSign = $"POST\n{requestUri.PathAndQuery}\n{date};{host};{contentHash}";
// Compute the signature.
var signature = ComputeSignature(stringToSign);
// Concatenate the string, which will be used in the authorization header.
var authorizationHeader = $"HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature={signature}";
Adicionar cabeçalhos a requestMessage
Use o código a seguir para adicionar os cabeçalhos necessários ao parâmetro requestMessage.
// Add a date header.
requestMessage.Headers.Add("x-ms-date", date);
// Add a host header.
// In C#, the 'host' header is added automatically by the 'HttpClient'. However, this step may be required on other platforms such as Node.js.
// Add a content hash header.
requestMessage.Headers.Add("x-ms-content-sha256", contentHash);
// Add an authorization header.
requestMessage.Headers.Add("Authorization", authorizationHeader);
Como testar o cliente
Chame o ponto de extremidade usando HttpClient e verifique a resposta.
HttpClient httpClient = new HttpClient
{
BaseAddress = requestUri
};
var response = await httpClient.SendAsync(requestMessage);
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
Prerequisites
- Criar uma conta do Azure com uma assinatura ativa. Se você não tiver uma assinatura do Azure, consulte Criar uma conta gratuitamente.
- Baixe e instale o Python.
- Baixe e instale o Visual Studio Code ou outro IDE (ambiente de desenvolvimento integrado) que dê suporte ao Python.
- Criar um recurso dos Serviços de Comunicação do Azure. Se você não tiver um recurso, consulte Criar um recurso dos Serviços de Comunicação. Você precisa de seus parâmetros
resource_endpoint_nameeresource_endpoint_secretpara este exemplo.
Assine uma solicitação HTTP com Python
A autenticação de chave de acesso usa uma chave secreta compartilhada para gerar uma assinatura HMAC para cada solicitação HTTP. Essa assinatura é gerada com o algoritmo SHA256 e é enviada no cabeçalho Authorization usando o esquema HMAC-SHA256. Por exemplo:
Authorization: "HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=<hmac-sha256-signature>"
A hmac-sha256-signature é formada por:
- Verbo HTTP (por exemplo,
GETouPUT) - Caminho de solicitação HTTP
- x-ms-date
- Host
- x-ms-content-sha256
Configurar o cabeçalho de autorização
Conclua as etapas a seguir para construir o cabeçalho de autorização.
Criar um novo script do Python
Abra o Visual Studio Code ou outro IDE ou editor de sua escolha. Crie um arquivo chamado sign_hmac_tutorial.py. Salve este arquivo em uma pasta conhecida.
Adicionar as importações necessárias
Atualize o script sign_hmac_tutorial.py com o código a seguir para começar.
import base64
import hashlib
import hmac
import json
from datetime import datetime, timezone
from urllib import request
Prepare os dados para a solicitação
Para este exemplo, você assina uma solicitação para criar uma nova identidade usando a API de Autenticação dos Serviços de Comunicação (versão 2021-03-07).
Adicione o seguinte código ao script sign_hmac_tutorial.py.
- Substitua
resource_endpoint_namepelo valor do nome do ponto de extremidade de recurso real. Você pode encontrar esse valor na seção Visão geral do recurso dos Serviços de Comunicação. É o valor deEndpointapóshttps://. - Substitua
resource_endpoint_secretpelo valor secreto do ponto de extremidade de recurso real. Você pode encontrar esse valor na seção Chaves do recurso dos Serviços de Comunicação. É o valor da chave, que é primária ou secundária.
host = "resource_endpoint_name"
resource_endpoint = f"https://{host}"
path_and_query = "/identities?api-version=2021-03-07"
secret = "resource_endpoint_secret"
# Create a uri you are going to call.
request_uri = f"{resource_endpoint}{path_and_query}"
# Endpoint identities?api-version=2021-03-07 accepts the list of scopes as a body.
body = { "createTokenWithScopes": ["chat"] }
serialized_body = json.dumps(body)
content = serialized_body.encode("utf-8")
Criar um hash de conteúdo
O hash de conteúdo faz parte da sua assinatura HMAC. Use o código a seguir para calcular o hash de conteúdo. Você pode adicionar este método ao script sign_hmac_tutorial.py.
def compute_content_hash(content):
sha_256 = hashlib.sha256()
sha_256.update(content)
hashed_bytes = sha_256.digest()
base64_encoded_bytes = base64.b64encode(hashed_bytes)
content_hash = base64_encoded_bytes.decode('utf-8')
return content_hash
Computar uma assinatura
Use o código a seguir para criar um método para computar sua assinatura HMAC.
def compute_signature(string_to_sign, secret):
decoded_secret = base64.b64decode(secret)
encoded_string_to_sign = string_to_sign.encode('utf-8')
hashed_bytes = hmac.digest(decoded_secret, encoded_string_to_sign, digest=hashlib.sha256)
encoded_signature = base64.b64encode(hashed_bytes)
signature = encoded_signature.decode('utf-8')
return signature
Obtenha um carimbo de data/hora UTC atual de acordo com o padrão RFC1123
Use o código a seguir para obter o formato de data desejado independentemente das configurações de localidade.
def format_date(dt):
days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
utc = dt.utctimetuple()
return "{}, {:02} {} {:04} {:02}:{:02}:{:02} GMT".format(
days[utc.tm_wday],
utc.tm_mday,
months[utc.tm_mon-1],
utc.tm_year,
utc.tm_hour,
utc.tm_min,
utc.tm_sec)
Criar uma cadeia de caracteres do cabeçalho de autorização
Agora, você constrói a cadeia de caracteres que adiciona ao cabeçalho de autorização.
- Prepare os valores para os cabeçalhos a serem assinados.
- Especifique o carimbo de data/hora atual usando o fuso horário UTC (Tempo Universal Coordenado).
- Obtenha a autoridade de solicitação. Use o nome de host ou o endereço IP do DNS (Sistema de Nomes de Domínio) e o número da porta.
- Compute um hash de conteúdo.
- Prepare uma cadeia de caracteres para assinatura.
- Compute a assinatura.
- Concatene a cadeia de caracteres, que é usada no cabeçalho de autorização.
Adicione o seguinte código ao script sign_hmac_tutorial.py.
# Specify the 'x-ms-date' header as the current UTC timestamp according to the RFC1123 standard.
utc_now = datetime.now(timezone.utc)
date = format_date(utc_now)
# Compute a content hash for the 'x-ms-content-sha256' header.
content_hash = compute_content_hash(content)
# Prepare a string to sign.
string_to_sign = f"POST\n{path_and_query}\n{date};{host};{content_hash}"
# Compute the signature.
signature = compute_signature(string_to_sign, secret)
# Concatenate the string, which will be used in the authorization header.
authorization_header = f"HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature={signature}"
Adicionar cabeçalhos
Use o código a seguir para adicionar os cabeçalhos necessários.
request_headers = {}
# Add a date header.
request_headers["x-ms-date"] = date
# Add a content hash header.
request_headers["x-ms-content-sha256"] = content_hash
# Add an authorization header.
request_headers["Authorization"] = authorization_header
# Add a content type header.
request_headers["Content-Type"] = "application/json"
Como testar o cliente
Chame o endpoint e verifique a resposta.
req = request.Request(request_uri, content, request_headers, method='POST')
with request.urlopen(req) as response:
response_string = json.load(response)
print(response_string)
Limpar os recursos
Para limpar e remover uma assinatura dos Serviços de Comunicação, exclua o recurso ou o grupo de recursos. Excluir o grupo de recursos também exclui todos os recursos associados a ele. Você pode saber mais sobre como limpar os recursos dos Serviços de Comunicação do Azure e limpar os recursos do Azure Functions.