ruby-on-rails 在devise-jwt in rails中查找JWT令牌的用户

sq1bmfud  于 2023-08-08  发布在  Ruby
关注(0)|答案(1)|浏览(128)

我在RoR应用程序中使用devise-jwt进行基于令牌的身份验证。客户端在头部中发送一个令牌,如下所示:Bearer #{token}通过使用authenticate_user!,我能够在控制器中验证用户,并将登录的用户作为current_user
当我使用Actioncable时,connection.rb中的connect方法需要从令牌中查找用户。连接.rb如下所示:

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      token = request.env["Authorization"]
      find_verified_user
    end

    private
    def find_verified_user
      if authenticate_user!
        self.current_user = current_user
      else
        reject_unauthorized_connection
      end
    end
  end
end

字符串
然而,authenticate_user!在这里不是一个有效的方法(因为它是特定于设计的)。
我的问题是如何在这里找到current_user?如何识别在头中发送令牌的客户端?

iibxawm4

iibxawm41#

JWT令牌检索用户的一种方法是使用Warden::JWTAuth助手:

Warden::JWTAuth::UserDecoder.new.call(token, :user, nil)
=> #<User id: 1, email: "user@email.com", ...>

字符串
或者直接使用JWT

decoded_token = JWT.decode(token, 'jwt_secret', true, { algorithm: 'jwt_algorithm' })
=>
   [
     {
       "sub" => "1",
       "scp" => "user",
       "aud" => nil,
       "iat" => 1689090581,
       "exp" => 1691682581,
       "jti" => "7f82dcc8-4957-4fa8-95dd-20a26989343c"
     },
     {
       "alg" => "HS256"
     }
   ]

User.find((decoded_token[0])['sub']))
=> #<User id: 1, email: "user@email.com", ...>


(其中jwt_algorithm通常为HS256

相关问题