Интеграция SSO / аутентификации с внешней «службой каталогов»

15

Я собираюсь начать работу над прототипом для клиента, и одной из необходимых функций является интеграция с внутренней системой аутентификации / регистрации пользователей.

Эта система будет выступать в качестве авторитетной базы данных пользователей и предоставляет RESTful-интерфейс для создания новых пользователей и аутентификации действительных пользователей.

  1. Мне нужно иметь возможность создавать новых пользователей в WP и как часть этого процесса сделать вызов API внешней аутентификации для создания / проверки этого пользователя.

  2. Человек, который является действительным пользователем, но не известен WP, должен иметь возможность войти в систему, чтобы комментировать, без необходимости регистрации на сайте WP самостоятельно.

  3. Человек, вошедший в общий веб-сайт, также должен автоматически войти в WordPress.

Я думаю, что следующий путь.

  • Для (1) - есть ли регистрационный хук, который я могу использовать?

  • Для (2) - я предполагаю, что я перехватываю фильтр аутентификации - то есть, когда кто-то пытается войти в систему, я перехватываю это, звоню во внешнюю систему, а затем либо обрабатываю вход в систему WP, либо перенаправляю их в процесс регистрации, где ( 1) берет эр.

  • Для (3) - прочитайте файл cookie для входа, установленный основным сайтом, и перейдите к (2)?

Думаю, мне также нужно вставить запись в таблицу users и usermeta.

Итак, имеет ли вышесказанное смысл - не думал ли я о чем-то. У любого есть хорошие ресурсы для помощи с этим (@hakre - я видел, что вы проделали некоторую работу над этим !!).

Обновить

Так что я все еще немного ломаю голову над этим, по сути, я пытаюсь подключиться к фильтру аутентификации и использую его для:

  1. проверьте, установлен ли файл cookie для входа на «основной» сайт, и если это так, выполните повторную проверку по их API аутентификации и, если он действителен, принудительно войдите в WP wp_signon(), используя информацию, содержащуюся в файле «cookie» основного сайта (адрес электронной почты и хешированный пароль). в качестве учетных данных для WP
  2. если файл cookie не установлен, перенаправьте на страницу входа на главный сайт и получите логин / регистрацию, затем вернитесь к шагу 1
  3. если нет пользователя WP, когда существует аутентифицированный пользователь главного сайта, создайте его, а затем создайте «прозрачный» вход (т. е. чтобы пользователь не видел форму входа WP)

По сути, я хочу полностью скрыть форму входа в WP для пользователей, которые будут в основном комментировать, а позже найти способ, позволяющий авторам и администраторам получать к ней доступ напрямую.

Это происходит довольно медленно, вот что я мог бы использовать некоторую помощь:

  • Правильно ли использовать фильтр аутентификации? Кажется, он вызывается не во всех ситуациях, которые я ожидал - например, мета-виджет отображает ссылки входа / выхода без срабатывания аутентификации

  • я могу wp_signon()вернуть WP_Userобъект (что указывает на успешность), но это не влияет на состояние входа в систему - то есть мета-виджет все равно будет отображаться при входе в систему даже после обновления.

Любая помощь с благодарностью получена :)

ана
источник
может быть это должен быть отдельный вопрос?
ана
о, и я не знаю, разрешено ли вообще упоминать об этом, но я бы с радостью заплатил за помощь примерно полдня - контактные данные в моем профиле.
ана

Ответы:

12

Хорошо, подход, который работает для меня, заключается в следующем:

  1. Предположим, что основная база данных пользователей сайта является авторитетной. Основной файл cookie для входа на сайт содержит идентификатор и хэш пароля сайта.

  2. Получите cookie-файл с основного сайта и повторно проверьте его по API аутентификации основного сайта.

  3. Если он действителен, используйте адрес электронной почты из возвращаемого значения в качестве 'user_login'значения для WP и пароль хешированного сайта в качестве пароля WP.

  4. Проверьте, существует ли этот пользователь в WP с помощью wp_authenticate('user_login', 'user_pass'). Это возвращает WP_Userобъект в случае успеха или WP_Errorобъект в случае ошибки.

  5. Если WP_Error/is_wp_error(), тогда используйте «использовать» wp_update_user()для создания пользователя (или обновите пользователя с измененным паролем).

  6. Войти через wp_set_current_user(), wp_set_auth_cookie()иdo_action('wp_login, id)

(Это все содержится в функции, которая прикреплена к 'init'действию)

Кажется, это работает - автоматически создаются пользователи сайта, неизвестные WP. Изменения пароля учитываются, и если cookie-файл сайта установлен и пользователь WP существует, единый вход является автоматическим и довольно плавным.

ана
источник
1
+1 Потрясающее описание / ответ. Надеюсь, вы найдете время, чтобы показать немного больше деталей за один день. Поможет ли нам другим избежать большинства испытаний / ошибок;)
kaiser
1
Это именно то, что я ищу, вы можете объяснить немного больше процесса? Особенно шаги 1,2,3 мне не очень понятны. Благодарность!!
Chifliiiii
3

Вся система аутентификации подключаема. Я предлагаю посмотреть на существующие плагины, чтобы понять, как переопределить систему. Возможно, посмотрев на некоторые плагины LDAP ?

Дугал Кэмпбелл
источник
Да и без смысла быть заядлым, это очевидно !!
Anu
Для получения дополнительной информации, которая может помочь в отражении статуса пользователя, вошедшего в систему, см. Мой ответ на этот другой вопрос: wordpress.stackexchange.com/questions/8998/…
Дугал Кэмпбелл
1

Некоторые пользовательские функции определены условно !function_exists()в wp-includes/pluggable.phpи легко переопределяются вашими собственными версиями.

Rarst
источник
1

Включение единого входа в WordPress заняло у меня более 18 часов борьбы, но может занять несколько минут:

По сути, вам нужно использовать https://wordpress.org/plugins/wp-force-login/ и модифицированную версию https://as.wordpress.org/plugins/jwt-authenticator/, а затем создать аутентификацию. -защищенная конечная точка на вашем главном сайте, которая генерирует JWT (JSON Web Token) и перенаправляет обратно на специальный URL-адрес вашего сайта WordPress.

Смотрите полный код здесь .

Райан
источник
Спасибо за Ваш ответ. Ответы, содержащие только ссылки, не приветствуются, так как ссылки могут исчезнуть, и это сделает ваш ответ бесполезным. Здесь лучше включить соответствующие биты.
Кайзер