Настройка авторизации через OAUTH2 сервера https://oauth2.volmed.org.ru: различия между версиями

Материал из Wiki МИАЦ ВО
Перейти к навигации Перейти к поиску
(Формирование строки авторизации)
м (Формирование строки авторизации)
Строка 19: Строка 19:
 
Для перехода на страницу сервера авторизации, генерим следующий код
 
Для перехода на страницу сервера авторизации, генерим следующий код
 
<pre>
 
<pre>
$permitted_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+
if (!empty($_GET['code'])) { // Если это уже ответ oauth2 сервера (Есть параметр state)
$state = generate_string($permitted_chars, 20); // Функция, которая генерит 20 символов из строки $permitted_chars
+
  if ($_GET['state'] == $_SESSION['state']) { // Если state совпадает с сохраненным в Сессии
$_SESSION['state'] = $state; // Сохраняем этот код, что бы потом его проверить на правильность
+
      $oauth2_access = $this->oauth2_post();  // Посылаем уже с помощью POST запрос
$url_data = [
+
      $this->auth = $this->auth($oauth2_access);
  'response_type' => 'code',
+
  } else die('Ошибка авторизации (Invalid state), обратитесь к администраотру сайта');  // если state не совпал, то ошибка
  'client_id' => $GLOBALS['id_resource'],
+
} else { // Ето первый цикл обращения к oauth2 серверу
  'state' => $state,
+
  $permitted_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; // список символов, из которых будем генерить state
  'redirect_uri' => $GLOBALS['redirect_uri'] // Должен выглядеть как http://sait. volmed.org.ru
+
  $state = generate_string($permitted_chars, 20);   // Генерим код state - 20 символов случайного кода
];
+
  $_SESSION['state'] = $state;   // Сохраняем в сессии
$url = $GLOBALS['oauth2_url'] . '?' . http_build_query($url_data); // генерим строку перехода
+
  $url_data = [
header('Location:' . $url); // Переходим на сервер авторизации
+
    'response_type' => 'code',
 +
    'client_id' => $GLOBALS['id_resource'],   // ID сервиса в МИАЦ
 +
    'state' => $state,                         // Случайный код, который сервис должен вернуть
 +
    'redirect_uri' => $GLOBALS['redirect_uri'] // Адрес возврата дб вв виде https://sait.volmed.org.ru
 +
  ];
 +
  $url = $GLOBALS['oauth2_url'] . '?' . http_build_query($url_data);   // URL для отправки на сервер авторизации
 +
  header('Location:' . $url); //
 +
  exit;
 +
}
 
</pre>
 
</pre>
 
После перехода на сервер авторизации, вводим Логин и Пароль. И если он правильный, то сервер возвращает на страницу редиректа
 
После перехода на сервер авторизации, вводим Логин и Пароль. И если он правильный, то сервер возвращает на страницу редиректа

Версия 16:26, 6 мая 2025

Подготовительные операции

  1. Идем в БД oauth_db на сервере 172.16.130.31 и добавляем в таблицу oauth_clients
    1. client_id - Номер WEB интерфейса, который вы собираетесь подключить
    2. client_secret - Набор любых символов для шифрования
  2. Добавляем в настроечный файл сервиса следующие строки
$GLOBALS['id_resource'] = 7; // Номер WEB интерфейса
$PassLength=5; //длина пароля
$GLOBALS['jwt_key'] = 'sdklfwiomwefwepiojwepjowfmwfmwef'; // Строка с набором символов для шифрования JWT токена
$GLOBALS['max_time'] = 3600 * 24 * 7; // Время жизни COOKIES, например, 7 суток

$oauth2_url = 'https://oauth2.volmed.org.ru';    // URL сервиса авторизации
$GLOBALS['oauth2_url'] = $oauth2_url;
$redirect_uri =  $http."://$_SERVER[HTTP_HOST]";
$GLOBALS['redirect_uri'] = $redirect_uri;
  1. Для работы с JWT токеном используем библиотеку https://github.com/firebase/php-jwt. Ее нужно установить в каталог class/jwt

Формирование строки авторизации

Для перехода на страницу сервера авторизации, генерим следующий код

if (!empty($_GET['code'])) { // Если это уже ответ oauth2 сервера (Есть параметр state)
   if ($_GET['state'] == $_SESSION['state']) { // Если state совпадает с сохраненным в Сессии
      $oauth2_access = $this->oauth2_post();  // Посылаем уже с помощью POST запрос
      $this->auth = $this->auth($oauth2_access);
   } else die('Ошибка авторизации (Invalid state), обратитесь к администраотру сайта');  // если state не совпал, то ошибка
} else { // Ето первый цикл обращения к oauth2 серверу
   $permitted_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';  // список символов, из которых будем генерить state
   $state = generate_string($permitted_chars, 20);   // Генерим код state - 20 символов случайного кода
   $_SESSION['state'] = $state;   // Сохраняем в сессии
   $url_data = [
     'response_type' => 'code',
     'client_id' => $GLOBALS['id_resource'],    // ID сервиса в МИАЦ
     'state' => $state,                         // Случайный код, который сервис должен вернуть
     'redirect_uri' => $GLOBALS['redirect_uri'] // Адрес возврата дб вв виде https://sait.volmed.org.ru
  ];
  $url = $GLOBALS['oauth2_url'] . '?' . http_build_query($url_data);    // URL для отправки на сервер авторизации
  header('Location:' . $url); //
  exit;
}

После перехода на сервер авторизации, вводим Логин и Пароль. И если он правильный, то сервер возвращает на страницу редиректа