Для входа через SSO используется Azure, секретный ключ не сохраняется нигде на фронтенде и бэкенде (PHP).

Вопрос или проблема

Мы использовали Azure для единого входа (SSO) в проекте Angular. Храня конфигурацию аутентификации в формате JSON, мы выполняем это просто.

{
 issuer: 'https://login.microsoftonline.com/{tenant-id}/v2.0',
  redirectUri: window.location.origin,
  clientId: `${environment.clientId}`,
 responseType: 'code',
  strictDiscoveryDocumentValidation: false,
  scope: 'https://graph.microsoft.com/.default',
}

Когда нажимаете кнопку SSO, происходит редирект на Microsoft-ссылку, указанную здесь, и возвращается токен. Он будет отправлен на сервер в конечную точку API userinfo, который отправляет данные пользователя в ответ и, таким образом, позволяет выполнить вход. Это основной шаг, который мы делаем здесь. Это безопасный метод, не хранящий секретные ключи где-либо в проекте, мы используем Azure.

Мы хотим добавить аутентификацию на основе сертификатов для Azure. Какие шаги нам нужно предпринять для этого как на фронтенде, так и на бэкенде?

Просмотрел документацию Microsoft, приведённую ниже @https://learn.microsoft.com/en-us/azure/active-directory-b2c/configure-authentication-sample-angular-spa-app, но не нашёл, что делать для аутентификации на основе сертификатов на стороне кода Angular и PHP. Фактически, мы делаем запрос на SSO, вызываем API для получения токена, который отправляется в Microsoft, и в ответ мы получаем access token и refresh token, как указано в этой документации, и вызываем API userinfo на бэкенде с этим access token в части заголовка авторизации запроса. Поэтому я не понимаю, где мы выполняем аутентификацию на основе сертификатов в этих шагах.

Ответ или решение

Внедрение аутентификации на основе сертификатов для SSO в приложении Angular с помощью Azure

Введение

В современном мире безопасность является ключевым аспектом разработки веб-приложений. Использование Azure для одноразового входа (SSO) в приложении Angular — это хороший выбор, позволяющий обеспечить безопасный доступ к вашему сервису. Вы уже реализовали базовый принцип аутентификации с использованием токенов, однако внедрение сертификатной аутентификации может значительно повысить уровень защиты. Давайте подробно рассмотрим, какие шаги необходимо предпринять на фронт-энде (Angular) и бэк-энде (PHP) для достижения этой цели.

Текущая архитектура аутентификации

На данный момент ваша конфигурация аутентификации выглядит следующим образом:

{
  "issuer": "https://login.microsoftonline.com/{tenant-id}/v2.0",
  "redirectUri": "window.location.origin",
  "clientId": "${environment.clientId}",
  "responseType": "code",
  "strictDiscoveryDocumentValidation": false,
  "scope": "https://graph.microsoft.com/.default"
}

При нажатии на кнопку SSO происходит перенаправление на сайт Microsoft для получения токена, который затем используется для аутентификации пользователя.

Шаги для добавления сертификатной аутентификации

1. Подготовка сертификата

Сначала вам необходимо подготовить сертификат, который будет использоваться для аутентификации. Создайте либо самоподписанный сертификат, либо используйте сертификат, выданный удостоверяющим центром. Этот сертификат должен быть установлен в Azure Active Directory и правильно настроен.

2. Настройка Azure Active Directory

  • Перейдите в Azure Portal и выберите вашу Azure Active Directory.
  • Откройте раздел "Регистрация приложений" и выберите ваше приложение.
  • Перейдите в раздел "Сертификаты и секреты" и загрузите ваш публичный сертификат.

3. Настройка Angular приложения

В вашем Angular приложении вам нужно будет внести изменения, чтобы поддерживать аутентификацию по сертификату. Однако, стоит отметить, что сам Angular не может напрямую выполнять аутентификацию на основе сертификатов, поскольку это задача сервера.

4. Настройка бэкенда на PHP

Ваш PHP сервер должен поддерживать валидацию сертификатов. Для этого:

  1. Настройте HTTP-заголовки: PHP-скрипт должен принимать и обрабатывать заголовки запроса, которые содержат токены от Azure.
  2. Валидация токенов: Используйте библиотеку, такую как firebase/php-jwt, для валидации JWT-токенов, полученных от Azure. Ваша логика должна проверить подписанный токен на наличие необходимых утверждений и действительности.

Пример кода в PHP:

use Firebase\JWT\JWT;
use Firebase\JWT\ExpiredException;

function validateToken($jwt) {
    $publicKey = file_get_contents('path/to/certificate.pem');
    try {
        $decoded = JWT::decode($jwt, $publicKey, ['RS256']);
        return $decoded;
    } catch (ExpiredException $e) {
        return false; // Токен устарел
    } catch (Exception $e) {
        return false; // Ошибка валидации
    }
}

Заключение

Для успешного внедрения сертификатной аутентификации в ваше приложение необходимо обеспечить корректную настройку как на стороне Azure, так и на серверной стороне PHP. Обратите внимание, что сама по себе Angular не будет обрабатывать сертификаты, так как это должно происходить на уровне сервера.

Убедитесь, что все шаги выполнены правильно и протестируйте систему на наличие уязвимостей, чтобы убедиться, что ваша новая система аутентификации функционирует безопасно и эффективно.

Оцените материал
Добавить комментарий

Капча загружается...