Как подключить свой сайт по протоколу OAuth 2.0 / OpenID Connect 1.0

В это разделе приводится краткая инструкция по подключению сайта к Blitz Identity Provider по протоколу OAuth 2.0 / OpenID Connect 1.0. Детальное описание размещено здесь.

Предположим, вы разрабатываете веб-сайт и хотите, чтобы вход пользователя производился с помощью сервера аутентификации Blitz Identity Provider. Проще всего подключить сайт к серверу по протоколу OAuth 2.0 / OpenID Connect 1.0. Для этого вам нужно:

  1. Зайти в консоль управления Blitz Identity Provider. Сервер аутентификации у вас должен быть предварительно установлен и запущен, а также у вас должна быть хотя бы одна пользовательская учетная запись. Исходим из того, что Blitz Identity Provider у вас установлен локально:
    http://localhost/blitz/console

  2. Перейти в раздел Приложения и выбрать пункт Добавить приложение. В появившемся окне задайте:

    • идентификатор вашего сайта. В терминологии OAuth 2.0 это client_id, при его задании недопустимо использовать двоеточие. Например, test_id;
    • название сайта (будет отображаться на странице входа);
    • домен сайта, т.е. его URL. Новое приложение
  3. Настроить протокол OAuth 2.0 для этого приложения. Для этого перейдите к свойствам добавленного приложения. Свойства приложения

  4. Пролистайте страницу вниз и выберите протокол OAuth 2.0 и нажмите ссылку Сконфигурировать. Конфигурирование приложения

  5. На открывшейся странице задайте:

    • секретный ключ подключаемого приложения (client_secret). Можно использовать ключ, cгенерированный автоматически;
    • допустимые префиксы ссылок возврата, они используются для проверки ссылок возврата (redirect_uri). В тестовых целях укажем здесь http://localhost. Такой префикс позволит возвращать пользователя на ваш сайт, установленный на http://localhost, в том числе на любую его страницу, например, на http://localhost/any/page.

      Остальные настройки на этой странице можете оставить без изменений (их описание – здесь). Настройки взаимодействия с приложением
  6. Теперь определите, какие данные о пользователе будет получать ваш сайт. Для этого откройте раздел OAuth 2.0 консоли управления. В этом разделе перейдите к Настройкам scopes и добавьте новое разрешение:

    • укажите его название (идентификатор), например, test_scope;
    • задайте его описание, оно будет отображаться пользователям;
    • добавьте атрибуты, которые можно получить по этому разрешению. Например, имя (name), фамилию (surname), адрес электронной почты (mail). Добавление разрешений
  7. Сохраните изменения.

Сервер аутентификации настроен! Осталось сконфигурировать ваш сайт. На стороне сайта вы можете настроить одну из множества OAuth 2.0 библиотек или реализовать взаимодействие самостоятельно. Рассмотрим в общем виде последовательно, какие шаги должен выполнить сайт, чтобы провести аутентификацию пользователя и получить данные о нем (будем использовать Authorization Code Flow):

  1. Сайт должен перенаправить пользователя в сервер аутентификации по ссылке:
    http://localhost/blitz/oauth/ae?scope=test_scope+openid&response_type=code&redirect_uri=http%3A%2F%2Flocalhost&state=342a2c0c-d9ef-4cd6-b328-b67d9baf6a7f&client_id=test_id
    В этой ссылке:

    • http://localhost – домен, на который установлен Blitz Identity Provider;
    • scope=test_scope+openid – разрешения, позволяющие провести аутентификацию (openid) и получить данные о пользователе (test_scope);
    • response_type=code – параметр, определяющий, что мы хотим получить авторизационный код;
    • redirect_uri=http%3A%2F%2Flocalhost – адрес, на который должен быть возвращен пользователь после проведения аутентификации (URL encoded);
    • state=342a2c0c-d9ef-4cd6-b328-b67d9baf6a7f – набор случайных символов (опционально);
    • client_id=test_id – идентификатор вашего сайта, заданный в параметрах приложеия.
  2. После того, как пользователь перейдет по этой ссылке, ему будет отображена страница входа: Страница входа

  3. Пользователю необходимо войти и дать сайту разрешение на доступ к данным (кнопка «Подтвердить»): Подтверждение

  4. В результате Blitz Identity Provider вернет браузер пользователя по ссылке, указанной ранее в redirect_uri, добавив к ней в качестве параметра авторизационный код (code) и набор случайных символов, переданный в исходном запросе (state). Например:
    http://localhost?code=dRbIFVTqIK_aLOuuefgmIRs3lxZ2Ouz-t2hvxlr6oxlEuMvl1u1ORdZyeGcZLYbO5aUlX3szPk5OPj579QZhMlCXXVCdQ6CtA0GhBICd5sA&state=342a2c0c-d9ef-4cd6-b328-b67d9baf6a7f

  5. Теперь сайту необходимо обменять авторизационный код на так называемый маркер доступа (access token). Для этого сайт должен выполнить POST-запрос следующего вида:

POST /blitz/oauth/te HTTP/1.1
Host: localhost
Authorization: Basic dGVzdF9pZDpNZnB4VWh2VDNaczFwTzI=
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&redirect_uri=http%3A%2F%2Flocalhost&code=dRbIFVTqIK_aLOuuefgmIRs3lxZ2Ouz-t2hvxlr6oxlEuMvl1u1ORdZyeGcZLYbO5aUlX3szPk5OPj579QZhMlCXXVCdQ6CtA0GhBICd5sA&state=342a2c0c-d9ef-4cd6-b328-b67d9baf6a7f

В данном запросе необходимо указать тот же redirect_uri, который был в исходном запросе, code – это авторизационный код, полученный на предыдущем этапе. В качестве заголовка Authorization следует указать значение Basic <secret>, где <secret> – это client_id:secret в формате base64. В нашем примере это test_id:MfpxUhvT3Zs1pO2, что соответствует секрету dGVzdF9pZDpNZnB4VWh2VDNaczFwTzI=.

  1. В качестве ответа будет возвращен json, содержащий результат проведенной аутентификации. Для получения данных об аутентифицированном пользователе нам необходим маркер доступа (access_token):
{
    "id_token": "eyJhbGciOiJSUzI1NiJ9.eyJub25jZSI6Ijk4NzY1NDMyMSIsImV4cCI6MTQ0NTAwNDc3NywiaWF0IjoxNDQ0OTk0MjEyLCJzdWIiOiJzemF5dHNldkBkZXYtYmxpdHotaWRwLmxvYyIsImF1ZCI6WyJsb2NhbGhvc3QvZGVtbzIiXSwiaXNzIjoiaHR0cHM6Ly9kZXYtYmxpdHoucmVheG9mdC5sb2MifQ.Ckt_dr9J4k514MIuQEDY88A026NWzdCcIIIDxOXaZxue52eQlNVxaDXIQ8F0IyG2T-2KmeSeVG7UK4RoYWhYWT7Skn5NfF-gFJIfXB4NfUGwt5iic5UGQkp-xGqKzTxCKduuWrp-oVb69Bd8fFCeFYTVhB-iWR_V1yZhYTipQt6rLVKaqEFPvRv6iN_cGGIr7k0EJtEvF6Y71ktf6ERnhCXsLn78mPeJv0H0jk6dWWl9JJxpZC6RvUEqv4Q8q92xXh7RjoMQUErNk03J74QLIdn3xYke0ch20fOauMPLYXOc0-cPwo5kjF5zK6-c1chrwfk2FFMCi1bGYpgcICEssQ",
    "access_token": "dO-xymwduYR8uFqvYYK1ghpk-tqantG5PstfomddlO5d2-BVzVVaNdHuJYdWxpL__c8MsLWB8IwmiUIEep53tnZR2mflAnYiguE0UyUZNBE",
    "expires_in": 3600,
    "scope": "test openid",
    "refresh_token": "1lEWX7IE7SESIXRJNJeN66oPdzoFSfOGDLB3foAgXUDfuzYf1aXS1FuJX5JM50mmDqHuX75t-DrtvM0ISa82vs_t0NI9O1AcAilduRzZ8Iw",
    "token_type": "bearer"
}
  1. Для получения данных о пользователе следует выполнить следующий GET-запрос:
GET /blitz/oauth/me HTTP/1.1
Host: localhost
Authorization: Bearer NINxnizbgYYQg94vEd6MjkTPxR3r2SZ3GO0HY0yEKLRXIDKsQ_0fZ-s9IAHBO92AszgTIqItY-_jsuIXqM_8i_6k8ohZcZ6acqpax-g6e8o
Cache-Control: no-cache

В этом запросе заголовок Authorization должен иметь значение Bearer <access_token>, где <access_token> – это маркер доступа, полученный на предыдущем этапе.

  1. В ответе будут возвращены данные о пользователе, которые определены в scope. Пример ответа:
{
    "surname": "Петров",
    "name": "Иван",
    "mail": "mail@example.com"
}