Envío de solicitudes de API de rechazo con la API (HMAC)
En este artículo se describe cómo habilitar la administración de rechazo para el recurso de Azure Communication Services mediante la autenticación basada en código de autenticación de mensajes hash (HMAC).
Inicio rápido: envío de solicitudes de API de rechazo con la API (HMAC)
El envío de una solicitud de API de rechazo es similar a un SMS como se describe en el tutorial de Azure Communication Services Postman con la diferencia de los puntos de conexión para las acciones de rechazo (agregar, quitar o comprobar) y el cuerpo. El cuerpo de la solicitud tiene la misma estructura para todas las acciones, mientras que el contenido de la respuesta difiere ligeramente.
Puntos de conexión
Action | Punto de conexión |
---|---|
Sumar | {{endpoint}}/sms/optouts:add?api-version=2024-12-10-preview |
Quitar | {{endpoint}}/sms/optouts:remove?api-version=2024-12-10-preview |
Comprobación | {{endpoint}}/sms/optouts:check?api-version=2024-12-10-preview |
Estos son algunos ejemplos en distintos idiomas.
Solicitud de ejemplo
Encabezados de solicitud
Encabezado | Valor |
---|---|
Tipo de contenido | application/json |
x-ms-date | Jueves, 10 de agosto de 2023, 12:39:55 GMT |
x-ms-content-sha256 | JKUqoPANwVA55u/NOCsS0Awa4cYrKKNtBwUqoaqrob0= |
Autorización | HMAC-SHA256 SignedHeaders=x-ms-date; anfitrión; x-ms-content-sha256&Signature=IMbd3tE3nOgEkeUQGng6oQew5aEcrZJQqHkyq8qsbLg= |
Cuerpo de la solicitud
{
"from": "+15551234567",
"recipients": [
{
"to": "+15550112233"
},
{
"to": "+15550112234"
}
]
}
Respuesta de muestra
En general, el contenido de la respuesta es el mismo para todas las acciones y contiene el HttpStatusCode
de éxito o error por destinatario. La única diferencia es que la acción Check
, que también devuelve la marca isOptedOut
.
Estado de respuesta
- 200 Ok
Agregar el cuerpo de la respuesta a la acción de rechazo
{
"value": [
{
"to": "+15550112233",
"httpStatusCode": 200
},
{
"to": "+15550112234",
"httpStatusCode": 200
}
]
}
Quitar el cuerpo de la respuesta a la acción de rechazo
{
"value": [
{
"to": "+15550112233",
"httpStatusCode": 200
},
{
"to": "+15550112234",
"httpStatusCode": 200
}
]
}
Comprobar el cuerpo de la respuesta a la acción de rechazo
{
"value": [
{
"to": "+15550112233",
"httpStatusCode": 200,
"isOptedOut": true
},
{
"to": "+15550112234",
"httpStatusCode": 200,
"isOptedOut": false
}
]
}
Código de ejemplo
Para empezar a usar la API de rechazo de SMS de Azure Communication Services, aplique el siguiente código en C# de ejemplo.
Requisitos previos
- Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
- La versión del SDK de .NET Core debe ser superior a v6 para el sistema operativo.
- Un recurso activo de Communication Services y una cadena de conexión. Consulte Creación de un recurso de Communication Services.
- Número de teléfono habilitado para SMS. Consulte Obtenga un número de teléfono.
Código de ejemplo para usar la API de rechazo
En este ejemplo se muestra cómo usar la API de Administración de rechazo en C# para agregar, quitar o comprobar entradas de rechazo mediante programación.
using System.Globalization;
using System.Security.Cryptography;
using System.Text;
// Sample for Add action. Replace with Check or Remove as necessary.
async Task SendOptOutAdd(string acsResourceConnectionString, string payload)
{
const string ApiPrivatePreviewVersion = "2024-12-10-preview";
const string dateHeader = "x-ms-date";
string accesskey = GetConnectionStringPart(acsResourceConnectionString, "accesskey");
var endpointUri = new Uri(GetConnectionStringPart(acsResourceConnectionString, "endpoint"));
using var httpClient = new HttpClient();
httpClient.BaseAddress = endpointUri;
string method = "POST";
string baseAddress = httpClient.BaseAddress.ToString().TrimEnd('/');
var requestUri = new Uri($"{baseAddress}/sms/optouts:add?api-version={ApiPrivatePreviewVersion }", UriKind.RelativeOrAbsolute);
string hashedBody = ComputeSha256Hash(payload);
string utcNowString = DateTimeOffset.UtcNow.ToString("r", CultureInfo.InvariantCulture);
string stringToSign = $"{method}\n{requestUri.PathAndQuery}\n{utcNowString};{requestUri.Host};{hashedBody}";
string signature = ComputeHmacSha256Hash(accesskey, stringToSign);
string authHeader = $"HMAC-SHA256 SignedHeaders={dateHeader};host;x-ms-content-sha256&Signature={signature}";
using HttpRequestMessage request = new();
request.Headers.TryAddWithoutValidation(dateHeader, utcNowString);
request.Headers.TryAddWithoutValidation("x-ms-content-sha256", hashedBody);
request.Headers.TryAddWithoutValidation("Authorization", authHeader);
request.RequestUri = requestUri;
request.Method = new HttpMethod(method);
request.Content = new StringContent(payload, Encoding.UTF8, "application/json");
HttpResponseMessage response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
Console.WriteLine(response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
Console.WriteLine(response.Headers.ToString());
}
string ComputeSha256Hash(string rawData)
{
using SHA256 sha256Hash = SHA256.Create();
byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));
return Convert.ToBase64String(bytes);
}
string ComputeHmacSha256Hash(string key, string rawData)
{
using HMACSHA256 hmacSha256 = new HMACSHA256(Convert.FromBase64String(key));
byte[] bytes = hmacSha256.ComputeHash(Encoding.ASCII.GetBytes(rawData));
return Convert.ToBase64String(bytes);
}
string GetConnectionStringPart(string acsResourceConnectionString, string key)
{
return acsResourceConnectionString.Split($"{key}=").Last().Split(';').First();
}
// Usage
const string ConnectionString = "endpoint=https://[CONTOSO].communication.azure.com/;accesskey=******";
var payload = System.Text.Json.JsonSerializer.Serialize(new
{
from = "+15551234567", //replace with your allowed sender number
recipients = new[] {
new { to = "+15550112233" } //replace with your recipient
},
});
await SendOptOutAdd(ConnectionString, payload);
Para empezar a usar la API de rechazo de SMS de Azure Communication Services, use el siguiente código en JavaScript de ejemplo.
Requisitos previos
- Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
- Navegador o Node.js Active LTS y Maintenance LTS (se recomiendan 8.11.1 y 10.14.1).
- Un recurso activo de Communication Services y una cadena de conexión. Consulte Creación de un recurso de Communication Services.
- Número de teléfono habilitado para SMS. Consulte Obtenga un número de teléfono.
- CryptoJS son implementaciones en JavaScript de algoritmos criptográficos estándar y seguros.
Código de ejemplo para usar la API de rechazo
En este ejemplo se muestra cómo usar la API de Administración de rechazo en JavaScript para agregar, quitar o comprobar entradas de rechazo mediante programación.
<script src="Scripts/CryptoJS/sha256-min.js" type="text/javascript"></script>
<script src="Scripts/CryptoJS/hmac-sha256.js" type="text/javascript"></script>
<script src="Scripts/CryptoJS/enc-base64-min.js" type="text/javascript"></script>
const ConnectionString = "endpoint=https://[CONTOSO].communication.azure.com/;accesskey=******";
// Sample for Add action. Replace with Check or Remove as necessary.
function sendOptOutAdd(acsResourceConnectionString, payload, apiVersion = "2024-12-10-preview")
{
try
{
var acsRCS = acsResourceConnectionString
.split(";")
.map(i =>
{
var p = i.indexOf("=");
return [i.substr(0, p), i.substr(p + 1)];
})
.reduce((a, i) => ({ ...a, [i[0]]: i[1] }), {});
var uri = `${trimEnd(acsRCS.endpoint, "/")}/sms/optouts:add?api-version=${apiVersion}`;
var url = new URL(uri);
var method = "POST";
var utcNow = new Date().toUTCString();
var bodyJson = JSON.stringify(payload);
var hashedBody = CryptoJS.SHA256(bodyJson).toString(CryptoJS.enc.Base64);
var stringToSign = `${method}\n${url.pathname}${url.search}\n${utcNow};${url.host};${hashedBody}`;
var signature = CryptoJS.HmacSHA256(stringToSign, CryptoJS.enc.Base64.parse(acsRCS.accesskey)).toString(CryptoJS.enc.Base64);
fetch(uri, {
method: method,
headers: {
"content-type": "application/json",
"x-ms-date": utcNow,
"x-ms-content-sha256": hashedBody,
Authorization: `HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=${signature}`
},
body: bodyJson
})
.then(response => response.json())
.then(console.warn)
.catch(console.error);
}
catch (ex)
{
console.error(ex);
}
}
function trimEnd(s, c)
{
while (s.slice(-1) == c)
s = s.slice(0, -1);
return s;
}
// Usage
var payload = {
from: "+15551234567",
recipients: [
{ to: "+15550112233" }
],
};
sendOptOutAdd(ConnectionString, payload);
Para empezar a usar la API de rechazo de SMS de Azure Communication Services, aplique el siguiente código en Java de ejemplo.
Requisitos previos
- Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
- Kit de desarrollo de Java (JDK), versión 8 o posterior.
- Un recurso activo de Communication Services y una cadena de conexión. Consulte Creación de un recurso de Communication Services.
- Número de teléfono habilitado para SMS. Consulte Obtenga un número de teléfono.
Código de ejemplo para usar la API de rechazo
En este ejemplo se muestra cómo usar la API de Administración de rechazo en Java para agregar, quitar o comprobar entradas de rechazo mediante programación.
// Sample for Add action. Replace with Check or Remove as necessary.
public class App
{
public static void main(String[] args) throws Exception
{
String connectionString = "endpoint=https://[CONTOSO].communication.azure.com/;accesskey=******";
OptOutRequest payload = new OptOutRequest();
payload.from = "+15551234567";
payload.recipients = new ArrayList<Recipient>();
payload.recipients.add(new Recipient("+15550112233"));
SendOptOut(connectionString, payload);
}
public static void SendOptOutAdd(String connectionString, OptOutRequest payload) throws Exception
{
String apiVersion = "2024-12-10-preview";
String[] arrOfStr = connectionString.split(";");
String endpoint = arrOfStr[0].split("=")[1];
String accessKey = arrOfStr[1].split("=")[1];
String body = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT).writeValueAsString(payload);
String dateHeaderName = "x-ms-date";
DateTimeFormatter headerDateFormat = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH).withZone(ZoneId.of("GMT"));
String dateHeader = headerDateFormat.format(Instant.now());
String verb = "POST";
URI uri = URI.create(endpoint + "sms/optouts:add?api-version==" + apiVersion);
String hostName = uri.getHost();
String pathAndQuery = uri.getPath() + "?" + uri.getQuery();
String encodedHash = Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA-256").digest(body.getBytes(StandardCharsets.UTF_8)));
String stringToSign = verb + '\n' + pathAndQuery + '\n' + dateHeader + ';' + hostName + ';' + encodedHash;
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKeySpec = new SecretKeySpec(Base64.getDecoder().decode(accessKey.getBytes()), "HmacSHA256");
mac.init(secretKeySpec);
String signature = Base64.getEncoder().encodeToString(mac.doFinal(stringToSign.getBytes()));
String authHeader = "HMAC-SHA256 SignedHeaders=" + dateHeaderName + ";host;x-ms-content-sha256&Signature=" + signature;
HttpClient client = HttpClients.custom().build();
HttpUriRequest request = RequestBuilder
.post(uri)
.setHeader(HttpHeaders.CONTENT_TYPE, "application/json")
.setHeader(dateHeaderName, dateHeader)
.setHeader("x-ms-content-sha256", encodedHash)
.setHeader("Authorization", authHeader)
.setEntity(new StringEntity(body, "UTF-8"))
.build();
HttpResponse r = client.execute(request);
HttpEntity entity = r.getEntity();
}
}
public class OptOutRequest
{
public String from;
public ArrayList<Recipient> recipients;
}
public class Recipient
{
public String to;
}
Pasos siguientes
En este inicio rápido, ha aprendido a enviar solicitudes de rechazo.