You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails技术问询:如何在同一应用中同时使用Devise的API与非API模式

能否在同一Rails应用中同时启用Devise的API与非API模式?

环境版本

  • Rails: 7.0.3.1
  • Devise: 4.8.1

完全可以在同一个Rails应用里同时用Devise的API模式和传统非API模式,完美适配既有静态页面、又要给React等前端提供接口的场景。具体实现思路如下:

1. 拆分Devise配置,不全局锁定模式

不用全局开启API模式,而是通过路由约束和自定义控制器把两种请求分开处理:

  • 传统Web请求(对应静态页面):用Devise默认控制器,正常处理session cookie、flash消息这些Web端特性。
  • API请求:单独写一套Devise控制器,跳过CSRF验证、返回JSON响应,用token类的认证方式。

2. 路由配置示例

把API相关的Devise路由单独分组,指定格式约束和自定义控制器:

# config/routes.rb
# 传统Web端的Devise默认路由
devise_for :users

# API端的Devise路由,指定JSON格式和专用控制器
namespace :api, defaults: { format: :json } do
  namespace :v1 do
    devise_for :users, controllers: {
      sessions: 'api/v1/users/sessions',
      registrations: 'api/v1/users/registrations'
    }
  end
end

3. 自定义API控制器示例

创建API专用的会话控制器,适配JSON响应和无状态认证:

# app/controllers/api/v1/users/sessions_controller.rb
class Api::V1::Users::SessionsController < Devise::SessionsController
  skip_before_action :verify_authenticity_token
  respond_to :json

  def create
    self.resource = warden.authenticate!(auth_options)
    sign_in(resource_name, resource)
    render json: { user: resource, token: resource.authentication_token }
  end

  def destroy
    sign_out(resource_name)
    render json: { message: '登出成功' }
  end
end

4. 认证逻辑区分

  • Web端:继续用Devise默认的session cookie认证,不需要额外改动。
  • API端:可以用Devise自带的token字段认证,或者集成JWT,让前端在请求头里带token完成身份验证。

注意点

  • API控制器一定要跳过CSRF验证,因为API请求不会像Web页面那样带csrf token。
  • 用户模型可以共用同一个User表,只需加个authentication_token字段(如果用token认证的话)。
  • 确保响应格式正确:Web端返回HTML,API端返回JSON。

内容的提问来源于stack exchange,提问作者LLCampos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:05:23