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

Rails 7+Devise实现LinkedIn OAuth登录报错求助

问题:Rails 7 + Devise 实现LinkedIn OAuth登录报错「糟糕,出了点问题」

在Rails 7应用中使用Devise集成LinkedIn OAuth登录,点击「通过LinkedIn登录」后跳转至LinkedIn页面,显示报错:

LinkedIn登录报错截图

已完成的操作

  • 添加Gem依赖并安装
    在Gemfile中添加:

    # OAuth LinkedIn
    gem 'omniauth-linkedin-oauth2', '~> 1.0'
    gem 'omniauth-rails_csrf_protection', '~> 1.0'
    

    执行终端命令:

    bundle install
    
  • 创建OmniAuth回调控制器并配置Devise
    创建app/controllers/users/omniauth_callbacks_controller.rb:

    class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
      def linkedin
        @user = User.from_omniauth(request.env['omniauth.auth'])
    
        if @user.persisted?
          sign_in_and_redirect @user, event: :authentication
          set_flash_message(:notice, :success, kind: 'LinkedIn') if is_navigational_format?
        else
          session['devise.linkedin_data'] = request.env['omniauth.auth']
          redirect_to new_user_registration_url
        end
      end
    
      def failure
        redirect_to root_path
      end
    end
    

    在config/initializers/devise.rb中添加:

    config.omniauth :linkedin, ENV.fetch('LINKEDIN_KEY'), ENV.fetch('LINKEDIN_SECRET')
    
  • 创建OmniAuth初始化文件
    创建config/initializers/omniauth.rb:

    OmniAuth.config.allowed_request_methods = [:get, :post]
    Rails.application.config.middleware.use OmniAuth::Builder do
      provider :linkedin, ENV['LINKEDIN_KEY'], ENV['LINKEDIN_SECRET']
    end
    
  • 添加用户表字段并执行迁移
    生成迁移命令:

    rails generate migration AddProviderAndUidToUsers provider:string uid:string
    

    迁移文件内容:

    class AddProviderAndUidToUsers < ActiveRecord::Migration[7.0]
      def change
        add_column :users, :provider, :string
        add_column :users, :uid, :string
        add_index :users, [:provider, :uid], unique: true
      end
    end
    

    执行迁移:

    rails db:migrate
    
  • 配置User模型
    在app/models/user.rb中添加:

    devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :omniauthable, omniauth_providers: %i[linkedin]
    
    def self.from_omniauth(auth)
      where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
        user.email = auth.info.email
        user.password = Devise.friendly_token[0, 20]
        user.name = auth.info.name
      end
    end
    
  • 配置路由
    在config/routes.rb中修改Devise路由:

    devise_for :users, controllers: {
        sessions: 'users/sessions', registrations: 'users/registrations',
        omniauth_callbacks: 'users/omniauth_callbacks'
      }
    
  • 配置环境变量和LinkedIn应用

    • 已在.env文件中配置LINKEDIN_KEY和LINKEDIN_SECRET
    • LinkedIn开发者后台回调URL配置如下:
      LinkedIn回调配置截图

排查方向

  1. 移除重复的OmniAuth配置
    devise.rb和omniauth.rb中都注册了LinkedIn provider,会导致中间件冲突。删除config/initializers/omniauth.rb文件,保留devise.rb中的配置即可,Devise会自动处理OmniAuth中间件注册。

  2. 验证LinkedIn应用配置

    • 回调URL必须完全匹配:确保LinkedIn后台的回调地址是https://你的域名/users/auth/linkedin/callback(本地开发需用https,可通过ngrok生成临时HTTPS域名)
    • 确认权限配置:在LinkedIn开发者后台「产品」选项卡添加「Sign In with LinkedIn」,并确保申请了r_emailaddress和r_liteprofile权限
    • 核对Client ID/Secret:检查.env中的值与LinkedIn后台完全一致,无多余空格或字符
  3. 调整OmniAuth请求方法
    删除OmniAuth.config.allowed_request_methods = [:get, :post]配置,omniauth-rails_csrf_protection会自动处理CSRF防护,使用POST方法更安全。

  4. 更新Gem版本
    修改Gemfile为gem 'omniauth-linkedin-oauth2',执行bundle update omniauth-linkedin-oauth2确保版本兼容Rails 7。

  5. 查看详细错误日志

    • 查看Rails服务器日志,获取OmniAuth相关报错信息
    • 在LinkedIn开发者后台「工具」→「事件日志」中查看具体错误详情,比如权限不足、回调不匹配等

内容的提问来源于stack exchange,提问作者My Tran Bui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:44:56