Как в devise метод sign_in_and_redirect хранит местоположение и откуда берется сохраненное местоположение? - PullRequest
0 голосов
/ 27 февраля 2020

Недавно я интегрировал свое приложение в качестве 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

Наконец-то я пришел к выводу, что для понимания происходящего мне нужно понять:

  1. Как метод sign_in_and_redirect в devise сохраняет местоположение? В соответствии с объяснением метода он «... пытается перенаправить сначала в сохраненное местоположение».
  2. Откуда берется сохраненное местоположение? Я полагаю, это исходит от IdP (запрос GET?).
  3. Как я могу проверить, передается ли IdP в место хранения? Я не вижу ни одного запроса GET в моих журналах. Просто запрос POST с сообщением SAML.

Может кто-нибудь помочь мне с этими вопросами? Большое спасибо.

1 Ответ

1 голос
/ 28 февраля 2020

Вы можете использовать метод store_location_for из devise gem. Например, store_location_for(:user, request.full_path) или store_location_for(:user, request.referer), Devise будет использовать это местоположение как after_sign_in_path_for(:user)

...