我有这个应用程序使用设计会话进行 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