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

Rails6集成OmniAuth Apple登录出现nonce_mismatch错误如何解决

你遇到的报错核心是两个问题:1. OmniAuth配置重复加载导致回调被处理两次 2. 跨域回调的CSRF和Origin校验未放行

修复步骤

1. 移除重复的OmniAuth配置

你同时在独立的omniauth.rb和Devise的omniauthable中加载了OmniAuth逻辑,导致同一路由被两次处理,触发重复校验,nonce第一次使用后失效第二次就会报nonce_mismatch。
直接删除config/initializers/omniauth.rb文件,将苹果登录配置移到config/initializers/devise.rb的Devise配置块中:

Devise.setup do |config|
  # 保留你原有Devise配置不变,新增以下内容
  config.omniauth :apple, ENV['APPLE_CLIENT_ID'], '',
    scope: 'email name',
    team_id: ENV['APPLE_TEAM_ID'],
    key_id: ENV['APPLE_KEY_ID'],
    pem: ENV['APPLE_PEM'],
    redirect_uri: 'https://www.mywebsite.com/users/auth/apple/callback'
end

注意:

  • 不要加provider_ignores_state: true配置,该配置会打乱苹果登录的nonce校验逻辑
  • 直接读取ENV环境变量,不要用引号包裹ENV调用,之前你写的'ENV[APPLE_TEAM_ID]'只会被识别为普通字符串,不会读取实际环境变量值

2. 放行回调接口的CSRF校验

苹果回调请求是从苹果官方域名跨域发起的,不会携带你站点的CSRF token,需要在回调控制器中跳过CSRF校验:

class CallbacksController < Devise::OmniauthCallbacksController    
  skip_before_action :verify_authenticity_token
  def apple
    @user = User.from_omniauth(request.env["omniauth.auth"])
    sign_in_and_redirect @user
  end
end

3. 配置跨域规则允许苹果域名请求

在config/initializers/cors.rb中添加配置(如果没有该文件就新建,确保Gemfile中添加了gem 'rack-cors'并执行过bundle install):

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'https://appleid.apple.com'
    resource '/users/auth/apple/callback', headers: :any, methods: [:post]
  end
end

4. 校验苹果开发者后台配置

确认你苹果开发者后台对应Services ID的回调地址和代码中redirect_uri配置完全一致,没有路径、大小写、协议差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:06:04