Поделиться через


Краткое руководство. Проверка подлинности с помощью идентификатора Microsoft Entra

Начало работы с Службы коммуникации Azure с помощью идентификатора Microsoft Entra. Пакеты SDK для удостоверений служб коммуникации и SMS поддерживают проверку подлинности Microsoft Entra.

В этом кратком руководстве показано, как авторизовать доступ к пакетам SDK удостоверений и SMS из среды Azure, которая поддерживает Active Directory. Здесь также описывается порядок тестирования кода в среде разработки путем создания субъекта-службы для работы.

Необходимые компоненты

Дополнительные компоненты

Настройка

При использовании Active Directory для других ресурсов Azure следует использовать управляемые удостоверения. Сведения о включении управляемых удостоверений для ресурсов Azure см. в одной из следующих статей.

Проверка подлинности зарегистрированного приложения в среде разработки

Если среда разработки не поддерживает единый вход или вход через веб-браузер, вы можете использовать зарегистрированное приложение для проверки подлинности из среды разработки.

Создание зарегистрированного приложения Microsoft Entra

Чтобы создать зарегистрированное приложение на основе Azure CLI, необходимо войти в учетную запись Azure, в которой должны выполняться операции. Для этого можно использовать команду az login и ввести учетные данные в браузере. После входа в учетную запись Azure из ИНТЕРФЕЙСА командной строки можно вызвать az ad sp create-for-rbac команду, чтобы создать зарегистрированное приложение и субъект-службу.

В следующем примере azure CLI используется для создания нового зарегистрированного приложения:

az ad sp create-for-rbac --name <application-name> --role Contributor --scopes /subscriptions/<subscription-id>

Команда az ad sp create-for-rbac вернет список свойств субъекта-службы в формате JSON. Скопируйте эти значения, чтобы их можно было использовать для создания необходимых переменных среды на следующем шаге.

{
    "appId": "generated-app-ID",
    "displayName": "service-principal-name",
    "name": "http://service-principal-uri",
    "password": "generated-password",
    "tenant": "tenant-ID"
}

Внимание

Назначение ролей Azure может занимать несколько минут.

Настройка переменных среды

Пакет SDK для удостоверений Azure считывает значения из трех переменных среды во время выполнения для проверки подлинности приложения. В следующей таблице описывается значение, которое задается для каждой переменной среды.

Переменная среды Значение
AZURE_CLIENT_ID Значение appId из созданного JSON
AZURE_TENANT_ID Значение tenant из созданного JSON
AZURE_CLIENT_SECRET Значение password из созданного JSON

Внимание

После задания переменных среды закройте и снова откройте окно консоли. Если вы используете Visual Studio или другую среду разработки, может потребоваться перезапустить ее, чтобы зарегистрировать новые переменные среды.

После установки этих переменных вы сможете использовать в коде объект DefaultAzureCredential для проверки подлинности выбранного вами клиента службы.

Примечание.

Итоговый код для этого краткого руководства можно найти на сайте GitHub.

Установка

Создание нового приложения C#

В окне консоли (cmd, PowerShell или Bash) выполните команду dotnet new, чтобы создать консольное приложение с именем ActiveDirectoryQuickstart. Эта команда создает простой проект Hello World на языке C# с одним файлом исходного кода: Program.cs.

dotnet new console -o ActiveDirectoryAuthenticationQuickstart

Измените каталог на только что созданную папку приложения и выполните команду dotnet build, чтобы скомпилировать приложение.

cd ActiveDirectoryAuthenticationQuickstart
dotnet build

Установка пакетов SDK

dotnet add package Azure.Communication.Identity
dotnet add package Azure.Communication.Sms
dotnet add package Azure.Identity

Использование пакетов SDK

Добавьте в Program.cs указанные ниже директивы using, чтобы использовать пакеты SDK для Azure Identity и службы хранилища Azure.

using Azure.Identity;
using Azure.Communication.Identity;
using Azure.Communication.Sms;
using Azure.Core;
using Azure;

Создание DefaultAzureCredential

Мы будем использовать DefaultAzureCredential для этого краткого руководства. Эти учетные данные подходят как для рабочих сред, так и для сред разработки. Так как это необходимо для каждой операции, это будет сделано в классе Program.cs. Добавьте следующий код в начало файла.

private DefaultAzureCredential credential = new DefaultAzureCredential();

Выпуск маркера для субъектов-служб

Теперь мы добавим код, который использует созданные учетные данные для выдачи маркера доступа VoIP. Мы вызовем этот код позже.

public AccessToken CreateIdentityAndGetTokenAsync(Uri resourceEndpoint)
{
    var client = new CommunicationIdentityClient(resourceEndpoint, this.credential);
    var result = client.CreateUserAndToken(scopes: new[] { CommunicationTokenScope.VoIP });
    var (user, token) = response.Value;
    return token;
}

Оправка текстовыми сообщениями с помощью субъектов-служб

В качестве еще одного примера использования субъектов-служб мы добавим следующий код, использующий те же учетные данные для отправки SMS.

public SmsSendResult SendSms(Uri resourceEndpoint, string from, string to, string message)
{
    SmsClient smsClient = new SmsClient(resourceEndpoint, this.credential);
    SmsSendResult sendResult = smsClient.Send(
            from: from,
            to: to,
            message: message,
            new SmsSendOptions(enableDeliveryReport: true) // optional
        );

    return sendResult;
}

Создание метода main

В Program.cs уже должен быть метод main. Теперь мы добавим код, который будет вызывать ранее созданный код, чтобы продемонстрировать использование субъектов-служб.

static void Main(string[] args)
{
    // You can find your endpoint and access key from your resource in the Azure portal
    // e.g. "https://<RESOURCE_NAME>.communication.azure.com";
    Uri endpoint = new("https://<RESOURCENAME>.communication.azure.com/");

    // We need an instance of the program class to use within this method.
    Program instance = new();

    Console.WriteLine("Retrieving new Access Token, using Service Principals");
    AccessToken response = instance.CreateIdentityAndGetTokenAsync(endpoint);
    Console.WriteLine($"Retrieved Access Token: {response.Token}");

    Console.WriteLine("Sending SMS using Service Principals");

    // You will need a phone number from your resource to send an SMS.
    SmsSendResult result = instance.SendSms(endpoint, "<Your Azure Communication Services Phone Number>", "<The Phone Number you'd like to send the SMS to.>", "Hello from using Service Principals");
    Console.WriteLine($"Sms id: {result.MessageId}");
    Console.WriteLine($"Send Result Successful: {result.Successful}");
}

Финальный файл Program.cs должен выглядеть так:

class Program
     {
          private DefaultAzureCredential credential = new DefaultAzureCredential();
          static void Main(string[] args)
          {
               // You can find your endpoint and access key from your resource in the Azure portal
               // e.g. "https://<RESOURCE_NAME>.communication.azure.com";
               Uri endpoint = new("https://acstestingrifox.communication.azure.com/");

               // We need an instance of the program class to use within this method.
               Program instance = new();

               Console.WriteLine("Retrieving new Access Token, using Service Principals");
               AccessToken response = instance.CreateIdentityAndGetTokenAsync(endpoint);
               Console.WriteLine($"Retrieved Access Token: {response.Token}");

               Console.WriteLine("Sending SMS using Service Principals");

               // You will need a phone number from your resource to send an SMS.
               SmsSendResult result = instance.SendSms(endpoint, "<Your Azure Communication Services Phone Number>", "<The Phone Number you'd like to send the SMS to.>", "Hello from Service Principals");
               Console.WriteLine($"Sms id: {result.MessageId}");
               Console.WriteLine($"Send Result Successful: {result.Successful}");
          }
          public AccessToken CreateIdentityAndGetTokenAsync(Uri resourceEndpoint)
          {
               var client = new CommunicationIdentityClient(resourceEndpoint, this.credential);
               var result = client.CreateUserAndToken(scopes: new[] { CommunicationTokenScope.VoIP });
               var (user, token) = response.Value;
               return token;
          }
          public SmsSendResult SendSms(Uri resourceEndpoint, string from, string to, string message)
          {
               SmsClient smsClient = new SmsClient(resourceEndpoint, this.credential);
               SmsSendResult sendResult = smsClient.Send(
                    from: from,
                    to: to,
                    message: message,
                    new SmsSendOptions(enableDeliveryReport: true) // optional
               );

               return sendResult;
          }
    }

Запуск программы

Теперь вы сможете запустить приложение с помощью dotnet run из папки приложения. Результат должен выглядеть так:

Retrieving new Access Token, using Service Principals
Retrieved Access Token: ey....
Sending SMS using Service Principals
Sms id: Outgoing_..._noam
Send Result Successful: True

Примечание.

Итоговый код для этого краткого руководства можно найти на сайте GitHub.

Установка

Создание нового приложения Node.js

Откройте терминал или командное окно, создайте каталог для своего приложения и перейдите к нему.

mkdir active-directory-authentication-quickstart && cd active-directory-authentication-quickstart

Воспользуйтесь командой npm init -y, чтобы создать файл package.json с параметрами по умолчанию.

npm init -y

Установка пакетов SDK

npm install @azure/communication-identity
npm install @azure/communication-common
npm install @azure/communication-sms
npm install @azure/identity

Создание нового файла

Откройте новый файл с помощью текстового редактора и сохраните его как index.js. Позже мы поместим наш код в этот файл.

Использование пакетов SDK

Добавьте следующие директивы require в начало файла index.js, чтобы использовать пакеты SDK для Azure Identity и службы хранилища Azure.

const { DefaultAzureCredential } = require("@azure/identity");
const { CommunicationIdentityClient, CommunicationUserToken } = require("@azure/communication-identity");
const { SmsClient, SmsSendRequest } = require("@azure/communication-sms");

Создание DefaultAzureCredential

Мы будем использовать DefaultAzureCredential для этого краткого руководства. Эти учетные данные подходят как для рабочих сред, так и для сред разработки. Так как это необходимо для каждой операции, это будет сделано в начале файла index.js.

    const credential = new DefaultAzureCredential();

Создание удостоверения и выпуск маркера с помощью субъектов-служб

Далее мы напишем функцию, которая создает новое удостоверение и выпускает маркер для этого удостоверения. Мы воспользуемся ею позже, чтобы протестировать настройку субъекта-службы.

async function createIdentityAndIssueToken(resourceEndpoint) {
    const client = new CommunicationIdentityClient(resourceEndpoint, credential);
    return await client.createUserAndToken(["chat"]);
}

Оправка текстовыми сообщениями с помощью субъектов-служб

Теперь напишем функцию, которая использует субъекты-службы для отправки текстовых сообщений.

async function sendSms(resourceEndpoint, fromNumber, toNumber, message) {
    const smsClient = new SmsClient(resourceEndpoint, credential);
    const sendRequest = {
        from: fromNumber,
        to: [toNumber],
        message: message
    };
    return await smsClient.send(
        sendRequest,
        {} //Optional SendOptions
    );
}

Создание функции main

С помощью этих функций мы теперь можем написать основную функцию для их вызова и демонстрации использования субъектов-служб.

async function main() {
    // You can find your endpoint and access key from your resource in the Azure portal
    // e.g. "https://<RESOURCE_NAME>.communication.azure.com";
    const endpoint = "https://<RESOURCE_NAME>.communication.azure.com/"

    
    console.log("Retrieving new Access Token, using Service Principals");
    const result = await createIdentityAndIssueToken(endpoint);
    console.log(`Retrieved Access Token: ${result.token}`);

    console.log("Sending SMS using Service Principals");

    // You will need a phone number from your resource to send an SMS.
    const smsResult = await sendSms(endpoint, "<FROM NUMBER>", "<TO NUMBER>", "Hello from Service Principals");
    console.log(`SMS ID: ${smsResult[0].messageId}`);
    console.log(`Send Result Successful: ${smsResult[0].successful}`);
}

main();

Окончательный файл index.js должен выглядеть так:

const { DefaultAzureCredential } = require("@azure/identity");
const { CommunicationIdentityClient, CommunicationUserToken } = require("@azure/communication-identity");
const { SmsClient, SmsSendRequest } = require("@azure/communication-sms");

const credential = new DefaultAzureCredential();

async function createIdentityAndIssueToken(resourceEndpoint) {
    const client = new CommunicationIdentityClient(resourceEndpoint, credential);
    return await client.createUserAndToken(["chat"]);
}

async function sendSms(resourceEndpoint, fromNumber, toNumber, message) {
    const smsClient = new SmsClient(resourceEndpoint, credential);
    const sendRequest = {
        from: fromNumber,
        to: [toNumber],
        message: message
    };
    return await smsClient.send(
        sendRequest,
        {} //Optional SendOptions
    );
}

async function main() {
    // You can find your endpoint and access key from your resource in the Azure portal
    // e.g. "https://<RESOURCE_NAME>.communication.azure.com";
    const endpoint = "https://<RESOURCE_NAME>.communication.azure.com/"

    
    console.log("Retrieving new Access Token, using Service Principals");
    const result = await createIdentityAndIssueToken(endpoint);
    console.log(`Retrieved Access Token: ${result.token}`);

    console.log("Sending SMS using Service Principals");

    // You will need a phone number from your resource to send an SMS.
    const smsResult = await sendSms(endpoint, "<FROM NUMBER>", "<TO NUMBER>", "Hello from Service Principals");
    console.log(`SMS ID: ${smsResult[0].messageId}`);
    console.log(`Send Result Successful: ${smsResult[0].successful}`);
}

main();

Запуск программы

После выполнения всех действий можно запустить файл, введя node index.js в каталоге проекта. При правильной настройке должен появиться результат, похожий на следующий.

    $ node index.js
    Retrieving new Access Token, using Service Principals
    Retrieved Access Token: ey...Q
    Sending SMS using Service Principals
    SMS ID: Outgoing_2021040602194...._noam
    Send Result Successful: true

Дополнительные требования для Java

Для Java также потребуется следующее:

Примечание.

Итоговый код для этого краткого руководства можно найти на сайте GitHub.

Установка

Создание нового приложения Java

Откройте терминал или командное окно. Перейдите в каталог, в котором нужно создать приложение Java. Выполните приведенную ниже команду, чтобы создать проект Java из шаблона maven-archetype-quickstart.

mvn archetype:generate -DgroupId=com.communication.quickstart -DartifactId=communication-quickstart -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false

Вы заметите, что задача generate создала каталог с тем же именем, что и у artifactId. В этом каталоге каталог src/main/java содержит исходный код проекта, pom.xml содержит источник теста, а файл src/test/java directory является объектной моделью проекта (POM).

Установка пакета

Откройте файл pom.xml в текстовом редакторе. Добавьте приведенный ниже элемент зависимости в группу зависимостей.

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-communication-identity</artifactId>
    <version>[1.4.0,)</version>
</dependency>
<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-communication-sms</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity</artifactId>
    <version>1.2.3</version>
</dependency>

Использование пакетов SDK

Добавьте в код указанные ниже директивы import, чтобы использовать пакеты SDK для Azure Identity и Azure Communication.

import com.azure.communication.common.*;
import com.azure.communication.identity.*;
import com.azure.communication.identity.models.*;
import com.azure.communication.sms.*;
import com.azure.communication.sms.models.*;
import com.azure.core.credential.*;
import com.azure.identity.*;

import java.util.*;

Создание DefaultAzureCredential

Мы будем использовать DefaultAzureCredential для этого краткого руководства. Эти учетные данные подходят как для рабочих сред, так и для сред разработки. Так как это необходимо для каждой операции, это будет сделано в классе App.java. Добавьте следующее в начало класса App.java.

private TokenCredential credential = new DefaultAzureCredentialBuilder().build();

Выпуск маркера для субъектов-служб

Теперь мы добавим код, который использует созданные учетные данные для выдачи маркера доступа VoIP. Мы вызовем этот код позже.

    public AccessToken createIdentityAndGetTokenAsync(String endpoint) {
          CommunicationIdentityClient communicationIdentityClient = new CommunicationIdentityClientBuilder()
                    .endpoint(endpoint)
                    .credential(this.credential)
                    .buildClient();

          CommunicationUserIdentifierAndToken result =  communicationIdentityClient.createUserAndToken(new ArrayList<>(Arrays.asList(CommunicationTokenScope.CHAT)));
          return result.getUserToken();
    }

Оправка текстовыми сообщениями с помощью субъектов-служб

В качестве еще одного примера использования субъектов-служб мы добавим следующий код, использующий те же учетные данные для отправки SMS.

     public SmsSendResult sendSms(String endpoint, String from, String to, String message) {
          SmsClient smsClient = new SmsClientBuilder()
                    .endpoint(endpoint)
                    .credential(this.credential)
                    .buildClient();

          // Send the message and check the response for a message id
          return smsClient.send(from, to, message);
     }

Создание метода main

В App.java уже должен быть метод main. Теперь мы добавим код, который будет вызывать ранее созданный код, чтобы продемонстрировать использование субъектов-служб.

    public static void main(String[] args) {
          App instance = new App();
          // You can find your endpoint and access key from your resource in the Azure portal
          // e.g. "https://<RESOURCE_NAME>.communication.azure.com";
          String endpoint = "https://<RESOURCE_NAME>.communication.azure.com/";

          System.out.println("Retrieving new Access Token, using Service Principals");
          AccessToken token = instance.createIdentityAndGetTokenAsync(endpoint);
          System.out.println("Retrieved Access Token: "+ token.getToken());

          System.out.println("Sending SMS using Service Principals");
          // You will need a phone number from your resource to send an SMS.
          SmsSendResult result = instance.sendSms(endpoint, "<FROM NUMBER>", "<TO NUMBER>", "Hello from Service Principals");
          System.out.println("Sms id: "+ result.getMessageId());
          System.out.println("Send Result Successful: "+ result.isSuccessful());
    }

Итоговый код App.java должен выглядеть следующим образом:

package com.communication.quickstart;

import com.azure.communication.common.*;
import com.azure.communication.identity.*;
import com.azure.communication.identity.models.*;
import com.azure.communication.sms.*;
import com.azure.communication.sms.models.*;
import com.azure.core.credential.*;
import com.azure.identity.*;

import java.util.*;

public class App 
{

    private TokenCredential credential = new DefaultAzureCredentialBuilder().build();

    public SmsSendResult sendSms(String endpoint, String from, String to, String message) {
          SmsClient smsClient = new SmsClientBuilder()
               .endpoint(endpoint)
               .credential(this.credential)
               .buildClient();

          // Send the message and check the response for a message id
          return smsClient.send(from, to, message);
    }
    
    public AccessToken createIdentityAndGetTokenAsync(String endpoint) {
          CommunicationIdentityClient communicationIdentityClient = new CommunicationIdentityClientBuilder()
                    .endpoint(endpoint)
                    .credential(this.credential)
                    .buildClient();

          CommunicationUserIdentifierAndToken result =  communicationIdentityClient.createUserAndToken(new ArrayList<>(Arrays.asList(CommunicationTokenScope.CHAT)));
          return result.getUserToken();
    }

    public static void main(String[] args) {
          App instance = new App();
          // You can find your endpoint and access key from your resource in the Azure portal
          // e.g. "https://<RESOURCE_NAME>.communication.azure.com";
          String endpoint = "https://<RESOURCE_NAME>.communication.azure.com/";

          System.out.println("Retrieving new Access Token, using Service Principals");
          AccessToken token = instance.createIdentityAndGetTokenAsync(endpoint);
          System.out.println("Retrieved Access Token: "+ token.getToken());

          System.out.println("Sending SMS using Service Principals");
          // You will need a phone number from your resource to send an SMS.
          SmsSendResult result = instance.sendSms(endpoint, "<FROM NUMBER>", "<TO NUMBER>", "Hello from Service Principals");
          System.out.println("Sms id: "+ result.getMessageId());
          System.out.println("Send Result Successful: "+ result.isSuccessful());
    }
}

Выполнение кода

Перейдите в каталог, содержащий файл pom.xml, и скомпилируйте проект с помощью следующей команды mvn.

mvn compile

Затем выполните сборку пакета.

mvn package

Выполните следующую команду mvn для запуска приложения.

mvn exec:java -Dexec.mainClass="com.communication.quickstart.App" -Dexec.cleanupDaemonThreads=false

Окончательный результат должен выглядеть так:

Retrieving new Access Token, using Service Principals
Retrieved Access Token: ey..A
Sending SMS using using Service Principals
Sms id: Outgoing_202104...33f8ae1f_noam
Send Result Successful: true

Примечание.

Итоговый код для этого краткого руководства можно найти на сайте GitHub.

Установка

Создание приложения Python

Откройте терминал или командное окно, создайте каталог для своего приложения и перейдите к нему.

mkdir active-directory-authentication-quickstart && cd active-directory-authentication-quickstart

Установка пакетов SDK

pip install azure-identity
pip install azure-communication-identity
pip install azure-communication-sms

Создание нового файла

Откройте и сохраните файл в созданной папке с именем authentication.py. Мы затем поместим наш код в этот файл.

Использование пакетов SDK

Добавьте следующие инструкции import в начало файла, чтобы использовать установленные пакеты SDK.

from azure.identity import DefaultAzureCredential
from azure.communication.identity import CommunicationIdentityClient
from azure.communication.sms import SmsClient

Создание DefaultAzureCredential

Мы будем использовать DefaultAzureCredential. Эти учетные данные подходят как для рабочих сред, так и для сред разработки. Так как мы будем использовать их в рамках этого краткого руководства, мы создадим их в начале файла.

     credential = DefaultAzureCredential()

Создание удостоверения и выпуск маркера с помощью субъектов-служб

Теперь мы добавим код, который использует созданные учетные данные для выдачи маркера доступа VoIP. Мы вызовем этот код позже:

def create_identity_and_get_token(resource_endpoint):
     client = CommunicationIdentityClient(resource_endpoint, credential)
     user, token_response = client.create_user_and_token(scopes=["voip"])

     return token_response

Оправка текстовыми сообщениями с помощью субъектов-служб

В качестве еще одного примера использования субъектов-служб мы добавим следующий код, использующий те же учетные данные для отправки SMS.

def send_sms(resource_endpoint, from_phone_number, to_phone_number, message_content):
     sms_client = SmsClient(resource_endpoint, credential)

     sms_client.send(
          from_=from_phone_number,
          to_=[to_phone_number],
          message=message_content,
          enable_delivery_report=True  # optional property
     )

Написание кода функции main

С созданными функциями мы теперь можем написать код функции main, которая будет вызывать написанные ранее функции.

# You can find your endpoint and access key from your resource in the Azure portal
# e.g. "https://<RESOURCE_NAME>.communication.azure.com";
endpoint = "https://<RESOURCE_NAME>.communication.azure.com/"

print("Retrieving new Access Token, using Service Principals");
result = create_identity_and_get_token(endpoint);
print(f'Retrieved Access Token: {result.token}');

print("Sending SMS using Service Principals");

# You will need a phone number from your resource to send an SMS.
sms_result = send_sms(endpoint, "<FROM_NUMBER>", "<TO_NUMBER>", "Hello from Service Principals");
print(f'SMS ID: {sms_result[0].message_id}');
print(f'Send Result Successful: {sms_result[0].successful}');

Окончательный файл authentication.py должен выглядеть примерно так:

from azure.identity import DefaultAzureCredential
from azure.communication.identity import CommunicationIdentityClient
from azure.communication.sms import SmsClient

credential = DefaultAzureCredential()

def create_identity_and_get_token(resource_endpoint):
     client = CommunicationIdentityClient(resource_endpoint, credential)
     user, token_response = client.create_user_and_token(scopes=["voip"])

     return token_response

def send_sms(resource_endpoint, from_phone_number, to_phone_number, message_content):
     sms_client = SmsClient(resource_endpoint, credential)

     response = sms_client.send(
          from_=from_phone_number,
          to=[to_phone_number],
          message=message_content,
          enable_delivery_report=True  # optional property
     )
     return response

# You can find your endpoint and access key from your resource in the Azure portal
# e.g. "https://<RESOURCE_NAME>.communication.azure.com";
endpoint = "https://<RESOURCE_NAME>.communication.azure.com/"

print("Retrieving new Access Token, using Service Principals");
result = create_identity_and_get_token(endpoint);
print(f'Retrieved Access Token: {result.token}');

print("Sending SMS using Service Principals");

# You will need a phone number from your resource to send an SMS.
sms_result = send_sms(endpoint, "<FROM_NUMBER>", "<TO_NUMBER>", "Hello from Service Principals");
print(f'SMS ID: {sms_result[0].message_id}');
print(f'Send Result Successful: {sms_result[0].successful}');

Запуск программы

После выполнения всех действий можно запустить файл, введя python authentication.py в каталоге проекта. При правильной настройке должен появиться результат, похожий на следующий.

    $ python authentication.py
    Retrieving new Access Token, using Service Principals
    Retrieved Access Token: ey...Q
    Sending SMS using using Service Principals
    SMS ID: Outgoing_2021040602194...._noam
    Send Result Successful: true

Следующие шаги