После моего недавнего доклада, посвященного использованию PowerShell для доступа к веб-службам, мне был задан вопрос о том, какое шифрование и какой вид проверки подлинности используют веб-службы. Признаюсь, я не сразу нашелся, что ответить. Вопрос относится к сфере «механики безопасности Windows», с которой я знаком недостаточно хорошо. Все же я ответил что-то вроде: «То, что сегодня используется в Интернете, — SSL, идентификаторы пользователей и пароли».

В PowerShell настройка канала SSL с помощью команд invoke-webrequest или invoke-restmethod чрезвычайно проста и сводится к замене в универсальном указателе ресурса URL префикса http на https, а пара «открытый-закрытый ключ» в сертификате SSL, безусловно, намного надежнее любого пароля. Когда уровень безопасности с возможностью применения ключей длиной до 4096 разрядов станет распространенным повсеместно, можно будет сменить ID пользователей и пароли на зашифрованный канал (я знаю, что квантовые вычисления положат конец сертификатам, но полагаю, что это произойдет не очень скоро).

Итак, чтобы удовлетворить требования большинства веб-служб, нужно либо вообще ничего не делать (как в случае многих общедоступных служб), либо получить ключ или пару «ID пользователя — ключ». По существу, ключ, или, как его часто называют, секрет, — это просто альтернатива паролю. Мы рассматривали пример, демонстрирующий запрос города, страны, штата у Bing по почтовому индексу. Сам запрос прост, но сначала нужно получить у Microsoft ключ, чтобы компания могла отслеживать количество просмотров.

В случае с Bing достаточно было вставить ключ в содержащую URL часть запроса (не защищенного SSL в соответствии с пожеланием Microsoft). Однако в некоторых случаях приходится встраивать ключ в заголовок HTTP, защищенный SSL-соединением. Далее будет показано, как это сделать.

Из предыдущих примеров мы знаем, что Национальное управление океанических и атмосферных исследований (NOAA) поставляет множество интересных геофизических данных. Доступ к большей части таких данных не требует ввода ID пользователя и ключа, но данные, производимые Национальным центром климатических данных (NCDC), к ним не относятся. Служба центра относится к «службам RESTful» и предоставляет общие сведения о том, как получить доступ и где запрашивать ключ, именуемый токеном.

Один из наиболее примечательных наборов данных NCDC имеет идентификатор GHCND, что означает «Глобальная сеть климатологических данных — дневная сводка». Запросить сводку данных можно на любой диапазон дат для конкретного почтового индекса:

https://www.ncdc.noaa.gov/cdoweb/api/v2/data? datasetid=
   &locationid=ZIP:&startdate=
   &enddate=&

Например, вывести данные на 10 февраля 2016 года для почтового индекса 23456 позволяет такой запрос:

https://www.ncdc.noaa.gov/cdo-web/api/v2/data?
   datasetid=GHCND&locationid=ZIP:23456&
   startdate=2016-02-10&enddate=2016-02-10

Попытка получить от NCDC эту сводку данных с помощью команд invoke-webrequest или invoke-restmethod, вероятнее всего, закончится ошибкой 400: Token parameter is required («Требуется параметр токена»). Предположим, что мы запросили и получили от NCDC токен со значением XYZ. В реальности такого быть не может, так как ключи имеют большую длину. Чтобы служба NCDC выполнила запрос, он должен содержать в заголовке HTTP следующий текст:

token = XYZ

У invoke-webrequest и invoke-restmethod есть параметр -headers, принимающий хеш-таблицу пар «имя-значение», поэтому можно создать такую пару:

$HeaderPairs=@{token="XYZ"}

Соединив все вместе, получим:

$HeaderPairs=@{token='XYZ'}
$URI = 'https://www.ncdc.noaa.gov/cdo-web/
   api/v2/data? datasetid=GHCND&locationid=
   ZIP:23456&startdate=2016-02-10&enddate=2016-02-10'
$result = irm $URI -headers $HeaderPairs

Так как используется invoke-restmethod, а не invoke-webrequest, результаты уже преобразованы из формата JSON в объект PowerShell с атрибутом Results. Чтобы увидеть результаты, вводим команду:

$result.results

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

date : 2016-02-10T00:00:00
datatype : TMAX
station : GHCND:USC00440385
attributes : ,,H,
value : 94

Здесь datatype определяет тип фрагмента данных (TMAX — максимальная, TMIN — минимальная измеренная температура за день), а value — значение температуры, равное -6 для TMIN и 94 для TMAX. Разница между значениями велика, но температуры записаны по шкале Цельсия в десятых долях градуса. Это значит, что минимальная температура составляет -0,6 °C, а максимальная 9,4 °C, что соответствует примерно 31 и 49 градусам по шкале Фаренгейта.

Итак, многие веб-службы не требуют проверки подлинности; те же, которые предусматривают такую проверку, обычно применяют простые методы, например ключ или пару «ID пользователя — ключ». Многие службы требуют вставки ключа в URL, но есть и такие, для которых ключ нужно помещать в заголовок, и теперь мы знаем, как передать его средствами PowerShell. Помните об использовании префикса https в URL!