2019-02-21 01:34:44 +05:30
Авторизация по протоколу OAuth2
-------------------------------
2015-02-07 01:39:41 +05:30
2021-03-20 07:18:10 +05:30
Н а этой странице вы найдёте информацию о реализации авторизации по протоколу OAuth2 на вашем проекте через сервис Аккаунты Ely.by. Реализация этого протокола позволяет вашим пользователям производить авторизацию с использованием своего аккаунта Ely.by.
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
Регистрация приложения
======================
2015-02-07 01:39:41 +05:30
2021-03-20 07:18:10 +05:30
Для начала вам необходимо `создать новое приложение <https://account.ely.by/dev/applications/new> `_ . Выберите тип приложения **Веб‑сайт** . В качестве *адреса переадресации* можно указать только домен, но для повышения безопасности лучше использовать полный путь переадресации. Примеры допустимых адресов:
2015-02-07 01:39:41 +05:30
2021-03-20 07:18:10 +05:30
* `` http://site.com ``
* `` http://site.com/oauth/ely ``
* `` http://site.com/oauth.php?provider=ely ``
2015-02-08 00:28:07 +05:30
2021-03-20 07:18:10 +05:30
После успешного добавления приложения вы попадёте на страницу с о списком всех ваших приложений. Кликнув по названию приложения вы увидите е г о идентификатор `` clientId `` и секрет `` clientSecret `` . Они буду использоваться на следующих шагах.
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
Инициализация авторизации
=========================
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
Для инициализации процесса авторизации вам необходимо перенаправить пользователя по следующему URL:
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. code-block :: text
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
https://account.ely.by/oauth2/v1?client_id=<clientId>&redirect_uri=<redirectUri>&response_type=code&scope=<scopesList>
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. list-table :: Допустимые параметры запроса
:widths: 1 1 98
2015-02-07 01:39:41 +05:30
:header-rows: 1
2019-02-21 01:34:44 +05:30
* - Параметр
- Пример значения
2015-02-07 01:39:41 +05:30
- Описание
2019-02-21 01:34:44 +05:30
* - *clientId*
2021-03-20 07:18:10 +05:30
- `` ely ``
2019-02-21 06:22:03 +05:30
- **Обязательное** . ClientId, полученный при регистрации.
2019-02-21 01:34:44 +05:30
* - *redirect_uri*
2021-03-20 07:18:10 +05:30
- `` http://site.com/oauth.php ``
2019-02-21 01:34:44 +05:30
- **Обязательное** . Адрес обратной переадресации, совпадающий с адресом, указанным при регистрации приложения
* - *response_type*
2021-03-20 07:18:10 +05:30
- `` code ``
2019-02-21 01:34:44 +05:30
- **Обязательное** . Тип ответа. Н а данный момент поддерживается только `` code `` .
* - *scope*
2021-03-20 07:18:10 +05:30
- `` account_info account_email ``
- **Обязательное** . Перечень разрешений, доступ к которым вы хотите получить, разделённые пробелом. Смотрите все доступные права в `разделе ниже <#available-scopes> `_ .
2019-02-21 01:34:44 +05:30
* - *state*
2021-03-20 07:18:10 +05:30
- `` isfvubuysdboinsbdfvit ``
- Случайно сгенерированная строка. Используется для увеличения безопасности в качестве идентификатора сессии. Будет возвращена в неизменённом виде после завершения авторизации.
2019-02-21 01:34:44 +05:30
* - *description*
2021-03-20 07:18:10 +05:30
- `` यो अनुप्रयोग विवरण ``
- Если ваше приложение доступно на нескольких языках, то используя это поле вы можете переопределить стандартное описание в соответствии с предпочтительным языком пользователя.
2019-02-21 01:34:44 +05:30
* - *prompt*
2021-03-20 07:18:10 +05:30
- `` consent `` или `` select_account ``
- Принудительно отобразить запрос прав (`` consent `` ) или принудительно запросить выбор аккаунта (`` select_account `` ).
2019-02-21 01:34:44 +05:30
* - *login_hint*
2021-03-20 07:18:10 +05:30
- `` erickskrauch `` или `` erickskrauch@ely.by ``
- Если у пользователя есть несколько аккаунтов, то указав этот в этом параметре username или E-mail пользователя вы автоматически выберете аккаунт за него. Это полезно в случае повторного входа, когда токен истёк.
2019-02-21 01:34:44 +05:30
.. _available_scopes:
.. list-table :: Перечень доступных scopes
:widths: 1 99
:header-rows: 0
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
* - **account_info**
- Получение информации о пользователе.
* - **account_email**
- В ответе на запрос информации о пользователе будет также присутствовать е г о email.
* - **offline_access**
2021-03-20 07:18:10 +05:30
- Вместе с `` access_token `` вы также получите и `` refresh_token `` . Смотрите подробнее `соответствующем разделе <#refresh-token-grant> `_ .
2019-02-21 01:34:44 +05:30
* - **minecraft_server_session**
- `` access_token `` можно будет использовать в качестве сессии для Minecraft.
2015-02-07 01:39:41 +05:30
2021-03-20 07:18:10 +05:30
-------------------------------------------------------------------------------
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
Сформировав ссылку, разместите её в вашем шаблоне:
2015-02-07 01:39:41 +05:30
.. code-block :: html
2019-02-21 01:34:44 +05:30
<a href="<ва ша _с с ылка >">Войти через Ely.by</a>
2021-03-20 07:18:10 +05:30
По нажатию на ссылку, пользователь попадёт на нашу страницу авторизации, откуда после он будет перенаправлен обратно по адресу, указанному в параметре `` redirect_uri `` .
2015-02-07 01:39:41 +05:30
2021-03-20 07:18:10 +05:30
Обратная переадресация выполняется в виде `` <redirect_uri>?code=<код авторизации>&state=<state> `` для успешной авторизации и `` <redirect_uri?error=<идентификатор ошибки>&error_message=<описание ошибки> `` для неудачной.
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
Пример успешного и неудачного редиректов:
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. code-block :: text
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
http://site.com/oauth/ely.php?code=dkpEEVtXBdIcgdQWak4SOPEpTJIvYa8KIq5cW9GJ&state=ajckasdcjasndckbsadc
http://site.com/oauth/ely.php?error=access_denied&error_message=The+resource+owner+or+authorization+server+denied+the+request.
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. _authorization-code-grant:
2015-02-07 01:39:41 +05:30
Обмен кода на ключ
==================
2021-03-20 07:18:10 +05:30
После получения кода авторизации (`` auth_code `` ), вам необходимо обменять е г о на ключ авторизации (`` access_key `` ). Для этого необходимо выполнить POST запрос на URL:
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. code-block :: text
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
https://account.ely.by/api/oauth2/v1/token
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
И передать туда следующие параметры:
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. list-table ::
:widths: 1 99
:header-rows: 0
* - `` client_id ``
- ClientID, полученный при регистрации приложения.
* - `` client_secret ``
- ClientSecret, полученный при регистрации приложения.
* - `` redirect_uri ``
- Точный адрес, использованный для переадресации пользователя.
* - `` grant_type ``
- В данном случае указывается `` authorization_code `` .
2024-01-24 06:42:10 +05:30
* - `` code ``
- Код авторизации, полученный в GET-параметрах после успешной переадресации.
2019-02-21 01:34:44 +05:30
**Пример реализации обмена на PHP:**
2015-02-07 01:39:41 +05:30
.. code-block :: php
<?php
2019-02-21 01:34:44 +05:30
// В этой переменной будут храниться ваши параметры OAuth2
$oauthParams = [
'client_id' => 'ely', // Ваш ClientId, полученный при регистрации
'client_secret' => 'Pk4uCtZw5WVlSUpvteJuTZkVqHXZ6aNtTaLPXa7X', // Ваш ClientSecret, полученный при регистрации
'redirect_uri' => 'http://someresource.by/oauth/some.php', // Адрес, на который вы ожидаете получить пользователя обратно (текущий url)
'grant_type' => 'authorization_code',
];
// Если возникла ошибка, то прерываем выполнение скрипта
if (isset($_GET['error'])) {
echo $_GET['error_message'];
return;
}
2015-02-07 01:39:41 +05:30
// Выполняем код ниже только если пришёл код авторизации
if (!is_null($_GET['code'])) {
2019-02-21 01:34:44 +05:30
$oauthParams['code'] = $_GET['code'];
2015-02-07 01:39:41 +05:30
$curl = curl_init();
2019-02-21 01:34:44 +05:30
curl_setopt($curl, CURLOPT_URL, 'https://account.ely.by/api/oauth2/v1/token');
2015-02-07 01:39:41 +05:30
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
2019-02-21 01:34:44 +05:30
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($oauthParams));
$out = json_decode(curl_exec($curl), true);
2015-02-07 01:39:41 +05:30
curl_close($curl);
}
2019-02-21 01:34:44 +05:30
Пояснение к коду:
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
* Сначала мы объявляем переменную `` $oauthParams `` , в которую заносим значения, полученные после регистрации приложения.
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
* Затем проверяем, не возникла-ли ошибка. В этом случае сразу же прерываем выполнение.
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
* Формируем POST запрос к форме обмена `` code `` на `` access_token `` , передавая необходимые поля.
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
* Выполняем запрос, получаем ответ, переводим е г о из JSON в ассоциативный массив.
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. _authorization-code-grant-response:
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
Ответ сервера
~~~~~~~~~~~~~
2015-02-07 01:39:41 +05:30
2021-03-20 07:18:10 +05:30
В случае успешного запроса в теле ответа будет находиться результат обмена кода авторизации на `` access_token `` . Данные являются JSON документом и могут быть легко интерпретированы средствами используемого языка программирования.
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
Тело JSON документа содержит следующие поля:
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. code-block :: javascript
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
{
"access_token": "4qlktsEiwgspKEAotazem0APA99Ee7E6jNryVBrZ",
"refresh_token": "m0APA99Ee7E6jNryVBrZ4qlktsEiwgspKEAotaze", // Представлен только в случае запроса с правами offline_access
"token_type": "Bearer",
"expires_in": 86400 // Количество секунд, на которое выдан токен
}
2015-02-07 01:39:41 +05:30
2021-03-20 07:18:10 +05:30
Н а этом процедура авторизации закончена. Полученный `` access_token `` может быть использован для получения информации о пользователе и взаимодействия с нашим API.
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
Получение информации о пользователе
===================================
2015-02-07 01:39:41 +05:30
2021-03-20 07:18:10 +05:30
Если полученный токен имеет scope `` account_info `` , то вы можете запросить информацию о б аккаунте пользователя. Для этого необходимо отправить запрос на URL:
2019-02-21 01:34:44 +05:30
.. code-block :: text
https://account.ely.by/api/account/v1/info
Для передачи `` access_token `` используется заголовок `` Authorization `` с о значением `` Bearer {access_token} `` .
**Пример реализации получения информации о пользователе на PHP:**
.. code-block :: php
<?php
$accessToken = 'some_access_token_value';
$curl = curl_init();
2020-04-10 18:57:24 +05:30
curl_setopt($curl, CURLOPT_URL, 'https://account.ely.by/api/account/v1/info');
2019-02-21 01:34:44 +05:30
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $accessToken,
]);
$result = json_decode(curl_exec($curl), true);
curl_close($curl);
В ответ вы получите JSON документ с о следующим содержимым:
.. code-block :: json
2015-02-07 01:39:41 +05:30
{
2019-02-21 01:34:44 +05:30
"id": 1,
"uuid": "ffc8fdc9-5824-509e-8a57-c99b940fb996",
"username": "ErickSkrauch",
"registeredAt": 1470566470,
"profileLink": "http:\/\/ely.by\/u1",
"preferredLanguage": "be",
"email": "erickskrauch@ely.by"
2015-02-07 01:39:41 +05:30
}
2021-03-20 07:18:10 +05:30
Обратите внимание, что поле `` email `` будет присутствовать лишь в том случае, когда был запрошен scope `` account_email `` .
2019-02-21 01:34:44 +05:30
2021-03-20 07:18:10 +05:30
.. note :: В ходе дальнейшего развития сервиса, количество возвращаемых полей может увеличиться, но уже существующие останутся теми же.
2019-02-21 01:34:44 +05:30
.. _refresh-token-grant:
Обновление токена доступа
=========================
2021-03-20 07:18:10 +05:30
Если при выполнении авторизации вами было запрошено право на получение scope `` offline_access `` , то вместе с `` access_token `` вы также получите и `` refresh_token `` . Данный токен не истекает и может быть использован для получения нового токена доступа, когда он истечёт.
2019-02-21 01:34:44 +05:30
2021-03-20 07:18:10 +05:30
Для выполнения операции обновления токена необходимо отправить POST запрос на тот же URL, что использовался и `при обмене кода на ключ доступа <#authorization-code-grant> `_ , но с о следующими параметрами:
2019-02-21 01:34:44 +05:30
.. list-table ::
:widths: 1 99
:header-rows: 0
* - `` client_id ``
- ClientID, полученный при регистрации приложения.
* - `` client_secret ``
- ClientSecret, полученный при регистрации приложения.
* - `` scope ``
2021-03-20 07:18:10 +05:30
- Т е же scope, что были запрошены и при получении начального токена доступа. Попытка запросить большее количество прав приведёт к ошибке.
2019-02-21 01:34:44 +05:30
* - `` refresh_token ``
- Непосредственно токен, полученный вместе с начальным токеном доступа.
**Пример реализации обновления токена доступа на PHP:**
.. code-block :: php
<?php
// refresh_token, полученный при завершении авторизации
$refreshToken = 'm0APA99Ee7E6jNryVBrZ4qlktsEiwgspKEAotaze';
$requestParams = [
'client_id' => 'ely', // Ваш ClientId, полученный при регистрации
'client_secret' => 'Pk4uCtZw5WVlSUpvteJuTZkVqHXZ6aNtTaLPXa7X', // Ваш ClientSecret, полученный при регистрации
'scope' => 'account_info account_email',
'refresh_token' => $refreshToken,
'grant_type' => 'refresh_token',
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://account.ely.by/api/oauth2/v1/token');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($requestParams));
$result = json_decode(curl_exec($curl), true);
curl_close($curl);
2021-03-20 07:18:10 +05:30
В качестве ответа будет точно такое же тело, какое было получено в результате `обмена кода на ключ доступа <#authorization-code-grant-response> `_ . Поле `` refresh_token `` будет отсутствовать.
2019-02-21 01:34:44 +05:30
Готовые библиотеки
==================
2021-03-20 07:18:10 +05:30
Более простым способом будет использовать уже готовую библиотеку, которой будет необходимо передать лишь регистрационные параметры. Ниже перечислены библиотеки для различных языков программирования. Вы можете дополнить этот список своей библиотекой.
2019-02-21 01:34:44 +05:30
* **PHP** :
2021-03-20 07:18:10 +05:30
- [Официальная] https://github.com/elyby/league-oauth2-provider
2019-02-21 01:34:44 +05:30
* **Ruby** :
2021-03-20 07:18:10 +05:30
- [Официальная] https://github.com/elyby/omniauth-ely
2015-02-07 01:39:41 +05:30
2024-08-14 20:44:41 +05:30
* **Node.js** :
- [Сообщество] https://github.com/GGSkyOne/elyby
2015-02-07 01:39:41 +05:30
Возможные ошибки
================
2021-03-20 07:18:10 +05:30
Ниже приведены стандартные ошибки, которые вы можете получить в случае неправильной передачи данных на сервер авторизации. Если вы столкнулись с ошибкой, не описанной в этой документации, пожалуйста, сообщите о ней через `форму обратной связи <https://ely.by/site/contact> `_ .
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. _auth-start-errors:
2015-02-07 01:39:41 +05:30
Ошибки при инициализации авторизации
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2021-03-20 07:18:10 +05:30
Этот раздел описывает ошибки, отображаемые при переадресации пользователя с вашего сайта на нашу страницу инициализации авторизации.
2015-02-07 01:39:41 +05:30
.. code-block :: text
2019-02-21 01:34:44 +05:30
Invalid request ({parameter} required).
2015-02-07 01:39:41 +05:30
2021-03-20 07:18:10 +05:30
Данная ошибка означает, что вы передали не все необходимые параметры. Чтобы решить эту ошибку просто добавьте недостающий параметр.
2015-02-07 01:39:41 +05:30
.. code-block :: text
2019-02-21 01:34:44 +05:30
Invalid response type '{invalid_response_type_value}'.
2015-02-07 01:39:41 +05:30
2021-03-20 07:18:10 +05:30
Данная ошибка означает, что вы передали неподдерживаемый тип `` response_type `` . Н а данный момент поддерживается только значение `` code `` .
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. code-block :: text
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
Invalid scope '{invalid_scope}'.
2015-02-07 01:39:41 +05:30
2021-03-20 07:18:10 +05:30
Ошибка указывает на то, что было запрошено неизвестный `` scope `` . Убедитесь, что вы запрашиваете `поддерживаемые права <#available-scopes> `_ .
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. code-block :: text
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
Can not find application you are trying to authorize.
2015-02-07 01:39:41 +05:30
2021-03-20 07:18:10 +05:30
Данная ошибка говорит о том, что переданные параметры не соответствуют ни одному из зарегистрированных приложений. Для решения проблемы исправьте ваши значения `` client_id `` и `` redirect_uri `` .
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. _issue-token-errors:
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
Ошибки при обмене кода на ключ
2015-02-07 01:39:41 +05:30
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2019-02-21 01:34:44 +05:30
В случае возникновения ошибки вместо ожидаемого ответа с `` 200 `` статусом вы получите `` 40x `` код и следующие 2 поля:
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. code-block :: json
2015-02-07 01:39:41 +05:30
{
"error": "invalid_request",
2019-02-21 01:34:44 +05:30
"error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. Check the \"code\" parameter."
2015-02-07 01:39:41 +05:30
}
2021-03-20 07:18:10 +05:30
В поле `` error `` находится системный идентификатор ошибки, в `` error_description `` — описание ошибки на английском языке.
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
**Возможные значения error:**
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. list-table ::
:widths: 1 99
:header-rows: 0
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
* - `` invalid_request ``
- Переданы не все необходимые параметры запроса или значение `` code `` не был найден в базе выданных кодов.
* - `` unsupported_grant_type ``
2021-03-20 07:18:10 +05:30
- Данная ошибка сигнализирует о том, что вы попытались произвести авторизацию по неизвестному для нашего OAuth2 сервера типу Grant.
2019-02-21 01:34:44 +05:30
* - `` invalid_client ``
2021-03-20 07:18:10 +05:30
- Эта ошибка возникает в случае, когда трио значений `` client_id `` , `` client_secret `` и `` redirect_uri `` не совпали ни с одним из зарегистрированных приложений.
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
Ошибки при запросе информации о пользователе
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2015-02-07 01:39:41 +05:30
2021-03-20 07:18:10 +05:30
Ответ с о статусом `` 401 `` указывает на то, что заголовок `` Authorization `` не присутствует в запросе или е г о значение сформировано неверно. Тело ответа будет следующим:
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. code-block :: json
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
{
"name": "Unauthorized",
"status": 401,
"message": "Your request was made with invalid credentials."
}
2021-03-20 07:18:10 +05:30
Ответ с о статусом `` 403 `` сигнализирует о том, что переданный в заголовке `` Authorization `` токен не содержит scope `` account_info `` или он истёк. Получаемый ответ будет иметь следующий формат:
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
.. code-block :: json
{
"name": "Forbidden",
"status": 403,
"message": "You are not allowed to perform this action."
}
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
Ошибки при обновлении токена доступа
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2021-03-20 07:18:10 +05:30
При выполнении обновления токена доступа вам могут встретиться те же ошибки, что и при `обмене кода на ключ доступа <#issue-token-errors> `_ , а также несколько новых:
2019-02-21 01:34:44 +05:30
.. list-table ::
:widths: 1 99
:header-rows: 0
2015-02-07 01:39:41 +05:30
2019-02-21 01:34:44 +05:30
* - `` invalid_request ``
2021-03-20 07:18:10 +05:30
- Переданы не все необходимые параметры запроса или значение `` refresh_token `` не был найден в базе выданных токенов.
2019-02-21 01:34:44 +05:30
* - `` invalid_scope ``
- Были перечислены неподдерживаемые scope или запрошено больше, чем было у изначального токена.