Недавно я интегрировал свое приложение в качестве SP (поставщика услуг) в LMS (систему управления обучением), которая действует как IdP (поставщик идентификации).
Идея заключалась в том, что после того, как пользователь нажал на мой курс, опубликованный в инструменте LMS, он был бы немедленно перенаправлен на URL-адрес курса в моем приложении, используя службу аутентификации пользователей IdP (SSO).
Это только частично сработало. SSO работает, но как только пользователь проходит аутентификацию, он перенаправляется на индексную страницу в моем приложении, а не на URL-адрес курса.
Я пошел к своему коду, чтобы проверить, как работает вход через saml-сообщение. На omniauth_callback_controller.rb метод входа в систему:
def saml
student = Student.where(email: request.env["omniauth.auth"]['uid'].to_s).first
if student
sign_in_and_redirect student, event: :authentication
else
flash[:error] = t 'flash_msg.access_1'
redirect_to root_path
end
end
Затем я решил разработать метод sign_in_and_redirect и сказать:
# Sign in a user and tries to redirect first to the stored location and
# then to the url specified by after_sign_in_path_for. It accepts the same
# parameters as the sign_in method.
Код:
def sign_in_and_redirect(resource_or_scope, *args)
options = args.extract_options!
scope = Devise::Mapping.find_scope!(resource_or_scope)
resource = args.last || resource_or_scope
sign_in(scope, resource, options)
redirect_to after_sign_in_path_for(resource)
end
Наконец-то я пришел к выводу, что для понимания происходящего мне нужно понять:
- Как метод sign_in_and_redirect в devise сохраняет местоположение? В соответствии с объяснением метода он «... пытается перенаправить сначала в сохраненное местоположение».
- Откуда берется сохраненное местоположение? Я полагаю, это исходит от IdP (запрос GET?).
- Как я могу проверить, передается ли IdP в место хранения? Я не вижу ни одного запроса GET в моих журналах. Просто запрос POST с сообщением SAML.
Может кто-нибудь помочь мне с этими вопросами? Большое спасибо.