Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk azt ismerteti, hogyan írhat alá EGY HTTP-kérést kivonatalapú üzenethitelesítési kóddal (HMAC).
Note
Javasoljuk, hogy az Azure SDK-k használatával írjon alá EGY HTTP-kérést. A cikkben ismertetett megközelítés tartalék lehetőség, ha az Azure SDK-k semmilyen okból nem használhatók.
Ebben az oktatóanyagban a következőket sajátíthatja el:
- Hozzon létre egy kérési üzenetet.
- Tartalomkivonat létrehozása.
- Aláírás kiszámítása.
- Hozzon létre egy engedélyezési fejlécszöveget.
- Fejlécek hozzáadása.
Prerequisites
- Azure-fiók létrehozása aktív előfizetéssel. Ha nem rendelkezik Azure-előfizetéssel, tekintse meg a Fiók létrehozása ingyenesen című témakört.
- A Visual Studio telepítése.
- Hozzon létre egy Azure Communication Services-erőforrást. Ha nem rendelkezik erőforrással, olvassa el a Communication Services-erőforrás létrehozása című témakört. Ehhez az oktatóanyaghoz rögzítenie kell a
resourceEndpointés aresourceAccessKeyparamétereket.
HTTP-kérés aláírása a C használatával#
A hozzáférési kulcs hitelesítése megosztott titkos kulcs használatával hoz létre HMAC-aláírást minden HTTP-kéréshez. Ez az aláírás az SHA256 algoritmussal jön létre, és a Authorization séma használatával küldi el a HMAC-SHA256 fejlécben. Például:
Authorization: "HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=<hmac-sha256-signature>"
Az hmac-sha256-signature a következőkből áll:
- HTTP-metódus (például
GETvagyPUT) - HTTP-kérelem elérési útja
- x-ms-date
- Host
- x-ms-content-sha256
Az engedélyezési fejléc beállítása
Az engedélyezési fejléc létrehozásához hajtsa végre az alábbi lépéseket.
Új C#-alkalmazás létrehozása
Egy konzolablakban , például a parancsmagban, a PowerShellben vagy a Bashben a dotnet new paranccsal hozzon létre egy új, a névvel SignHmacTutorialellátott konzolalkalmazást. Ez a parancs létrehoz egy egyszerű "„Helló világ!” alkalmazás" C# projektet egyetlen forrásfájllal: Program.cs.
dotnet new console -o SignHmacTutorial
Módosítsa a könyvtárat az újonnan létrehozott alkalmazásmappára. Az alkalmazás összeállításához használja a dotnet build parancsot.
cd SignHmacTutorial
dotnet build
Telepítse a(z) csomagot
Telepítse a törzs szerializálásához használt csomagot Newtonsoft.Json.
dotnet add package Newtonsoft.Json
Frissítse a metódusdeklarációt az Main aszinkron kód támogatásához. A kezdéshez használja az alábbi kódot.
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.
}
}
}
Kérelemüzenet létrehozása
Ebben a példában egy új identitás létrehozására irányuló kérést ír alá a Communication Services Authentication API (verzió 2021-03-07) használatával.
Adja hozzá a következő kódot a Main metódushoz:
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")
};
Cserélje le resourceEndpoint a valós erőforrásvégpont-értékre.
Tartalomkivonat létrehozása
A tartalomkivonat a HMAC-aláírás része. A tartalomkivonat kiszámításához használja az alábbi kódot. Ezt a metódust a Program.cs metódus alá adhatja hozzá Main-ban.
static string ComputeContentHash(string content)
{
using var sha256 = SHA256.Create();
byte[] hashedBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(content));
return Convert.ToBase64String(hashedBytes);
}
Aláírás kiszámítása
Az alábbi kód használatával hozzon létre egy metódust a HMAC-aláírás kiszámításához.
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);
}
Cserélje le a resourceAccessKey elemet a Communication Services tényleges erőforrásának hozzáférési kulcsára.
Hitelesítési fejlécszöveg létrehozása
Most létrehozza a sztringet, amelyet hozzáad az engedélyezési fejléchez.
- Készítse elő a fejlécek aláírásához szükséges értékeket.
- Adja meg az aktuális időbélyeget az egyezményes világidő (UTC) időzónájának használatával.
- Kérje le a kérelem jogosultságát. Használja a tartománynévrendszer (DNS) állomásnevét vagy IP-címét és portszámát.
- Tartalomkivonat kiszámítása.
- Készíts elő egy karakterláncot aláírásra.
- Az aláírás kiszámítása.
- Fűzd össze az engedélyezési fejlécben használt karakterláncot.
Adja hozzá a következő kódot a Main metódushoz:
// 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}";
Fejlécek hozzáadása a requestMessage-hez
A következő kóddal adja hozzá a szükséges fejléceket a requestMessage paraméterhez.
// 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);
Az ügyfél tesztelése
Hívja meg a végpontot a használatával HttpClient, és ellenőrizze a választ.
HttpClient httpClient = new HttpClient
{
BaseAddress = requestUri
};
var response = await httpClient.SendAsync(requestMessage);
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
Prerequisites
- Azure-fiók létrehozása aktív előfizetéssel. Ha nem rendelkezik Azure-előfizetéssel, tekintse meg a Fiók létrehozása ingyenesen című témakört.
- Töltse le és telepítse a Pythont.
- Töltse le és telepítse a Visual Studio Code-ot vagy egy pythont támogató integrált fejlesztési környezetet (IDE).
- Hozzon létre egy Azure Communication Services-erőforrást. Ha nem rendelkezik erőforrással, olvassa el a Communication Services-erőforrás létrehozása című témakört. Ehhez a példához szüksége lesz az
resource_endpoint_nameésresource_endpoint_secretparaméterekre.
HTTP-kérés aláírása a Pythonnal
A hozzáférési kulcs hitelesítése megosztott titkos kulcs használatával hoz létre HMAC-aláírást minden HTTP-kéréshez. Ez az aláírás az SHA256 algoritmussal jön létre, és a Authorization séma használatával küldi el a HMAC-SHA256 fejlécben. Például:
Authorization: "HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=<hmac-sha256-signature>"
Az hmac-sha256-signature a következőkből áll:
- HTTP-metódus (például
GETvagyPUT) - HTTP-kérelem elérési útja
- x-ms-date
- Host
- x-ms-content-sha256
Az engedélyezési fejléc beállítása
Hajtsa végre az alábbi lépéseket az engedélyezési fejléc létrehozásához.
Új Python-szkript létrehozása
Nyissa meg a Visual Studio Code-ot vagy egy másik IDE-t vagy szerkesztőt. Hozzon létre egy sign_hmac_tutorial.pynevű új fájlt. Mentse a fájlt egy ismert mappába.
Szükséges importok hozzáadása
Frissítse a sign_hmac_tutorial.py szkriptet a következő kóddal a kezdéshez.
import base64
import hashlib
import hmac
import json
from datetime import datetime, timezone
from urllib import request
Adatok előkészítése a kéréshez
Ebben a példában egy új identitás létrehozására irányuló kérést ír alá a Communication Services Authentication API (verzió 2021-03-07) használatával.
Adja hozzá a következő kódot a sign_hmac_tutorial.py szkripthez.
- Cserélje le
resource_endpoint_namea valódi erőforrásvégpont névértékére. Ezt az értéket a Communication Services-erőforrás Áttekintés szakaszában találja. Ez annak az értéke, ami aEndpointután vanhttps://. - Cserélje le
resource_endpoint_secreta valódi erőforrásvégpont titkos értékére. Ezt az értéket a Communication Services-erőforrás Kulcsok szakaszában találja. Ez a kulcs értéke, amely elsődleges vagy másodlagos.
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")
Tartalomkivonat létrehozása
A tartalomkivonat a HMAC-aláírás része. A tartalomkivonat kiszámításához használja az alábbi kódot. Ezt a metódust hozzáadhatja a sign_hmac_tutorial.py szkripthez.
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
Aláírás kiszámítása
Az alábbi kód használatával hozzon létre egy metódust a HMAC-aláírás kiszámításához.
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
Aktuális UTC időbélyeg lekérése a RFC1123 szabványnak megfelelően
A következő kóddal lekérheti a területi beállításoktól független dátumformátumot.
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)
Hitelesítési fejlécszöveg létrehozása
Most létrehozza a sztringet, amelyet hozzáad az engedélyezési fejléchez.
- Készítse elő a fejlécek aláírásához szükséges értékeket.
- Adja meg az aktuális időbélyeget az egyezményes világidő (UTC) időzónájának használatával.
- Kérje le a kérelem jogosultságát. Használja a tartománynévrendszer (DNS) állomásnevét vagy IP-címét és portszámát.
- Tartalomkivonat kiszámítása.
- Készíts elő egy karakterláncot aláírásra.
- Az aláírás kiszámítása.
- Fűzd össze az engedélyezési fejlécben használt karakterláncot.
Adja hozzá a következő kódot a sign_hmac_tutorial.py szkripthez.
# 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}"
Fejlécek hozzáadása
A szükséges fejlécek hozzáadásához használja az alábbi kódot.
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"
Az ügyfél tesztelése
Hívja meg a végpontot, és ellenőrizze a választ.
req = request.Request(request_uri, content, request_headers, method='POST')
with request.urlopen(req) as response:
response_string = json.load(response)
print(response_string)
Az erőforrások tisztítása
Egy Communication Services-előfizetés törléséhez és eltávolításához törölje az erőforrást vagy az erőforráscsoportot. Az erőforráscsoport törlése a hozzá társított egyéb erőforrásokat is törli. További információ az Azure Communication Services-erőforrások törléséről és az Azure Functions-erőforrások törléséről.