使用Rails Sidekiq管理面板的JWT身份验证

3
我正在尝试使用现有的身份验证系统来保护 /sidekiq 路由。我正在使用 Rails-api 的 JWT。我能够读取 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>

是否有办法使Token可以持久化用于后续请求?我似乎不能在该lib文件中使用Rails会话。

1个回答

1

有没有办法让令牌在后续请求中持久化?

这不能/不应该在路由的约束条件中完成。

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

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


我该如何与该端点进行交互?使用PUT/POST请求?理想情况下,作为用户,如果我是已验证的管理员用户,我希望只需在客户端侧转到/sidekiq并查看仪表板。问题在于Sidekiq拥有控制器/视图等,并希望提供HTML。换句话说,它似乎没有设计用于与单页应用程序+ Rails API一起使用。 - Maros
理想情况下,您应该将您的令牌PUT/POST到该端点,并在那里重定向到/sidekiq,或在成功响应后适当地处理客户端。GET也可以使用您的令牌作为参数,但可能不太符合Rails的风格。 - Daniel Westendorf
明白了。我想我会在窗口中添加一些隐藏操作,比如 window.authToSidekiq(),它将向端点发送POST请求,将令牌保存在会话中,然后进行302重定向,带我到 /sidekiq。 - Maros
在我的身份验证控制器中设置session[:token] = token后,在约束中request.session似乎为空。这两个会话可能是不同的东西吗? - Maros
哦,request.cookies确实有一个rack.session的cookie,但似乎是一个加密很长的值。 - Maros
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接