【问题标题】:JWT Auth with Rails Sidekiq admin panel使用 Rails Sidekiq 管理面板进行 JWT 身份验证
【发布时间】:2017-12-13 02:49:57
【问题描述】:

我正在尝试使用我现有的身份验证系统来保护/sidekiq 路由。我将 JWT 与 Rails-api 一起使用。我能够读取 JWT 令牌以检查用户是否具有管理员角色,但它仅适用于初始请求。 Sidekiq 面板中的后续请求检索 CSS 和 JS,但由于令牌未传递给它们而失败。

我的routes.rb 中有以下路线:

mount Sidekiq::Web => '/sidekiq', constraints: AdminConstraint.new

然后lib/admin_constraint.rb:

class AdminConstraint
  def matches?(request)
    token = request.params['token']
    unless token
      puts 'AdminConstraint: No token in params found'
      return false;
    end

    user = Knock::AuthToken.new(token: token).entity_for(User)
    unless user
      puts "AdminConstraint: No user found for token #{token}"
    end

    if user.admin?
      puts "AdminConstraint: User with user_id #{user.id} is an admin, access granted"
      true
    else
      puts "AdminConstraint: User with user_id #{user.id} is NOT an admin, rejecting"
      false
    end
  end
end

我正在浏览器中访问路线,如下所示:https://example.com/sidekiq?token=<token>

有什么方法可以为后续请求保留令牌吗?我似乎无法在这个 lib 文件中使用 Rails 会话。

【问题讨论】:

    标签: ruby-on-rails jwt sidekiq rails-api


    【解决方案1】:

    有什么方法可以为后续请求保留令牌吗?

    这不能/不应该在您的路线约束内完成。

    您需要提供另一个端点,该端点在会话中设置一些内容以显示会话已通过身份验证,然后您将在路由约束范围内进行检查。

    这可以在控制器或机架中间件中完成。

    【讨论】:

    • 我将如何与该端点交互?一个 PUT/POST 请求?理想情况下,作为用户,如果我是经过身份验证的管理员用户,我希望能够在客户端转到 /sidekiq 并查看仪表板。问题是 Sidekiq 拥有控制器/视图等并希望提供 html。换句话说,它似乎并没有被设计为与单页应用程序 + rails API 一起使用
    • 理想情况下,您可以将令牌 PUT/POST 到该端点,然后从那里重定向到 /sidekiq 或在成功响应后适当地处理该客户端。 GET 也可以将您的令牌作为参数使用,但可能更少 rails-y。
    • 明白了。我想我会在窗口中添加一些隐藏操作,例如 window.authToSidekiq(),它将 POST 到端点,将令牌保存在会话中,然后 302 重定向会将我带到 /sidekiq。
    • 我尝试了这个想法,但似乎最初的问题仍然存在。即使我在自定义控制器中将令牌设置为会话,路由约束仍然无权访问会话以读取令牌。
    • 您应该能够在您的约束范围内访问会话。像这样的东西:mobomo.com/2011/02/use-lambdas-for-rails3-route-constraints
    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 2016-04-07
    • 2015-06-20
    • 2023-03-27
    • 2021-05-29
    • 2017-07-30
    • 2018-06-30
    • 2018-08-03
    相关资源
    最近更新 更多