使用Devise的Rails应用陷入重定向循环

时间:2019-02-21 00:13:11

标签: ruby-on-rails ruby devise saml

我们有一个使用devise进行身份验证的Rails应用程序。我们使用OKTA作为IDP,并使用devise_saml_authenticatable来管理SAML身份验证。

我们从Rails 4.2.4-> 4.2.11对应用程序进行了相当小的升级,设计了3.5.6-> 3.5.10。 devise_saml_authenticatable保持在1.2.2。其他许多库也进行了更新。

升级后,除此身份验证部分外,有关该应用程序的所有内容均正常运行。它似乎陷入了无限重定向循环中。与工作版本相比,似乎一切正常,直到最后一步看到Completed 401 Unauthorized

  1. 用户访问了网页
  2. 浏览器被重定向到用户可以登录的OKTA
  3. OKTA将SAMLResponse发布到/users/saml/auth
  4. 该应用正确吸收了用户
  5. 我们看到一个Completed 401 Unauthorized in 56ms
  6. 用户被引导至步骤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。

还原升级的工作对我们来说并不太有用-升级是必需的,因此目标是尝试使用升级的库修复此问题。

我尝试过的一些事情到目前为止还没有帮助:

  1. 将session_store从active_record_store更改为cooke_store和session_store密钥
  2. 检查路由在工作版本和非工作版本之间是否没有改变(它们相同)
  3. 已确认OKTA并未发生任何变化,即OKTA方面似乎很好
  4. 移动的用户(devise_for :users)路由到routes子句的顶部

我们使用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

用户模型具有此

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胆量的建议都值得赞赏!

0 个答案:

没有答案