Настройка и настройка SharePoint Embedded

Завершено

В этом упражнении вы создадите приложение Microsoft Entra ID, настроите SharePoint Embedded в клиенте Microsoft 365 SharePoint и создадите первый тип контейнера и контейнер.

Предварительные условия

Регистрация приложения Microsoft Entra ID

Пользовательские приложения SharePoint Embedded используют пользовательское приложение Microsoft Entra ID для проверки подлинности и получения необходимых разрешений для вызова API Microsoft Graph и Microsoft SharePoint.

Откройте браузер и перейдите к вводу идентификатора администратора Microsoft Entra. Войдите с помощью рабочей или учебной учетной записи для клиента Microsoft 365 с правами глобального администратора.

Выберите Identity Applications Registrations (Регистрация приложений > удостоверений>) в области навигации слева, а затем — Создать регистрацию.

Снимок экрана: Центр администрирования Microsoft Entra ID для регистрации приложений

На странице Регистрация приложения задайте необходимые значения следующим образом, а затем выберите Зарегистрировать:

  • Имя: приложение SharePoint Embedded
  • Поддерживаемые типы учетных записей: учетные записи в любом каталоге организации (любой клиент Microsoft Entra ID — multitenant)

Снимок экрана: страница регистрации приложения.

После создания приложения SharePoint Embedded идентификатор Microsoft Entra отображает сведения о новом приложении. Создайте текстовый файл для отслеживания нескольких значений, которые понадобятся вам позже в этом модуле.

Скопируйте идентификатор приложения (клиента) & идентификатор каталога (клиента) со страницы обзора приложения в локальный текстовый файл.

Снимок экрана: идентификаторы приложения и клиента новой регистрации приложения.

Настройка проверки подлинности

Затем настройте параметры проверки подлинности приложения. Выберите Управление > проверкой подлинности в области навигации слева, а затем выберите Добавить платформу.

Снимок экрана: страница проверки подлинности приложения.

Выберите параметр Веб и в поле URI перенаправления введите https://oauth.pstmn.io/v1/callback и нажмите кнопку Настроить.

Затем выберите Добавить URI для новой веб-платформыhttps://oauth.pstmn.io/v1/browser-callback и нажмите кнопку Настроить.

Эти два параметра будут использоваться для проверки подлинности и получения маркеров доступа с помощью клиента Postman позже в этом модуле.

Снимок экрана: добавление второго URI перенаправления на веб-платформу.

Прокрутите вниз до раздела Неявное предоставление и гибридные потоки и выберите параметр Маркеры доступа (используются для неявных потоков), а затем нажмите кнопку Сохранить.

Добавьте другую платформу, выбрав Добавить платформу, одностраничное приложение, задайте для URI перенаправления значение http://localhost, а затем выберите Настроить.

Настройка разрешений API

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

Примечание.

На момент публикации необходимые разрешения еще не отображаются в селекторе API в Центре администрирования Microsoft Entra ID. Чтобы добавить разрешения для FileStorageContainer.Selected Microsoft Graph и Container.Selected SharePoint, вы добавите их непосредственно в манифест приложения по идентификаторам разрешений.

Выберите Управление > манифестом в области навигации слева. Найдите свойство requiredResourceAccess и измените его так, чтобы оно выглядело следующим образом:

"requiredResourceAccess": [
  {
    "resourceAppId": "00000003-0000-0ff1-ce00-000000000000",
    "resourceAccess": [
      {
        "id": "4d114b1a-3649-4764-9dfb-be1e236ff371",
        "type": "Scope"
      },
      {
        "id": "19766c1b-905b-43af-8756-06526ab42875",
        "type": "Role"
      }
    ]
  },
  {
    "resourceAppId": "00000003-0000-0000-c000-000000000000",
    "resourceAccess": [
      {
        "id": "085ca537-6565-41c2-aca7-db852babc212",
        "type": "Scope"
      },
      {
        "id": "40dc41bc-0f7e-42ff-89bd-d9516947e474",
        "type": "Role"
      }
    ]
  }
],

Важно!

Не создавайте повторяющиеся объекты с тем же resourceAppIds. Вместо этого добавьте дополнительные объекты в существующий resourceAppIdsобъект . Например, если для requiredResourceAccess уже задано следующее:

"requiredResourceAccess": [
 {
   "resourceAppId": "00000003-0000-0000-c000-000000000000",
   "resourceAccess": [
     {
       "id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d",
       "type": "Scope"
     }
   ]
 }
],

Добавьте два новых разрешения к существующему "resourceAppId": "00000003-0000-0000-c000-000000000000" объекту, чтобы он получил три (3) разрешения.

Для некоторых разрешений требуется согласие администратора. Выберите Разрешения API в области навигации слева, прокрутите страницу вниз и выберите ссылку Корпоративные приложения.

На странице Разрешения выберите Предоставить согласие администратора для Contoso. При появлении запроса на вход используйте ту же рабочую и учебную учетные записи, что и для входа в Центр администрирования Microsoft Entra ID. На странице Запрашиваемые разрешения выберите Принять , чтобы предоставить согласие администратора для двух пар разрешений: FileStorageContainer.Selected для Microsoft Graph и Container.Selected для SharePoint. Две пары представляют приложение & делегированных параметров для каждого из двух разрешений.

Создание секрета клиента

Для проверки подлинности приложения с помощью потока учетных данных клиента OAuth2 с идентификатором Microsoft Entra ему требуется идентификатор клиента и секрет клиента.

Выберите Управление > сертификатами & секретами в области навигации слева.

На странице Секреты клиента выберите Новый секрет клиента. Добавьте описание и выберите срок действия, а затем выберите Добавить.

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

Создание сертификата

В отличие от Microsoft Graph, которая позволяет выполнять проверку подлинности приложения с помощью идентификатора клиента и секрета, SharePoint требует, чтобы приложение проверялось с помощью идентификатора клиента и сертификата. Теперь нам нужно создать сертификат.

Откройте запрос Windows PowerShell от имени администратора и выполните следующий сценарий PowerShell. При появлении запроса введите имя сертификата, например SharePoint Embedded:

$name = Read-Host -Prompt "Certificate name: "
$cert = New-SelfSignedCertificate -Subject "CN=$name" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256
Export-Certificate -Cert $cert -FilePath "$name.cer"

# Private key to Base64
$privateKey = [System.Security.Cryptography.X509Certificates.RSACertificateExtensions]::GetRSAPrivateKey($cert)
$privateKeyBytes = $privateKey.Key.Export([System.Security.Cryptography.CngKeyBlobFormat]::Pkcs8PrivateBlob)
$privateKeyBase64 = [System.Convert]::ToBase64String($privateKeyBytes, [System.Base64FormattingOptions]::InsertLineBreaks)

# Private key file contents
$privateKeyFileContent = @"
-----BEGIN PRIVATE KEY-----
$privateKeyBase64
-----END PRIVATE KEY-----
"@

# Output to file
$privateKeyFileContent | Out-File -FilePath "$name.key" -Encoding Ascii

Сценарий PowerShell сохранит сертификат (*.cer) и закрытый ключ (*.key) в папку, в которой был выполнен сценарий PowerShell.

В Центре администрирования Microsoft Entra ID на странице "Сертификаты & секреты " приложения выберите Сертификаты , а затем выберите Отправить сертификат.

Снимок экрана: отправка нового сертификата в приложение.

*.cer Отправьте созданный скриптОм PowerShell, присвойте сертификату описание и нажмите кнопку Добавить.

После отправки сертификата скопируйте весь отпечаток , отображаемый в локальный текстовый файл.

Создание нового типа контейнера для приложения SharePoint Embedded

Следующим шагом является создание типа контейнера для приложения.

Откройте запрос Windows PowerShell от имени администратора.

Установка или обновление модуля PowerShell Для SharePoint Online

Если вы еще не установили модуль PowerShell SharePoint Online , установите его, выполнив следующую команду:

Install-Module "Microsoft.Online.SharePoint.PowerShell"

Если он установлен, убедитесь, что установлена последняя версия, обновив его:

Upgrade-Module "Microsoft.Online.SharePoint.PowerShell"

Примечание.

Если вы не уверены, что он уже установлен, попробуйте выполнить Upgrade-Module первый. В случае сбоя он не установлен, поэтому запустите Install-Module командлет .

Создание типа контейнера

После установки последнего модуля PowerShell SharePoint Online следующим шагом является создание типа контейнера в клиенте.

Обновите следующие значения в следующем скрипте PowerShell, а затем выполните скрипт:

  • {{SPO_ADMIN_URL}}: это URL-адрес центра администрирования SharePoint Online. Это можно сделать, войдя в [https://portal.microsoft.com](https://portal.microsoft.com) с помощью рабочей и учебной учетной записи администратора клиента, выберите Показать все в нижней части навигации слева, а затем выберите Центры > администрирования SharePoint. Скопируйте URL-адрес Центра администрирования SharePoint и используйте это значение. Например, если идентификатор клиента — Contoso123, url-адрес администратора будет иметь значение https://contoso123-admin.sharepoint.com.
  • {{CONTAINER_TYPE_NAME}}: выберите имя для нового типа контейнера. Например, используйте FirstContainerType.
  • {{AZURE_ENTRA_APP_ID}}: задайте значение идентификатора приложения Microsoft Entra ID, также известного как "идентификатор клиента", созданного ранее. Это значение должно находиться в локальном текстовом файле.
Import-Module "Microsoft.Online.SharePoint.PowerShell"
Connect-SPOService -Url "{{SPO_ADMIN_URL}}"
New-SPOContainerType -TrialContainerType -ContainerTypeName "{{CONTAINER_TYPE_NAME}}" -OwningApplicationId "{{AZURE_ENTRA_APP_ID}}"

Сценарий PowerShell отобразит сведения о новом типе контейнера, например:

Container Type ID:
===============================================================================
ContainerTypeId     : 3a6b1fc4-0bd9-04b3-3a2a-4843fbb60914
ContainerTypeName   : FirstContainerType
OwningApplicationId : 763cd5ea-ade4-4d2a-a143-29498920e18f
Classification      : Standard
AzureSubscriptionId : 00000000-0000-0000-0000-000000000000
ResourceGroup       :
Region              :

Скопируйте и ContainerTypeName в локальный ContainerTypeId текстовый файл для последующего использования.

Настройка Postman для проверки подлинности с помощью Идентификатора Microsoft Entra для получения маркеров доступа к делегатам и приложениям для Microsoft Graph и SharePoint Online

Последним шагом является регистрация нового типа контейнера, созданного в клиенте Microsoft 365 разработчика или поставщика с потребляющим клиентом. Это делается с помощью REST API SharePoint. На этом шаге вы будете использовать клиент Postman.

Перед вызовом REST API SharePoint с помощью Postman необходимо сначала настроить Postman для получения маркера доступа.

Создание среды Postman

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

В Postman выберите Среды, а затем щелкните значок плюса, чтобы создать новую среду.

Снимок экрана: создание новой среды в Postman.

Назовите среду SharePoint Embedded.

Снимок экрана: новая среда Postman.

Добавьте следующие переменные в среду и задайте для начального значения значения vales из локального текстового файла. Сохраните среду после добавления этих переменных.

Переменная Тип Примечания Пример
Clientid default Идентификатор клиента или приложения, созданного ранее в Центре администрирования Microsoft Entra ID. 763cd5ea-ade4-4d2a-a143-29498920e18f
ClientSecret Секрет Секрет клиента приложения, ранее созданного в Центре администрирования Microsoft Entra ID. JXZ8Q........ jbvanC
ConsumingTenantId default Идентификатор клиента или каталога (GUID) приложения, ранее созданного в Центре администрирования Microsoft Entra ID. 4c57ca2e-a63d-4999-9b69-610a7296e89b
RootSiteURL default URL-адрес клиента SharePoint Online без косой черты. Это то же самое, что и URL-адрес Центра администрирования SharePoint Online без строки -admin. https://contoso123.sharepoint.com
ContainerTypeId default Идентификатор типа контейнера, созданного ранее 3a6b1fc4-0bd9-04b3-3a2a-4843fbb60914
TenantName default Идентификатор клиента SharePoint Online. Это первая часть URL-адреса Центра администрирования SharePoint Online без строки -admin. contoso123
CertThumbprint default Отпечаток сертификата, который вы ранее отправили для приложения, созданного в Центре администрирования Microsoft Entra ID. 905EEA21C472368A36ADEDB26CCE6E760049BC1E
CertPrivateKey Секрет Закрытый ключ сертификата. Скопируйте все содержимое из файла *.key, созданного ранее выполненным скриптом PowerShell, включая разделители -----begin и end сертификата. ЗАКРЫТЫЙ КЛЮЧ ----BEGIN----- ... -----END PRIVATE KEY---—
ContainerID default Не заполняйте это поле. Вы будете использовать его позже.

Снимок экрана: заполненная среда Postman.

Выберите среду, выбрав ее в раскрывающемся списке в правом верхнем углу клиента Postman. Раскрывающийся список находится сразу под значками шестеренки и оповещений, а также над кнопками Сохранить и Поделиться в той же строке, что и вкладки.

Создание коллекции Postman

Затем создайте новую коллекцию Postman, которая будет хранить запросы и получать маркеры доступа.

В Postman выберите Коллекции, а затем щелкните значок плюса, чтобы создать новую коллекцию.

Назовите коллекцию SharePoint Embedded.

В новой коллекции создайте в наборы папок, используя много контекста коллекции для хранения запросов для контейнеров; один в делегированной папке и один в папке Application :

Снимок экрана: папки в новой коллекции Postman.

Настройка папки приложения коллекции Postman

Следующим шагом является обновление параметра проверки подлинности папки приложения . Для этого требуется немного больше работы, так как нам нужно получить маркер только для приложения для вызова Microsoft Graph. Для этого вы настроите папку Application для скачивания скрипта и сохраните его в глобальной переменной для последующего использования.

Выберите папку Приложение , а затем перейдите на вкладку Авторизация . Задайте для параметра Типзначение Маркер носителя , а для маркера — значение {{AppOnlyCertGraphToken}}.

Примечание.

Postman отобразит ошибку проверки следующим образом. Это ожидаемо, и сейчас его можно игнорировать. Эта переменная будет создана со скриптом через некоторое время.

Перейдите на вкладку Скрипт предварительного запроса и введите следующий скрипт:

// download jsrsasign library and save it to a global variable
if (!pm.globals.has('jsrsasign-js')) {
  pm.sendRequest(
    'https://kjur.github.io/jsrsasign/jsrsasign-all-min.js',
    function (err, res) {
      if (err) {
        throw new Error(err);
      } else {
        console.log('Downloaded RSA library');
        pm.globals.set('jsrsasign-js', res.text());
      }
    }
  );
}

Сохраните изменения в коллекции.

Настройка папки "Контейнеры приложений>" коллекции Postman

Затем выберите папку Контейнеры приложений > коллекции.

На вкладке Авторизация задайте для параметра Типзначение Наследовать проверку подлинности от родительского элемента.

На вкладке Скрипт предварительного запроса введите следующий скрипт:

async function ensureAccessToken () {
  var validToken = false;
  var token = pm.environment.get('AppOnlyCertGraphToken');
  if (token) {
    console.log('checking stored token');
    try {
      var tokenObj = KJUR.jws.JWS.parse(token);
      var nbf = tokenObj.payloadObj.nbf;
      var exp = tokenObj.payloadObj.exp;
      var now = getTimeInSec();
      if (nbf <= now && now < exp) {
        validToken = true;
      } else {
        console.log("Stored access token is expired");
      }
    } catch (e) {
      console.log("Unable to parse stored access token");
    }
  } else {
    console.log("No access token found");
  }
  if (!validToken) {
    acquireAccessToken();
  }
}

function acquireAccessToken() {
  console.log("Acquiring a new access token");
  var jwt = getRequestJwt();
  console.log(jwt);
  var tid = pm.environment.get('ConsumingTenantId');

  const tokenRequest = {
    url: `https://login.microsoftonline.com/${tid}/oauth2/v2.0/token`,
    method: 'POST',
    header: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: {
      mode: 'urlencoded',
      urlencoded: [
        { key: 'client_assertion_type', value: 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer' },
        { key: 'client_assertion', value: jwt },
        { key: 'client_id', value: pm.environment.get('ClientID') },
        { key: 'scope', value: 'https://graph.microsoft.com/.default' },
        { key: 'grant_type', value: 'client_credentials' }
      ]
    }
  };
  pm.sendRequest(tokenRequest, (error, response) => {
    if (error) {
      console.log('Unable to acquire token: ' + error);
    } else {
      var responseJson = response.json();
      var token = responseJson.access_token;
      if (!token)
        throw Error("Invalid or no access token received");
      pm.environment.set('AppOnlyCertGraphToken', token);
    }
  });
}

function getRequestJwt () {
  var header = {
    'alg': 'RS256',
    'typ': 'JWT',
    'x5t': safeBase64EncodedThumbprint(pm.environment.get('CertThumbprint'))
  };

  var now = getTimeInSec();
  var tid = pm.environment.get('ConsumingTenantId');
  var payload = {
    'aud': `https://login.microsoftonline.com/${tid}/oauth2/v2.0/token`,
    'exp': now + 60 * 60,
    'iss': pm.environment.get('ClientID'),
    'jti': pm.variables.replaceIn('{{$guid}}'),
    'nbf': now,
    'sub': pm.environment.get('ClientID'),
    'iat': now
  };

  var encryptedPk = pm.environment.get('CertPrivateKey');
  var decryptedPk = encryptedPk;
  if (pm.environment.has('CertPassword') && pm.environment.get('CertPassword') !== '') {
    decryptedPk = KEYUTIL.getKey(encryptedPk, pm.environment.get('CertPassword'));
  }
  var sHeader = JSON.stringify(header);
  var sPayload = JSON.stringify(payload);
  return KJUR.jws.JWS.sign(header.alg, sHeader, sPayload, decryptedPk);
}

function getTimeInSec() {
  return Math.floor(Date.now() / 1000);
}

function safeBase64EncodedThumbprint (thumbprint) {
  var numCharIn128BitHexString = 128/8*2;
  var numCharIn160BitHexString = 160/8*2;
  var thumbprintSizes  = {};
  thumbprintSizes[numCharIn128BitHexString] = true;
  thumbprintSizes[numCharIn160BitHexString] = true;
  var thumbprintRegExp = /^[a-f\d]*$/;

  var hexString = thumbprint.toLowerCase().replace(/:/g, '').replace(/ /g, '');

  if (!thumbprintSizes[hexString.length] || !thumbprintRegExp.test(hexString)) {
    throw 'The thumbprint does not match a known format';
  }

  var base64 = (Buffer.from(hexString, 'hex')).toString('base64');
  return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
}

var navigator = {}; // fake a navigator object for the lib
var window = {}; // fake a window object for the lib
eval(pm.globals.get('jsrsasign-js'));
ensureAccessToken();

Примечание.

Этот скрипт будет использовать переменные среды для проверки подлинности с помощью Идентификатора Microsoft Entra, чтобы получить маркер только приложения для Microsoft Graph и сохранить его в новой или существующей переменной с именем AppOnlyCertGraphToken. Это необходимо сделать с помощью скрипта, так как Postman не поддерживает поток учетных данных клиента OAuth2, использующий сертификат клиента вместо секрета клиента.

Теперь при выполнении запроса из папки Контейнеры приложений > предварительный скрипт запроса получит маркер, обновит переменную среды, заданную на вкладке Авторизация родительской папки приложения, а затем выполнит запрос. Так как запрос находится в папке Контейнеры , на вкладке "Авторизация " задано наследование от родительского элемента, он получает конфигурацию проверки подлинности, которая была сброшена.

Сохраните изменения в коллекции.

На этом этапе Postman теперь настроен для получения маркера доступа только для приложений для вызовов Microsoft Graph.

Регистрация типа контейнера в используемом клиенте

После настройки Postman вы можете добавить запрос на регистрацию типа контейнера в используемом клиенте.

В Postman выберите Коллекции в области навигации слева и разверните узел Внедренное > приложение SharePoint , выберите контекстное меню ... в узле Контейнеры и выберите Добавить запрос.

Переименуйте запрос на Зарегистрировать тип контейнера.

Задайте для метода HTTP значение PUT и следующую конечную точку:

{{RootSiteURL}}/_api/v2.1/storageContainerTypes/{{ContainerTypeId}}/applicationPermissions

В скрипте предварительного запроса добавьте следующий код, чтобы получить маркер только приложения для вызова REST API SharePoint:

async function ensureAccessToken () {
  var validToken = false;
  var token = pm.environment.get('AppOnlyCertSPOToken');
  if (token) {
    console.log('checking stored token');
    try {
      var tokenObj = KJUR.jws.JWS.parse(token);
      var nbf = tokenObj.payloadObj.nbf;
      var exp = tokenObj.payloadObj.exp;
      var now = getTimeInSec();
      if (nbf <= now && now < exp) {
        validToken = true;
      } else {
        console.log("Stored access token is expired");
      }
    } catch (e) {
      console.log("Unable to parse stored access token");
    }
  } else {
    console.log("No access token found");
  }
  if (!validToken) {
    acquireAccessToken();
  }
}

function acquireAccessToken() {
  console.log("Acquiring a new access token");
  var jwt = getRequestJwt();
  console.log(jwt);
  var tid = pm.environment.get('ConsumingTenantId');

  const tokenRequest = {
    url: `https://login.microsoftonline.com/${tid}/oauth2/v2.0/token`,
    method: 'POST',
    header: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: {
      mode: 'urlencoded',
      urlencoded: [
        { key: 'client_assertion_type', value: 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer' },
        { key: 'client_assertion', value: jwt },
        { key: 'client_id', value: pm.environment.get('ClientID') },
        { key: 'scope', value: pm.environment.get('RootSiteURL') + '/.default' },
        { key: 'grant_type', value: 'client_credentials' }
      ]
    }
  };
  pm.sendRequest(tokenRequest, (error, response) => {
    if (error) {
      console.log('Unable to acquire token: ' + error);
    } else {
      var responseJson = response.json();
      var token = responseJson.access_token;
      pm.environment.set('AppOnlyCertSPOToken', token);
    }
  });
}

function getRequestJwt () {
  var header = {
    'alg': 'RS256',
    'typ': 'JWT',
    'x5t': safeBase64EncodedThumbprint(pm.environment.get('CertThumbprint'))
  };

  var now = getTimeInSec();
  var tid = pm.environment.get('ConsumingTenantId');
  var payload = {
    'aud': `https://login.microsoftonline.com/${tid}/oauth2/v2.0/token`,
    'exp': now + 60 * 60,
    'iss': pm.environment.get('ClientID'),
    'jti': pm.variables.replaceIn('{{$guid}}'),
    'nbf': now,
    'sub': pm.environment.get('ClientID'),
    'iat': now
  };

  var encryptedPk = pm.environment.get('CertPrivateKey');
  var decryptedPk = encryptedPk;
  if (pm.environment.has('CertPassword') && pm.environment.get('CertPassword') !== '') {
    decryptedPk = KEYUTIL.getKey(encryptedPk, pm.environment.get('CertPassword'));
  }
  var sHeader = JSON.stringify(header);
  var sPayload = JSON.stringify(payload);
  return KJUR.jws.JWS.sign(header.alg, sHeader, sPayload, decryptedPk);
}

function getTimeInSec() {
  return Math.floor(Date.now() / 1000);
}

function safeBase64EncodedThumbprint (thumbprint) {
  var numCharIn128BitHexString = 128/8*2;
  var numCharIn160BitHexString = 160/8*2;
  var thumbprintSizes  = {};
  thumbprintSizes[numCharIn128BitHexString] = true;
  thumbprintSizes[numCharIn160BitHexString] = true;
  var thumbprintRegExp = /^[a-f\d]*$/;

  var hexString = thumbprint.toLowerCase().replace(/:/g, '').replace(/ /g, '');

  if (!thumbprintSizes[hexString.length] || !thumbprintRegExp.test(hexString)) {
    throw 'The thumbprint does not match a known format';
  }

  var base64 = (Buffer.from(hexString, 'hex')).toString('base64');
  return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
}

var navigator = {}; // fake a navigator object for the lib
var window = {}; // fake a window object for the lib
eval(pm.globals.get('jsrsasign-js'));
ensureAccessToken();

На вкладке Авторизация задайте для параметра Типзначение Маркер носителя , а для параметра Токен — значение {{AppOnlyCertSPOToken}}. Эта переменная маркера создается и задается в скрипте предварительного запроса.

На вкладке Текст выберите необработанный тип, задайте для типа данных json и добавьте следующий код в текст:

{
  "value": [
    {
      "appId": "{{ClientID}}",
      "delegated": ["full"],
      "appOnly": ["full"]
    }
  ]
}

Снимок экрана: запрос на регистрацию типа контейнера

Нажмите кнопку Отправить , чтобы выполнить запрос Зарегистрировать тип контейнера . Postman отобразит ответ под запросом:

Снимок экрана: успешный ответ на регистрацию типа контейнера в используемом клиенте Microsoft 365.

Сводка

В этом упражнении вы создали приложение Microsoft Entra ID, настроите SharePoint Embedded в клиенте Microsoft 365 SharePoint и создадите свой первый тип контейнера с помощью PowerShell, новой коллекции Postman и связанной среды для отправки запросов в Microsoft Graph и REST API SharePoint.

Проверьте свои знания

1.

Какая из следующих ролей является правильной ролью типа контейнера в приложении SharePoint Embedded?

2.

Что должен делать администратор клиента потребителя после создания типа контейнера в клиенте поставщика?

3.

Какие роли можно применить на уровне контейнера в SharePoint Embedded?