API — это просто веб-сайт.

Веб-сайт, который содержит только данные (обычно в виде JSON), без html, CSS или java-скрипта.

Чтобы вызвать API MOZ, мы должны создать строку URL, которая будет отправлена ​​​​на сервер MOZ. Сервер читает этот URL (запрос) и решает, какую информацию вы хотите. Он отправляет эту информацию обратно либо в браузер, либо в программу, которая была написана для создания вызова API.

Процесс выглядит следующим образом:

Чтобы сначала вызвать MOZ API, нам нужно решить, как должен выглядеть URL-адрес запроса.

Чтобы проиллюстрировать, как это сделать, я буду использовать пример запроса полномочий домена для веб-сайта comparethemarket.com. (Полное раскрытие информации. Я работаю в компании Compare the Market, поэтому я выбрал их веб-сайт).

Заполненный URL-адрес выглядит следующим образом (данные для входа были изменены):

https://lsapi.seomoz.com/linkscape/url-metrics/comparethemarket.com?Cols=68719476736&Limit=10&AccessID=member-mozscape-45676fedfgg11918&Expires=1519988622&Signature=dg%2bWtcTbVBg%2fQmtAIwcloy2S7aY%3d%3d

Это было собрано с помощью следующих шагов:

  1. Запрос 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-адрес выглядит так (я изменил секретный ключ и информацию о подписи):

https://lsapi.seomoz.com/linkscape/url-metrics/comparethemarket.com?Cols=68719476736&Limit=10&AccessID=member-mozscape-454568fedfgg11918&Expires=1519088614&Signature=dg%2bWtcTbVBg%2gQcvAIwcloy2S7aP%3

6. Вызвать этот URL программой (написанной на C# или любом другом языке). Затем эта сигнатура конечной аутентификации должна быть закодирована вашей программой.

Эта подписанная аутентификация имеет 3 параметра строки запроса для каждого вызова:

  1. Идентификатор доступа
  2. Истекает (временная метка UNIX в секундах) — срок действия запроса в течение .. должен быть только на несколько минут раньше текущего времени.
  3. Подпись — хэш HMAC-SHA1 вашего Access ID, параметра Expires и вашего Секретного ключа. Безопасный хэш должен быть закодирован в base64, а затем в URL-коде, прежде чем Mozscape примет подпись как действительную.

Окончательная строка аутентификации, которая будет добавлена ​​в конец URL-адреса вызова API, должна выглядеть следующим образом (опять же информация была изменена):

AccessID=member-cf180f1267&Expires=1267838899&Signature=LxvNXYcPqc%12BkapNKzHzYz2BI4SXfC%9H

Что такое зашифрованная подпись?

Часть 3, зашифрованная подпись относится к части «&Signature=» в конце вызова URL. Буквы и цифры, идущие после этой метки, создаются с помощью следующего процесса:

  1. Создайте хэш 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#, но если вы хотите использовать другой язык, вы можете найти примеры того, как это сделать здесь.