Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, karma tabanlı ileti kimlik doğrulama kodu (HMAC) imzası ile HTTP isteğinin nasıl imzalanacağı açıklanmaktadır.
Note
Http isteğini imzalamak için Azure SDK'larını kullanmanızı öneririz. Azure SDK'ları herhangi bir nedenle kullanılamıyorsa, bu makalede açıklanan yaklaşım bir geri dönüş seçeneğidir.
Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:
- Bir istek mesajı oluşturun.
- İçerik karması oluştur.
- Bir imza oluştur.
- Yetkilendirme başlık dizisini oluşturun.
- Başlıklar ekle.
Prerequisites
- Aktif bir abonelikle bir Azure hesabı oluşturun. Azure aboneliğiniz yoksa, Ücretsiz bir hesap oluşturun sayfasına bakın.
- Visual Studio’yu yükleyin.
- Azure İletişim Hizmetleri kaynağı oluşturun. Kaynağınız yoksa bkz. İletişim Hizmetleri kaynağı oluşturma. Bu eğitim için
resourceEndpointveresourceAccessKeyparametrelerinizi kaydetmeniz gerekiyor.
C# ile bir HTTP isteğini imzalama
Erişim anahtarı kimlik doğrulaması, her HTTP isteği için bir HMAC imzası oluşturmak üzere paylaşılan bir gizli anahtar kullanır. Bu imza, SHA256 algoritması kullanılarak oluşturulmuş ve Authorization düzeni kullanılarak HMAC-SHA256 başlığında gönderilmiştir. Örneğin:
Authorization: "HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=<hmac-sha256-signature>"
hmac-sha256-signature şu öğelerden oluşur:
- HTTP verb (örneğin,
GETveyaPUT) - HTTP istek yolu
- x-ms-date
- Host
- x-ms-content-sha256
Yetkilendirme başlığını ayarlayın
Yetkilendirme üst bilgisini oluşturmak için aşağıdaki adımları tamamlayın.
Yeni bir C# uygulaması oluştur
Bir komut penceresinde, örneğin cmd, PowerShell veya Bash gibi, dotnet new komutunu kullanarak adı SignHmacTutorial olan yeni bir konsol uygulaması oluşturun. Bu komut, tek bir kaynak dosyasıyla basit bir "Merhaba Dünya" C# projesi oluşturur: Program.cs.
dotnet new console -o SignHmacTutorial
Dizinizi yeni oluşturulan uygulama klasörüne değiştirin. Uygulamanızı derlemek için komutunu kullanın dotnet build .
cd SignHmacTutorial
dotnet build
Paketi yükle
Paket Newtonsoft.Json'yi yükleyin, bu paket gövde serileştirmesi için kullanılır.
dotnet add package Newtonsoft.Json
Main yöntem bildirimini, async kodu destekleyecek şekilde güncelleyin. Başlamak için aşağıdaki kodu kullanın.
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.
}
}
}
İstek mesajı oluştur
Bu örnek için, İletişim Hizmetleri Kimlik Doğrulama API'si (versiyon 2021-03-07) kullanarak yeni bir kimlik oluşturma talebini imzalarsınız.
Aşağıdaki kodu Main metoduna ekleyin.
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")
};
Gerçek kaynak uç noktası değeri ile resourceEndpoint değiştirin.
İçerik için bir hash oluştur
İçerik özeti, HMAC imzanızın bir parçasıdır. Aşağıdaki kodu kullanarak içerik karma değerini hesaplayın. Bu yöntemi, Program.cs yönteminin altına Main ekleyebilirsiniz.
static string ComputeContentHash(string content)
{
using var sha256 = SHA256.Create();
byte[] hashedBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(content));
return Convert.ToBase64String(hashedBytes);
}
İmza hesapla
Aşağıdaki kodu kullanarak HMAC imzanızı hesaplamak için bir yöntem oluşturun.
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);
}
"resourceAccessKey öğesini gerçek İletişim Hizmetleri kaynağınızın erişim anahtarıyla değiştirin."
Yetkilendirme başlık dizesi oluştur
Şimdi yetkilendirme başlığınıza eklediğiniz dizeyi oluşturun.
- İmzalanacak başlıklar için değerleri hazırlayın.
- Koordine Evrensel Zaman (UTC) zaman dilimini kullanarak mevcut zaman damgasını belirtin.
- İstek yetkisini al. Alan Adı Sistemi (DNS) ana bilgisayar adı veya IP adresi ile bağlantı noktası numarasını kullanın.
- Bir içerik özet değeri hesapla.
- İmza için bir dize hazırlayın.
- İmzanın hesaplanmasını yapın.
- Yetki başlığında kullanılan dizgiyi birleştirin.
Aşağıdaki kodu Main metoduna ekleyin.
// 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}";
Başlıkları requestMessage'e ekle
Gerekli başlıkları requestMessage parametrenize eklemek için aşağıdaki kodu kullanın.
// 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);
İstemciyi test et
HttpClient kullanarak uç noktasını çağırın ve yanıtı kontrol edin.
HttpClient httpClient = new HttpClient
{
BaseAddress = requestUri
};
var response = await httpClient.SendAsync(requestMessage);
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
Prerequisites
- Aktif bir abonelikle bir Azure hesabı oluşturun. Azure aboneliğiniz yoksa, Ücretsiz bir hesap oluşturun sayfasına bakın.
- Python indirip yükleyin.
- Python'ı destekleyen Visual Studio Code veya başka bir entegre geliştirme ortamını (IDE) indirin ve kurun.
- Azure İletişim Hizmetleri kaynağı oluşturun. Kaynağınız yoksa bkz. İletişim Hizmetleri kaynağı oluşturma. Bu örnek için
resource_endpoint_nameveresource_endpoint_secretparametrelerinize ihtiyacınız vardır.
Python ile bir HTTP isteğini imzala
Erişim anahtarı kimlik doğrulaması, her HTTP isteği için bir HMAC imzası oluşturmak üzere paylaşılan bir gizli anahtar kullanır. Bu imza, SHA256 algoritması kullanılarak oluşturulmuş ve Authorization düzeni kullanılarak HMAC-SHA256 başlığında gönderilmiştir. Örneğin:
Authorization: "HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=<hmac-sha256-signature>"
hmac-sha256-signature şu öğelerden oluşur:
- HTTP verb (örneğin,
GETveyaPUT) - HTTP istek yolu
- x-ms-date
- Host
- x-ms-content-sha256
Yetkilendirme başlığını ayarlayın
Yetkilendirme üst bilgisini oluşturmak için aşağıdaki adımları tamamlayın.
Yeni bir Python betiği oluşturun
Visual Studio Code veya diğer bir IDE ya da istediğiniz bir editörü açın.
sign_hmac_tutorial.py adlı yeni bir dosya oluşturun. Bu dosyayı bilinen bir klasöre kaydedin.
Gerekli importları ekleyin
Başlamak için sign_hmac_tutorial.py komut dosyasını aşağıdaki kodla güncelleyin.
import base64
import hashlib
import hmac
import json
from datetime import datetime, timezone
from urllib import request
İstek için verileri hazırla
Bu örnekte, İletişim Hizmetleri Kimlik Doğrulama API'sini kullanarak yeni bir kimlik oluşturma isteği imzalıyorsunuz (sürüm 2021-03-07).
Aşağıdaki kodu sign_hmac_tutorial.py betiğine ekle.
-
resource_endpoint_nameöğesini gerçek kaynak uç nokta adı değeri ile değiştirin. İletişim Hizmetleri kaynağınızın Genel Bakış bölümünde bu değeri bulabilirsiniz.Endpoint'ninhttps://'den sonraki değeri. - Gerçek kaynak uç noktası gizli anahtar değeriyle
resource_endpoint_secretdeğiştirin. Bu değeri, Hesap Anahtarı bölümünden İletişim Hizmetleri kaynağınızda bulabilirsiniz. Key'in değeri, birincil veya ikincil olabilir.
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")
İçerik için bir hash oluştur
İçerik özeti, HMAC imzanızın bir parçasıdır. Aşağıdaki kodu kullanarak içerik karma değerini hesaplayın. Bu yöntemi sign_hmac_tutorial.py scriptine ekleyebilirsiniz.
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
İmza hesapla
Aşağıdaki kodu kullanarak HMAC imzanızı hesaplamak için bir yöntem oluşturun.
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
Geçerli bir UTC zaman damgası al, RFC1123 standardına göre.
Tarih formatını, yerel ayarlarından bağımsız olarak istediğiniz şekilde alabilmek için aşağıdaki kodu kullanın.
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)
Yetkilendirme başlık dizesi oluştur
Şimdi yetkilendirme başlığınıza eklediğiniz dizeyi oluşturun.
- İmzalanacak başlıklar için değerleri hazırlayın.
- Koordine Evrensel Zaman (UTC) zaman dilimini kullanarak mevcut zaman damgasını belirtin.
- İstek yetkisini al. Alan Adı Sistemi (DNS) ana bilgisayar adı veya IP adresi ile bağlantı noktası numarasını kullanın.
- Bir içerik özet değeri hesapla.
- İmza için bir dize hazırlayın.
- İmzanın hesaplanmasını yapın.
- Yetki başlığında kullanılan dizgiyi birleştirin.
Aşağıdaki kodu sign_hmac_tutorial.py betiğine ekle.
# 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}"
Başlıklar ekle
Gerekli üst bilgileri eklemek için aşağıdaki kodu kullanın.
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"
İstemciyi test et
Uç noktayla bağlantı kurun ve yanıtı kontrol edin.
req = request.Request(request_uri, content, request_headers, method='POST')
with request.urlopen(req) as response:
response_string = json.load(response)
print(response_string)
Kaynakları temizle
İleti̇şi̇m Hi̇zmetleri̇ aboneliğini temizlemek ve kaldırmak için, kaynağı veya kaynak grubunu silin. Kaynak grubunu silmek, onunla ilişkili olan diğer tüm kaynakları da siler. Azure Communication Services kaynaklarını temizleme ve Azure Functions kaynaklarını temizleme hakkında daha fazla bilgi edinebilirsiniz.