React Native 忽略 JWT 身份验证 Rails API

时间:2021-04-08 18:17:35

标签: ruby-on-rails react-native api jwt warden

我有这个应用程序使用设计会话进行 Web 身份验证,我正在尝试为 React 本机端点(移动版本)中使用的 API 服务实现 JWT 身份验证。我为 API 资源添加了管理员 JWT 策略。当我通过 curl、浏览器或 rspec 测试身份验证时,它的行为符合预期;仅针对有效的 JWT 检索成功,并拒绝错误或缺少令牌。问题是当我在没有令牌或无效令牌的情况下直接从 React 本机应用程序进行测试时,它似乎正在检索数据,就好像它已经过身份验证一样。我错过了什么?

响应调用

const getData = (token) => {
    axios.get('http://XXX.XXX.XXX.XX:3000/api/v1/get_resources/',
      {
        "headers": {
              "Authorization":"Basic 0 ", <- zero to test invalid token
              "Accept": "application/json"
        },
      }).then((response) => {
      console.log(response)
    }, (error) => {
     console.log(error);
    });
}

路线

namespace :api, defaults: {format: 'json'} do        
  namespace :v1 do          
    put 'login_user' => 'users_manager#login_user'
  end
end
devise_scope :user do
    authenticate :user do
    namespace :api, defaults: {format: 'json'} do       
      namespace :v1 do          
        get 'get_sources' => 'sources_manager#get_sources'
      end
    end
    end
end

config/initializers/warden.rb

Warden::Strategies.add(:api_token) do
    def valid?
        request.headers['Authorization'].present?
    end
    def authenticate!
        if auth_token && user_token
            success!(user_token)
        else
            fail!('Not Authenticated') 
        end 
    end 
    private
    def auth_token
        @auth_token ||= JsonWebToken.decode(request.headers['Authorization'].split(' ').last)
    end 
    def user_token
        @user_token ||= User.find(auth_token[:user_id].to_i)
    end
end

config/initializers/devise.rb

  ...
  config.warden do |manager|
    manager.default_strategies(scope: :user).unshift :api_token
  end
  ...

config/initializers/json_web_token.rb

class JsonWebToken
    def self.encode(payload)
        JWT.encode(payload, Rails.application.secrets.secret_key_base)
    end
    def self.decode(token)
        #JWT.decode(token, Rails.application.secrets.secret_key_base)[0]
        HashWithIndifferentAccess.new(JWT.decode(token, Rails.application.secrets.secret_key_base)[0])
        rescue JWT::VerificationError, JWT::DecodeError
            nil
    end 
end

0 个答案:

没有答案
相关问题