API — это просто веб-сайт.
Веб-сайт, который содержит только данные (обычно в виде JSON), без html, CSS или java-скрипта.
Чтобы вызвать API MOZ, мы должны создать строку URL, которая будет отправлена на сервер MOZ. Сервер читает этот URL (запрос) и решает, какую информацию вы хотите. Он отправляет эту информацию обратно либо в браузер, либо в программу, которая была написана для создания вызова API.
Процесс выглядит следующим образом:
Чтобы сначала вызвать MOZ API, нам нужно решить, как должен выглядеть URL-адрес запроса.
Чтобы проиллюстрировать, как это сделать, я буду использовать пример запроса полномочий домена для веб-сайта comparethemarket.com. (Полное раскрытие информации. Я работаю в компании Compare the Market, поэтому я выбрал их веб-сайт).
Заполненный URL-адрес выглядит следующим образом (данные для входа были изменены):
Это было собрано с помощью следующих шагов:
- Запрос HTTP или HTTPS к имени хоста и ресурсу.
http://lsapi.seomoz.com/linkscape/
2. Команда API для вызова. Авторитет домена относится к url-метрикам:
http://lsapi.seomoz.com/linkscape/url-metrics/
3. Целевой URL для анализа (в данном случае comparethemarket.com).
http://lsapi.seomoz.com/linkscape/url-metrics/comparethemarket.com
4. Параметры для вызова. ? указывает, где начинаются параметры. & разделяет каждый параметр. «Cols=», тогда число является ссылкой на запрашиваемый параметр (в этом примере доменный орган, которому был присвоен код 68719476736). «Cols=» всегда стоит перед числом, независимо от того, какие параметры/информацию вы хотите узнать.
https://lsapi.seomoz.com/linkscape/url-metrics/comparethemarket.com?Cols=68719476736&Limit=10&
Ограничение относится к количеству знаков после запятой, которое вы возвращаете в ответе для авторитета домена.
5. Вставьте этот URL-адрес в свой браузер. Появится всплывающее окно с запросом информации для аутентификации.
Заполните это своим; Идентификатор доступа и секретный ключ.
Вы можете сгенерировать свой идентификатор доступа и секретный ключ здесь:
https://moz.com/products/api/keys
Бесплатный доступ позволяет выполнять один запрос каждые десять секунд, до 25 000 строк в месяц
Когда вы заполняете это, ваш браузер генерирует строку «зашифрованной аутентификации», подпись, которая добавляется в конец остальной части URL-адреса.
Завершенный URL-адрес выглядит так (я изменил секретный ключ и информацию о подписи):
6. Вызвать этот URL программой (написанной на C# или любом другом языке). Затем эта сигнатура конечной аутентификации должна быть закодирована вашей программой.
Эта подписанная аутентификация имеет 3 параметра строки запроса для каждого вызова:
- Идентификатор доступа
- Истекает (временная метка UNIX в секундах) — срок действия запроса в течение .. должен быть только на несколько минут раньше текущего времени.
- Подпись — хэш HMAC-SHA1 вашего Access ID, параметра Expires и вашего Секретного ключа. Безопасный хэш должен быть закодирован в base64, а затем в URL-коде, прежде чем Mozscape примет подпись как действительную.
Окончательная строка аутентификации, которая будет добавлена в конец URL-адреса вызова API, должна выглядеть следующим образом (опять же информация была изменена):
AccessID=member-cf180f1267&Expires=1267838899&Signature=LxvNXYcPqc%12BkapNKzHzYz2BI4SXfC%9H
Что такое зашифрованная подпись?
Часть 3, зашифрованная подпись относится к части «&Signature=» в конце вызова URL. Буквы и цифры, идущие после этой метки, создаются с помощью следующего процесса:
- Создайте хэш HMAC из 3-х описанных параметров (Access ID, Expires и Secret Key).
Идентификатор доступа ==> Строка HMAC-SHA1
HMAC — это метод, основанный на хешировании, который берет некоторую информацию, скажем, слово, и символ за символом изменяет эти не шестнадцатеричные числа.
SHA1 — это особый алгоритм, который используется для создания хэша HMAC.
Пример хэша HMAC-SHA1:
a298f932c163f3abf36c324f1e252e81eec577ea
Это в основном строка шестнадцатеричных символов.
(Создано с использованием; https://www.freeformatter.com/hmac-generator.html).
2. Затем мы преобразуем эту шестнадцатеричную строку в строку base64.
Шестнадцатеричная строка ==> строка base64
Hex — это строка с основанием 16. Base64 короче, но имеет гораздо большее количество букв и символов, которые его представляют.
Пример строки base64:
0kDaABnU4R+J6OiCjezSk5Io8vw=
(Создано с использованием; http://tomeko.net/online_tools/hex_to_base64.php?lang=en).
3. Преобразуйте эту строку base64 в строку с кодировкой URL.
Строка Base64 ==> Зашифрованная строка URL
Строка base64 может содержать символы, которые не поддерживаются в URL-адресе. Поскольку сгенерированная закодированная строка должна быть размещена в URL-адресе, последним шагом является ее шифрование.
Пример закодированной строки URL:
0kDaABnU4R%2BJ6OiCjezSk5Io8vw%3D
Такие символы, как =, не могут использоваться в URL-адресе, поэтому на этом шаге эти неподдерживаемые символы закодированы.
(Создано с использованием; https://ostermiller.org/calc/encode.html).
Приложение, написанное на C#, которое может запрашивать информацию из API Moz.
Код будет следовать тем же шагам и порядку, что и выше. Приведенный ниже пример предназначен только для аспекта шифрования кода, поскольку я предположил, что объединение остальной части запроса URL в код довольно прямолинейно.
Класс аутентификации:
using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptography; namespace AuthenticatorPractice { public class AuthenticationHelper { private String accessID; private String secretKey; private int expiresInterval = 300; private DateTime currentDate = DateTime.Now; public AuthenticationHelper(String accessID) { this.accessID = accessID; this.secretKey = this.GetSecretKey(); } public string GetSecretKey() { var mySecretKey = System.IO.File.ReadAllText(@"C:\dev\XXXXXXXXX\config.txt"); return mySecretKey; } public int GetUNIXTimestamp() { var unixTime = currentDate.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); return (int)unixTime.TotalSeconds; } public int CreateAllowedAccessTime() { int allowedAccessTime = this.GetUNIXTimestamp() + expiresInterval; return allowedAccessTime; } public string HmacSHA1AndBase64Encription(int allowedAccessTime) { var value = accessID + allowedAccessTime; var key = secretKey; //Setup secrete key as Bytes array Byte[] secretBytes = UTF8Encoding.UTF8.GetBytes(key); //Create new HMACSHA1 algorithm with this secretekey var hmac = new HMACSHA1(secretBytes); //create bytes array with the value information Byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(value); // 1.Call computeHash on the hmac string which contains the seceret key. // This creates the hmac hash with the value information // 2. This is converted to a Base64 String then returned. return Convert.ToBase64String(hmac.ComputeHash(dataBytes)); } public string UrlEncription(string base64String) { //httpUtility is microsoft class to help send things over web... //The .UrlEncode is a built in method in HttpUtility class. return System.Web.HttpUtility.UrlEncode(base64String); } public string CreateEncriptedSignature(int allowedAccessTime) { var hmacSHA1AndBase64Encription = this.HmacSHA1AndBase64Encription(allowedAccessTime); var urlEncriptedString = this.UrlEncription(hmacSHA1AndBase64Encription); return urlEncriptedString; } public String GetAuthenticationStr(string encryptedSignature, int allowedAccessTime) { // Need to remove whitespace in accessID with .Replace String stringToSign = "AccessID=member-" + accessID.Replace(" ", "") + "&Expires=" + allowedAccessTime + "&Signature=" + encryptedSignature; return stringToSign; } } }
Этот класс сначала создает зашифрованную строку подписи, а затем добавляет ее к строке с данными AccessID и Expires.
Чтобы вызвать и использовать этот класс, класс Programme.cs будет выглядеть так:
using System; namespace AuthenticatorPractice { class Program { static void Main(string[] args) { AuthenticationHelper aOuth = new AuthenticationHelper("mozscape - 45676fedfgg11918"); var accessTime1 = aOuth.CreateAllowedAccessTime(); var encryptedSignature = aOuth.CreateEncriptedSignature(accessTime1); var authenticationStr = aOuth.GetAuthenticationStr(encryptedSignature, accessTime1); Console.WriteLine(authenticationStr); // var hmacHashString = aOuth.HmacSHA1HashString(accessTime1); //Console.WriteLine(hmacHashString); //var base64String = aOuth.Base64Encrption("dasbdsdnng%798700887777"); //Console.WriteLine(base64String); //var urlEncryptStr = aOuth.UrlEncription(hmacHashString); //Console.WriteLine(urlEncryptStr); Console.ReadKey(); } } }
Репозиторий этой программы можно найти на моем github: https://github.com/abitravers1989/autheticationSpike.
Почему это шифрование было сделано Moz?
Это было сделано потому, что база данных Moz, скорее всего, будет содержать шифрование вашего идентификатора доступа и секретного ключа. Они сделают те же шаги (возможно, запретят шифрование URL-адресов), как только сгенерируют информацию о вашей учетной записи. Это означает, что они не хранят в своей базе данных (что могут видеть инженеры, работающие на них, или, возможно, кто-то, кто взломал систему, чтобы получить доступ) вашу информацию, а вместо этого они держат ее закодированную версию. Это означает, что кто-то не сможет узнать вашу информацию, если получит доступ к базе данных, в которой она содержится.
Это пример одностороннего шифрования.
В этой статье я расширил документацию, которую MOZ собрал, о том, как составить строку URL-адреса запроса для получения информации из своего API. Я использовал пример запроса полномочий домена для comparethemarket.com. Если вы хотите узнать, как запросить любую другую информацию, ознакомьтесь с их документацией здесь.
Я продемонстрировал, как создать шифрование подписи URL с помощью приложения C#, но если вы хотите использовать другой язык, вы можете найти примеры того, как это сделать здесь.