Единый вход при использовании оболочки SimpleSamlPhp в Laravel

Реализация единого входа в моем приложении Laravel. Я решил использовать этот плагин https://github.com/aacotroneo/laravel-saml2 который по сути является оберткой для известного SimpleSamlPhp.

Я загрузил код через композитора и согласно предоставленной информации Remember that you don't need to implement those routes, but you'll need to add them to your IDP configuration. For example, if you use simplesamlphp, add the following to /metadata/sp-remote.php

$metadata['http://laravel_url/saml/metadata'] = array(
 'AssertionConsumerService' => 'http://laravel_url/saml/acs',
 'SingleLogoutService' => 'http://laravel_url/saml/sls',
 //the following two affect what the $Saml2user->getUserId() will return
 'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
 'simplesaml.nameidattribute' => 'uid'  
);

Я не могу найти metadata/sp-remote.php, любая идея? и насколько http://laravel_url/saml/acs обеспокоен, нужно ли развертывать saml на сервере? потому что на данный момент код плагина находится в vendors в иерархии кода архитектуры ядра laravel.

1 ответ

Сначала немного предыстории:

Любое взаимодействие с SAML состоит из двух частей: провайдер идентификации ("IDP") и провайдер услуг ("SP"). Если хотите, IDP является основным аутентификатором, к которому подключаются различные приложения (SP).

Идея состоит в том, что пользователь посещает ваше приложение, которое в свою очередь связывается как поставщик услуг с поставщиком удостоверений, чтобы получить ваши учетные данные. А поскольку несколько приложений / SP взаимодействуют с одним IDP, вы получаете преимущества единого входа.

На этапе настройки конфигурации метаданных обмениваются между SP и IDP для установления доверия между ними. Это не данные уровня пользователя - это данные уровня приложения, которые позволяют им общаться.

ХОРОШО. Итак, теперь на ваш вопрос:

Пакет, который вы используете, позволяет вашему приложению Laravel общаться с IDP, но прежде чем он сможет это сделать, вам нужно обменяться некоторыми метаданными. Метаданные для вашего приложения приведены выше. Это должно идти в конфигурации IDP, где вы найдете это metadata/sp-remote (или точнее metadata/saml20-sp-remote, где вы вставляете это.

Если вы еще этого не сделали, я бы рекомендовал использовать [ https://simplesamlphp.org/docs/stable/][1] в качестве IDP здесь, поскольку пакет Laravel работает с ним практически из коробки.

Последний совет: если вы используете SAML2, я обнаружил, что вам нужно изменить ключ метаданных, чтобы ссылаться на saml2 вместо saml выше. т.е. $metadata['http://laravel_url/saml2/metadata'] и не $metadata['http://laravel_url/saml/metadata']

Надеюсь, это поможет другим. я добавилsaml2_settings.php в config папка.

Обновлены маршруты:

'logoutRoute' => '/logout',
'loginRoute' => '/homepage',
'errorRoute' => '/error',

обновлено x509cert (publickey.cer) и privateKey

Обновлено 'entityId', добавил URL-адрес метаданных xml. ОбновленоsingleLogoutService а остальные необходимые детали в saml2_settings.php файл.

Добавлены два слушателя 1) для события входа 2) для события выхода

Обновил файл маршрутов следующим образом:

\Illuminate\Support\Facades\Event::listen('Aacotroneo\Saml2\Events\Saml2LogoutEvent', function ($event) {
    \Illuminate\Support\Facades\Auth::logout();
    \Illuminate\Support\Facades\Session::save();
    return redirect("login");
});

\Illuminate\Support\Facades\Event::listen('Aacotroneo\Saml2\Events\Saml2LoginEvent', function (\Aacotroneo\Saml2\Events\Saml2LoginEvent $event) {

    $user = $event->getSaml2User();
    $userData = [
        'id' => $user->getUserId(),
        'attributes' => $user->getAttributes(),
        'assertion' => $user->getRawSamlAssertion()
    ];


      // add the login for auto login based on your settings
    /// REDIRECT the user to homepage
    }
});
Другие вопросы по тегам