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

Ruby on Rails中Devise集成omniauth_apple实现Apple SSO报错求助

解决Rails + Devise + omniauth_apple集成的Apple SSO回调错误

核心错误分析

你遇到的两个问题:

  • OAuth2::AccessToken.from_hash: hash contained more than one 'token' key:OAuth2库的警告,不影响功能但可消除
  • id_token_claims_invalid | nonce invalid:核心错误,Apple要求的nonce验证失败,根源是你禁用了OmniAuth的state验证

具体修复步骤

1. 修正Devise OmniAuth配置(devise.rb)

移除provider_ignores_state: true,并添加参数消除token警告:

config.omniauth :apple, Rails.application.credentials.dig(Rails.env.to_sym, :apple_sso, :client_id), '', {
  scope: 'email name',
  team_id: Rails.application.credentials.dig(Rails.env.to_sym, :apple_sso, :team_id),
  key_id: Rails.application.credentials.dig(Rails.env.to_sym, :apple_sso, :key_id),
  pem: Rails.application.credentials.dig(Rails.env.to_sym, :apple_sso, :pem),
  redirect_uri: Rails.application.credentials.dig(Rails.env.to_sym, :apple_sso, :redirect_uri),
  # 移除provider_ignores_state: true,启用Apple强制要求的nonce验证
  token_params: { parse: :json } # 消除token键冲突的警告信息
}

关键说明:provider_ignores_state: true会跳过OmniAuth的state/nonce生成与验证逻辑,而Apple SSO强制要求nonce防止重放攻击,必须移除这一行。

2. 修正回调控制器的CSRF设置(omniauth_callbacks_controller.rb)

移除冲突的CSRF配置,仅保留跳过Apple回调的CSRF验证:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  skip_before_action :verify_authenticity_token, only: [:apple]
  
  def apple
    puts "==== GOT INTO APPLE======="
    auth_hash = request.env['omniauth.auth']
    # 后续可添加用户查找/创建等业务逻辑
  end
end

关键说明:protect_from_forgery prepend: true, only: :apple会强制验证CSRF,但Apple的回调不会携带Rails的CSRF token,导致验证失败,必须移除。

3. 验证基础配置正确性

  • PEM文件格式:确保pem内容完整复制自Apple开发者后台下载的私钥,包含-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----,无多余换行或空格。
  • Redirect URI匹配:Apple开发者后台设置的回调URI必须和redirect_uri完全一致,包括协议(http/https)、域名、端口(本地开发通常为http://localhost:3000/users/auth/apple/callback)。
  • Session可用性:本地开发不要禁用Session,omniauth_apple需要通过Session存储生成的nonce。

验证修复

重启Rails服务器后重新测试:

  1. 点击"Sign in with Apple"跳转至Apple登录页
  2. 输入账号密码完成授权
  3. 检查终端是否输出==== GOT INTO APPLE=======,确认进入回调控制器
  4. 查看auth_hash是否包含正确的用户信息(email、name等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:53:10