У нас есть приложение rails, которое использует devise
для аутентификации.Мы используем OKTA в качестве нашего IDP и используем devise_saml_authenticatable
для управления аутентификацией SAML.
Мы сделали довольно небольшое обновление приложения с rails 4.2.4 -> 4.2.11, devise 3.5.6 -> 3.5.10.devise_saml_authenticatable
остался на 1.2.2.Также были обновлены многие другие библиотеки.
После обновления все в приложении работало нормально, кроме этой части аутентификации.Кажется, что это происходит в бесконечном цикле перенаправленияПо сравнению с рабочей версией кажется, что все работает правильно до последнего шага, где мы видим Completed 401 Unauthorized
.
- A Пользователь посещает веб-страницу
- Браузер перенаправлен наOKTA, где пользователь может войти в систему
- OKTA отправляет
SAMLResponse
в /users/saml/auth
- Приложение принимает пользователя правильно
- Мы видим
Completed 401 Unauthorized in 56ms
- Пользователь направляется на шаг № 2, где этот цикл начинается снова.
Мы подтвердили, что шаг № 4 работает, потому что мы можем видеть новые строки пользователей в БД.Однако странно то, что current_user после этого все еще пуст.
Я добавил тестовую прокладку, подобную этой
before_action :my_authenticate_user!
def my_authenticate_user!
logger.info("AUTH USER!")
if current_user.blank?
logger.error("CURRENT USER IS BLANK!")
end
authenticate_user!
end
И в журналах я вижу это после сообщения SAMLResponse:
16:27:10 web.1 | D, [2019-02-20T16:27:10.223289 #51095] DEBUG -- : User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."email" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["email", "XYZ@xyz.com"]]
16:27:10 web.1 | I, [2019-02-20T16:27:10.224028 #51095] INFO -- : Setting: name, XYZ
16:27:10 web.1 | I, [2019-02-20T16:27:10.224596 #51095] INFO -- : Setting: email, XYZ@xyz.com
16:27:10 web.1 | I, [2019-02-20T16:27:10.225235 #51095] INFO -- : Setting: role, admin
16:27:10 web.1 | D, [2019-02-20T16:27:10.226268 #51095] DEBUG -- : (0.2ms) BEGIN
16:27:10 web.1 | D, [2019-02-20T16:27:10.227744 #51095] DEBUG -- : (0.3ms) COMMIT
16:27:10 web.1 | I, [2019-02-20T16:27:10.258703 #51095] INFO -- : AUTH USER!
16:27:10 web.1 | E, [2019-02-20T16:27:10.259194 #51095] ERROR -- : CURRENT USER IS BLANK!
16:27:10 web.1 | I, [2019-02-20T16:27:10.261914 #51095] INFO -- : Completed 401 Unauthorized in 74ms (ActiveRecord: 1.1ms)
В рабочей (до обновления) версии все происходит точно так же, за исключением того, что на шаге 5 аутентификация работает, и приложение продолжает свое веселье вместо перенаправления обратно в OKTA.
Фактчто отмена обновления не очень полезна для нас - обновления необходимы, поэтому цель состоит в том, чтобы попытаться исправить это с обновленными библиотеками.
Несколько вещей, которые я пробовал, но которые не помогли, такfar:
- Изменение session_store с active_record_store на cooke_store и ключ session_store
- Проверка того, что маршруты не изменились между рабочей версией и нерабочей версией (они идентичны)
- Подтверждено, что ничего не изменилось с OKTA, то есть сторона OKTA выглядит нормально
- Перемещенные пользователи (
devise_for :users
) маршруты к вершине tМаршрутизация пункта
То, как мы используем Devise, кажется довольно стандартным?
Мы называем authenticate_user!
как before_action
в ApplicationController
class ApplicationController < ActionController::Base
if Authentication.type.disabled?
before_action :set_guest_user
else
before_action :authenticate_user!
end
Модель User имеет это
class User < ActiveRecord::Base
if Authentication.type.saml?
devise :saml_authenticatable, :rememberable
И на наших маршрутах это:
Rails.application.routes.draw do
mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
devise_for :users
Еще одна вещь, которую я должен упомянуть, - это то, что передняя часть угловая, но я не уверен, какили почему это повлияет на любой из этих способов аутентификации.
Любые предложения о том, как и где копаться в кишках Devise / Rails, приветствуются!