Sdílet prostřednictvím


Podepsání požadavku HTTP

V tomto kurzu se dozvíte, jak podepsat požadavek HTTP pomocí podpisu HMAC.

Poznámka:

Důrazně doporučujeme používat sady Azure SDK. Zde popsaný přístup je záložní možností pro případy, kdy se sady Azure SDK z nějakého důvodu nedají použít.

Požadavky

Než začnete, nezapomeňte:

  • Vytvořte účet Azure s aktivním předplatným. Podrobnosti najdete v tématu Vytvoření účtu zdarma.
  • Nainstalovat sadu Visual Studio.
  • Vytvořte zdroj Azure Communication Services. Podrobnosti najdete v tématu Vytvoření prostředku Azure Communication Services. Pro účely tohoto kurzu budete muset zaznamenat prostředekEndpoint a resourceAccessKey.

Podepsání požadavku HTTP pomocí jazyka C#

Ověřování pomocí přístupového klíče používá sdílený tajný klíč k vygenerování podpisu HMAC pro každý požadavek HTTP. Tento podpis se vygeneruje pomocí algoritmu SHA256 a odešle se do Authorization hlavičky pomocí schématu HMAC-SHA256 . Příklad:

Authorization: "HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=<hmac-sha256-signature>"

hmac-sha256-signature tvoří:

  • Příkaz HTTP (například GET nebo PUT)
  • Cesta požadavku HTTP
  • x-ms-date
  • Hostitelský počítač
  • x-ms-content-sha256

Nastavení

Následující kroky popisují, jak vytvořit autorizační hlavičku.

Vytvoření nové aplikace jazyka C#

V okně konzoly, například cmd, PowerShell nebo Bash, použijte dotnet new příkaz k vytvoření nové konzolové aplikace s názvem SignHmacTutorial. Tento příkaz vytvoří jednoduchý projekt "Hello World" C# s jedním zdrojovým souborem: Program.cs.

dotnet new console -o SignHmacTutorial

Změňte adresář na nově vytvořenou složku aplikace. dotnet build Pomocí příkazu zkompilujte aplikaci.

cd SignHmacTutorial
dotnet build

Nainstalujte balíček .

Nainstalujte balíček Newtonsoft.Json , který se používá pro serializaci těla.

dotnet add package Newtonsoft.Json

Main Aktualizujte deklaraci metody tak, aby podporovala asynchronní kód. Začněte následujícím kódem.

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.
        }
    }
}

Vytvoření zprávy žádosti

V tomto příkladu podepíšeme žádost o vytvoření nové identity pomocí rozhraní API pro ověřování komunikačních služeb (verze 2021-03-07).

Do metody Main přidejte následující kód.

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")
};

Nahraďte resourceEndpoint skutečnou hodnotou koncového bodu prostředku.

Vytvoření hodnoty hash obsahu

Hodnota hash obsahu je součástí podpisu HMAC. K výpočtu hodnoty hash obsahu použijte následující kód. Tuto metodu můžete přidat pod Program.cs metodu Main .

static string ComputeContentHash(string content)
{
    using var sha256 = SHA256.Create();
    byte[] hashedBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(content));
    return Convert.ToBase64String(hashedBytes);
}

Výpočet podpisu

Pomocí následujícího kódu vytvořte metodu pro výpočet podpisu 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);
}

Nahraďte resourceAccessKey přístupovým klíčem skutečného prostředku komunikační služby.

Vytvoření řetězce autorizační hlavičky

Teď vytvoříme řetězec, který přidáme do autorizační hlavičky.

  1. Připravte hodnoty pro podepsání hlaviček.
    1. Zadejte aktuální časové razítko pomocí časového pásma UTC (Coordinated Universal Time).
    2. Získejte autoritu požadavku (název hostitele DNS nebo IP adresu a číslo portu).
    3. Vypočítá hodnotu hash obsahu.
  2. Připravte řetězec, který se má podepsat.
  3. Vypočítá podpis.
  4. Zřetězte řetězec, který se použije v autorizační hlavičce.

Do metody Main přidejte následující kód.

// 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}";

Přidání hlaviček do requestMessage

Pomocí následujícího kódu přidejte požadované hlavičky do souboru 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);

Test klienta

Zavolejte koncový bod pomocí a HttpClientzkontrolujte odpověď.

HttpClient httpClient = new HttpClient
{
    BaseAddress = requestUri
};
var response = await httpClient.SendAsync(requestMessage);
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);

Požadavky

Než začnete, nezapomeňte:

  • Vytvořte účet Azure s aktivním předplatným. Podrobnosti najdete v tématu Vytvoření účtu zdarma.
  • Stáhněte a nainstalujte Python.
  • Stáhněte a nainstalujte Visual Studio Code nebo jiné integrované vývojové prostředí (IDE), které podporuje Python.
  • Vytvořte zdroj Azure Communication Services. Podrobnosti najdete v tématu Vytvoření prostředku Azure Communication Services. Pro účely tohoto kurzu budete potřebovat resource_endpoint_name a resource_endpoint_secret.

Podepsání požadavku HTTP pomocí Pythonu

Ověřování pomocí přístupového klíče používá sdílený tajný klíč k vygenerování podpisu HMAC pro každý požadavek HTTP. Tento podpis se vygeneruje pomocí algoritmu SHA256 a odešle se do Authorization hlavičky pomocí schématu HMAC-SHA256 . Příklad:

Authorization: "HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=<hmac-sha256-signature>"

hmac-sha256-signature tvoří:

  • Příkaz HTTP (například GET nebo PUT)
  • Cesta požadavku HTTP
  • x-ms-date
  • Hostitelský počítač
  • x-ms-content-sha256

Nastavení

Následující kroky popisují, jak vytvořit autorizační hlavičku.

Vytvoření nového skriptu Pythonu

Otevřete Visual Studio Code nebo jiné integrované vývojové prostředí nebo editor podle vašeho výběru a vytvořte nový soubor s názvem sign_hmac_tutorial.py. Uložte tento soubor do známé složky.

Přidání nezbytných importů

sign_hmac_tutorial.py Aktualizujte skript následujícím kódem, abyste mohli začít.

import base64
import hashlib
import hmac
import json
from datetime import datetime, timezone
from urllib import request

Příprava dat pro požadavek

V tomto příkladu podepíšeme žádost o vytvoření nové identity pomocí rozhraní API pro ověřování komunikačních služeb (verze2021-03-07).

Do skriptu přidejte následující kód sign_hmac_tutorial.py .

  • Nahraďte resource_endpoint_name hodnotou názvu skutečného koncového bodu prostředku. Tuto hodnotu najdete v části Přehled vašeho prostředku Azure Communication Services. Je to hodnota "Endpoint" za "https://".
  • Nahraďte resource_endpoint_secret hodnotou tajného kódu koncového bodu skutečného prostředku. Tuto hodnotu najdete v části Klíče vašeho prostředku Azure Communication Services. Jedná se o hodnotu "Klíč" – primární nebo sekundární.
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 list of scopes as a body.
body = { "createTokenWithScopes": ["chat"] }

serialized_body = json.dumps(body)
content = serialized_body.encode("utf-8")

Vytvoření hodnoty hash obsahu

Hodnota hash obsahu je součástí podpisu HMAC. K výpočtu hodnoty hash obsahu použijte následující kód. Tuto metodu můžete přidat do sign_hmac_tutorial.py skriptu.

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

Výpočet podpisu

Pomocí následujícího kódu vytvořte metodu pro výpočet podpisu 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

Získání aktuálního časového razítka UTC podle standardu RFC1123

K získání požadovaného formátu data nezávisle na nastavení národního prostředí použijte následující kód.

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)

Vytvoření řetězce autorizační hlavičky

Teď vytvoříme řetězec, který přidáme do autorizační hlavičky.

  1. Připravte hodnoty pro podepsání hlaviček.
    1. Zadejte aktuální časové razítko pomocí časového pásma UTC (Coordinated Universal Time).
    2. Získejte autoritu požadavku (název hostitele DNS nebo IP adresu a číslo portu).
    3. Vypočítá hodnotu hash obsahu.
  2. Připravte řetězec, který se má podepsat.
  3. Vypočítá podpis.
  4. Zřetězte řetězec, který se použije v autorizační hlavičce.

Do skriptu přidejte následující kód 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}"

Přidání hlaviček

K přidání požadovaných hlaviček použijte následující kód.

request_headers = {}

# Add a date header.
request_headers["x-ms-date"] = date

# Add content hash header.
request_headers["x-ms-content-sha256"] = content_hash

# Add authorization header.
request_headers["Authorization"] = authorization_header

# Add content type header.
request_headers["Content-Type"] = "application/json"

Test klienta

Zavolejte koncový bod a zkontrolujte odpověď.

req = request.Request(request_uri, content, request_headers, method='POST')
with request.urlopen(req) as response:
  response_string = json.load(response)
print(response_string)

Vyčištění prostředků

Pokud chcete vyčistit a odebrat předplatné služby Communication Services, odstraňte prostředek nebo skupinu prostředků. Odstraněním skupiny prostředků se odstraní také všechny ostatní prostředky, které jsou k ní přidružené. Další informace o čištění prostředků Azure Communication Services a čištění prostředků Azure Functions

Další kroky

Můžete také chtít: