Devise是Ruby on Rails中一个流行的身份验证解决方案,它提供了完整的MVC解决方案。当需要为API提供访问时,有时我们希望绕过Devise的标准身份验证流程,改用API密钥进行验证。
在Rails应用中,你可以创建一个自定义的Warden策略来处理API密钥验证:
# lib/api_key_strategy.rb
class ApiKeyStrategy < Warden::Strategies::Base
def valid?
api_key.present?
end
def authenticate!
user = User.find_by(api_key: api_key)
user.nil? ? fail!("Invalid API key") : success!(user)
end
private
def api_key
request.headers['X-API-KEY'] || params[:api_key]
end
end
然后在Devise初始化文件中注册这个策略:
# config/initializers/devise.rb
Warden::Strategies.add(:api_key, ApiKeyStrategy)
对于API控制器,你可以跳过Devise认证并实现自己的认证逻辑:
class Api::V1::BaseController < ApplicationController
skip_before_action :authenticate_user! # 跳过Devise认证
before_action :authenticate_with_api_key!
private
def authenticate_with_api_key!
api_key = request.headers['X-API-KEY'] || params[:api_key]
@current_user = User.find_by(api_key: api_key)
render json: { error: 'Invalid API key' }, status: :unauthorized unless @current_user
end
end
你也可以创建一个Rack中间件来处理API密钥认证:
# lib/api_key_middleware.rb
class ApiKeyMiddleware
def initialize(app)
@app = app
end
def call(env)
request = Rack::Request.new(env)
if api_path?(request.path) && !valid_api_key?(request)
return [401, { 'Content-Type' => 'application/json' }, [{ error: 'Invalid API key' }.to_json]]
end
@app.call(env)
end
private
def api_path?(path)
path.start_with?('/api/')
end
def valid_api_key?(request)
api_key = request.env['HTTP_X_API_KEY'] || request.params['api_key']
User.exists?(api_key: api_key)
end
end
然后在application.rb
中启用这个中间件:
config.middleware.use "ApiKeyMiddleware"
这种方法允许你在保持Devise用于常规Web身份验证的同时,为API访问提供更灵活的身份验证机制。
没有搜到相关的沙龙