Doorkeeper与Active Storage集成终极指南:如何为OAuth认证系统添加文件上传功能 [特殊字符]
Doorkeeper与Active Storage集成终极指南如何为OAuth认证系统添加文件上传功能 【免费下载链接】doorkeeperDoorkeeper is an OAuth 2 provider for Ruby on Rails / Grape.项目地址: https://gitcode.com/gh_mirrors/do/doorkeeperDoorkeeper是一个强大的OAuth 2.0提供者gem专为Ruby on Rails和Grape应用程序设计。它为你的应用提供了完整的OAuth认证解决方案包括授权码流、客户端凭证、刷新令牌等所有标准OAuth 2.0功能。本文将为你展示如何将Doorkeeper与Rails的Active Storage无缝集成为你的OAuth认证系统添加强大的文件上传功能。为什么需要为OAuth系统添加文件上传 在现代Web应用中OAuth认证系统通常需要处理用户头像、应用图标、文档附件等文件上传需求。通过集成Active Storage你可以为Doorkeeper管理的OAuth应用提供完整的文件管理能力包括应用图标上传和存储用户头像管理文档附件支持多存储服务支持本地、S3、Google Cloud等准备工作安装和配置Doorkeeper首先确保你已经正确安装了Doorkeeper。如果你还没有安装可以通过以下命令快速开始# 添加Doorkeeper到Gemfile bundle add doorkeeper # 运行安装生成器 rails generate doorkeeper:install # 运行迁移 rails doorkeeper:install:migrations rails db:migrateDoorkeeper的核心配置文件位于config/initializers/doorkeeper.rb这是你配置OAuth行为的主要位置。集成Active Storage到Doorkeeper应用模型 步骤1扩展Doorkeeper应用模型Doorkeeper的OAuth应用模型默认位于lib/doorkeeper/models/application_mixin.rb。要添加文件上传功能我们需要扩展这个模型。创建或修改你的应用模型文件# app/models/oauth_application.rb class OauthApplication ApplicationRecord include Doorkeeper::Orm::ActiveRecord::ApplicationMixin # 添加Active Storage附件 has_one_attached :logo has_many_attached :documents # 验证文件类型和大小 validates :logo, content_type: [image/png, image/jpeg, image/gif], size: { less_than: 5.megabytes } validates :documents, content_type: [application/pdf, application/msword], size: { less_than: 10.megabytes } end步骤2更新数据库迁移运行Active Storage的安装命令rails active_storage:install rails db:migrate然后创建自定义迁移来添加必要的字段rails generate migration AddLogoToOauthApplications配置Doorkeeper使用自定义应用模型 ⚙️在Doorkeeper的配置文件中指定使用你的自定义模型# config/initializers/doorkeeper.rb Doorkeeper.configure do # ... 其他配置 # 使用自定义的OAuth应用模型 orm :active_record resource_owner_authenticator do # 你的认证逻辑 end # 配置自定义应用类 application_class OauthApplication # 允许的文件上传参数 access_token_expires_in 2.hours use_refresh_token # 自定义授权范围 default_scopes :public optional_scopes :write, :upload_files end创建文件上传API端点 步骤1扩展Doorkeeper控制器Doorkeeper的控制器位于app/controllers/doorkeeper/。我们可以创建自定义控制器来处理文件上传# app/controllers/api/v1/oauth_applications_controller.rb module Api module V1 class OauthApplicationsController Doorkeeper::ApplicationsController before_action :doorkeeper_authorize! def upload_logo application current_user.oauth_applications.find(params[:id]) application.logo.attach(params[:logo]) if application.save render json: { message: Logo uploaded successfully, logo_url: url_for(application.logo) } else render json: { errors: application.errors.full_messages }, status: :unprocessable_entity end end def upload_documents application current_user.oauth_applications.find(params[:id]) application.documents.attach(params[:documents]) if application.save render json: { message: Documents uploaded successfully, document_count: application.documents.count } else render json: { errors: application.errors.full_messages }, status: :unprocessable_entity end end end end end步骤2配置路由在路由文件中添加自定义端点# config/routes.rb Rails.application.routes.draw do use_doorkeeper namespace :api do namespace :v1 do resources :oauth_applications, only: [] do member do post :upload_logo post :upload_documents end end end end end实现安全的文件访问控制 步骤1添加文件访问权限检查在Doorkeeper的授权流程中集成文件访问控制# app/policies/oauth_application_policy.rb class OauthApplicationPolicy attr_reader :user, :application def initialize(user, application) user user application application end def upload_logo? user.admin? || application.owner user end def upload_documents? user.admin? || application.owner user end def view_documents? user.admin? || application.owner user || (application.public_documents? user.authenticated?) end end步骤2在控制器中使用策略# app/controllers/api/v1/oauth_applications_controller.rb def upload_logo application OauthApplication.find(params[:id]) # 使用Pundit进行授权检查 authorize application, :upload_logo? # ... 上传逻辑 end优化文件上传性能 使用Direct UploadActive Storage支持直接上传到云存储服务减少服务器负载// 前端JavaScript示例 const input document.querySelector(input[typefile]); const formData new FormData(); // 获取直接上传URL const response await fetch(/rails/active_storage/direct_uploads, { method: POST, headers: { Authorization: Bearer ${accessToken}, Content-Type: application/json }, body: JSON.stringify({ file: input.files[0] }) }); const { signed_id } await response.json(); // 发送到你的API await fetch(/api/v1/oauth_applications/1/upload_logo, { method: POST, headers: { Authorization: Bearer ${accessToken}, Content-Type: application/json }, body: JSON.stringify({ logo: signed_id }) });配置Active Storage服务根据你的需求选择合适的存储服务# config/storage.yml amazon: service: S3 access_key_id: % Rails.application.credentials.dig(:aws, :access_key_id) % secret_access_key: % Rails.application.credentials.dig(:aws, :secret_access_key) % region: us-east-1 bucket: your-bucket-name google: service: GCS credentials: % Rails.application.credentials.dig(:gcs, :credentials) % project: your-project bucket: your-bucket-name测试文件上传功能 ✅编写RSpec测试Doorkeeper的测试文件位于spec/目录。添加文件上传测试# spec/requests/api/v1/oauth_applications_spec.rb RSpec.describe OAuth Application File Upload, type: :request do let(:user) { create(:user) } let(:application) { create(:oauth_application, owner: user) } let(:access_token) { create(:access_token, resource_owner_id: user.id) } describe POST /api/v1/oauth_applications/:id/upload_logo do let(:valid_params) do { logo: fixture_file_upload(spec/fixtures/files/logo.png, image/png) } end it uploads logo successfully do post /api/v1/oauth_applications/#{application.id}/upload_logo, params: valid_params, headers: { Authorization Bearer #{access_token.token} } expect(response).to have_http_status(:ok) expect(json_response[logo_url]).to be_present end end end监控和日志记录 添加文件上传审计日志# app/models/concerns/file_upload_auditable.rb module FileUploadAuditable extend ActiveSupport::Concern included do has_many :file_upload_audits, as: :auditable end def audit_file_upload(user, file_name, file_size) file_upload_audits.create!( user: user, file_name: file_name, file_size: file_size, uploaded_at: Time.current ) end end常见问题解决 问题1文件上传大小限制解决方案在Doorkeeper配置中调整限制# config/initializers/doorkeeper.rb Doorkeeper.configure do # 允许更大的文件上传 skip_client_authentication_for_password_grant true # 或者通过中间件配置 use Rack::Attack end # config/application.rb config.middleware.use Rack::Attack问题2跨域文件上传解决方案配置CORS# config/initializers/cors.rb Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins https://your-frontend.com resource /api/v1/*, headers: :any, methods: [:get, :post, :put, :patch, :delete, :options, :head], credentials: false, expose: [Authorization] end end总结与最佳实践 通过将Doorkeeper与Active Storage集成你可以为OAuth认证系统构建强大的文件上传功能。关键要点包括扩展应用模型使用Active Storage的has_one_attached和has_many_attached安全第一实现适当的授权和验证性能优化利用Direct Upload减少服务器负载监控审计记录所有文件上传活动全面测试确保文件上传功能稳定可靠Doorkeeper的文件结构组织良好核心代码位于lib/doorkeeper/控制器在app/controllers/doorkeeper/模型在lib/doorkeeper/models/。这种清晰的架构使得扩展功能变得简单直接。现在你的OAuth认证系统已经具备了完整的文件上传能力 无论是应用图标、用户头像还是文档附件都可以通过安全的OAuth保护的方式进行管理和访问。【免费下载链接】doorkeeperDoorkeeper is an OAuth 2 provider for Ruby on Rails / Grape.项目地址: https://gitcode.com/gh_mirrors/do/doorkeeper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2478192.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!