
Firebase Auth for iOS 集成指南从多方式登录配置到源码级流程解析【免费下载链接】firebase-ios-sdkFirebase SDK for Apple App Development项目地址: https://gitcode.com/GitHub_Trending/fi/firebase-ios-sdkFirebase Auth 为 Apple 平台应用提供了一整套开箱即用的用户认证能力支持 Google、Apple、Twitter、Microsoft、GitHub、Yahoo、Facebook 等第三方身份提供商以及邮箱密码、邮箱免密Passwordless、手机号、匿名、自定义认证系统等多种登录方式。本文以 firebase-ios-sdk 仓库中 FirebaseAuth/README.md 及其配套的 SampleSwift 示例工程 为核心骨架结合仓库内真实源码与测试完整讲解每种认证方式的启用步骤、关键配置项、Xcode 工程要求并深入到 Passwordless 登录的完整调用链帮助你在一小时内搭建一个可运行、可演示、可测试的 Firebase Auth 集成工程。一、Firebase Auth 与仓库内的示例工程1.1 Firebase Auth 是什么根据 FirebaseAuth/README.md 的定位Firebase Auth 是一套帮助 iOS/macOS 应用轻松支持多种端用户认证选项easily support multiple authentication options for their end users的认证框架。它把认证状态管理、ID Token 生命周期、多因素认证MFA、OAuth 凭据交换等复杂逻辑封装为稳定的公开 API开发者只需关注选择哪种认证方式、如何把第三方 SDK 的登录结果交给 Firebase。从仓库源码结构看FirebaseAuth 的公开 API 集中在 FirebaseAuth/Sources/Public/FirebaseAuth 目录下包括FIRAuth.h核心入口负责登录、登出、监听认证状态与 ID Token 变化、发送验证邮件/密码重置邮件、处理 Action CodeOOB Code等FIRUser.h当前用户对象提供获取 ID Token、更新邮箱/密码、关联/解绑身份提供商、多因素管理、删除账户等能力各类 Provider 头文件FIRGoogleAuthProvider.h、FIREmailAuthProvider.h、FIRPhoneAuthProvider.h、FIRFacebookAuthProvider.h、FIRGitHubAuthProvider.h、FIRTwitterAuthProvider.h、FIRFederatedAuthProvider.h、FIRGameCenterAuthProvider.h等分别对应把第三方 SDK 的凭据转换为 FirebaseAuthCredential的工厂方法FIRMultiFactor.h多因素认证MFA的公开接口。1.2 示例工程与测试的组织方式FirebaseAuth/README.md 明确说明仓库内的Example/Auth目录包含一批与 FirebaseAuth 集成的样例与测试。在当前仓库中这一目录即 FirebaseAuth/Tests/SampleSwift其中包含了 Swift 示例应用AuthenticationExample基于官方 quickstart-ios 的 authentication 示例实现、AuthenticationExampleUITests、ObjCApiTests、SwiftApiTests以及一个generate_refresh_token.sh脚本单元测试无需额外配置即可随 Firebase 整体测试一起运行示例工程的搭建、运行与测试说明集中在 Tests/SampleSwift/README.md。打开示例工程的方式为在 Xcode 中打开AuthenticationExample.xcodeproj。该工程是一个 Tab 双页应用SceneDelegate.swift中创建了Authentication认证入口页与Current User当前用户信息页两个导航控制器并挂载到UITabBarController上入口页由 AuthViewController.swift 驱动通过DataSourceProvider渲染认证方式菜单。二、连接 Firebase 控制台把示例工程与你的 Firebase 项目绑定在使用任何认证流程前需要先把示例应用连接到 Firebase 控制台。步骤摘要如下访问 Firebase 控制台创建一个新应用项目在项目中添加一个iOS App填入的Bundle Identifier必须与示例工程的 Bundle Identifier 完全一致按提示下载GoogleService-Info.plist将下载的GoogleService-Info.plist拖入 Xcode 工程或通过File→Add Files to AuthenticationExample添加并确保该文件被加入应用的主 Target此时即可直接构建并运行示例应用。从 AuthViewController.swift 的 Google 登录实现可以看到示例应用通过FirebaseApp.app()?.options.clientID读取 Firebase 配置即来自GoogleService-Info.plist的 CLIENT_ID这正是plist 必须加入主 Target的原因——运行时的FirebaseApp配置依赖它。三、通用前提为 OAuth 流程添加自定义 URL Scheme配置下面大部分身份提供商之前都需要在 Xcode 工程中为每个身份提供商分别添加一个自定义 URL Scheme不要互相覆盖替换这样 Firebase Auth 才能正确接收身份提供商回调回应用的数据。操作路径为选中应用 Target →Info标签页 → 展开URL Types区域 → 新增 URL Type。对于 Google / Twitter / Microsoft / GitHub / Yahoo 等流程URL Scheme 使用GoogleService-Info.plist中REVERSED_CLIENT_ID键对应的值对于 FacebookURL Scheme 的格式为fb Facebook App Id例如fb1234567890对于 Dynamic Links 免密登录URL Scheme 使用应用的Bundle Identifier详见本文第六节。此外REVERSED_CLIENT_ID与 Facebook App Id 也可以在工程的Info.plist中配置AuthViewController.swift的 Facebook 配置注释提到Facebook 的kFacebookAppID与Info.plist配置二选一即可。四、启用身份提供商Identity Providers示例应用对每一类第三方登录都实现了完整流程全部在 AuthViewController.swift 中入口集中在didSelectRowAt的switch provider分发逻辑。下面按登录方式逐一说明。4.1 Google Sign InFirebase 控制台侧进入项目的Auth面板 →Sign In Method标签 → 点击Google→ 打开Enable开关 → 保存。Xcode 工程侧示例工程已经内置了GoogleSignIn包依赖按第三节说明把GoogleService-Info.plist中的REVERSED_CLIENT_ID添加为自定义 URL Scheme。运行与代码路径运行应用后在Identity Providers下选择Google。源码实现见 AuthViewController.swiftguard let clientID FirebaseApp.app()?.options.clientID else { return } let config GIDConfiguration(clientID: clientID) GIDSignIn.sharedInstance.configuration config Task { do { let result try await GIDSignIn.sharedInstance.signIn(withPresenting: self) let user result.user guard let idToken user.idToken?.tokenString else { ... } let credential GoogleAuthProvider.credential(withIDToken: idToken, accessToken: user.accessToken.tokenString) try await signIn(with: credential) } catch { return displayError(error) } }关键点Google SDK 返回idToken与accessToken后通过GoogleAuthProvider.credential(withIDToken:accessToken:)构造 Firebase 凭据再调用AppManager.shared.auth().signIn(with: credential)完成 Firebase 侧登录。signIn(with:)方法还处理了多因素second factor场景当返回的错误码为AuthErrorCode.secondFactorRequired时从AuthErrorUserInfoMultiFactorResolverKey取出MultiFactorResolver并转入 MFA 登录流程。4.2 Sign in with Apple前提需要在 Xcode 工程的Signing Capabilities中启用Sign in with Apple能力Capability。Firebase 控制台侧Auth 面板 → Sign In Method → 点击Apple→ 打开Enable→ 保存。运行运行应用后选择Apple。示例代码位于 AuthViewController.swift其做法是let nonce try CryptoUtils.randomNonceString() currentNonce nonce let appleIDProvider ASAuthorizationAppleIDProvider() let request appleIDProvider.createRequest() request.requestedScopes [.fullName, .email] request.nonce CryptoUtils.sha256(nonce) let authorizationController ASAuthorizationController(authorizationRequests: [request]) authorizationController.delegate self authorizationController.presentationContextProvider self authorizationController.performRequests()即用CryptoKit生成随机 nonce 并对sha256(nonce)传入ASAuthorizationAppleIDRequest随后在授权回调中把 Apple 凭据交给OAuthProvider.credential(withProviderID: apple.com, idToken:rawNonce:)完成 Firebase 登录。nonce 机制用于防止重放攻击是 Sign in with Apple 与 Firebase 集成的标准做法。4.3 TwitterFirebase 控制台Auth → Sign In Method → 开启Twitter在 Twitter 开发者门户注册应用获取API Key与App Secret填入 Firebase 控制台并保存在 Twitter 应用配置页把 Firebase OAuth 回调地址形如my-app-12345.firebaseapp.com/__/auth/handler设置为 Authorization callback URL在 Xcode 中添加REVERSED_CLIENT_ID对应的自定义 URL Scheme若之前已添加过可复用运行应用在 Identity Providers 下选择Twitter。4.4 MicrosoftFirebase 控制台Auth → Sign In Method → 开启Microsoft在 MicrosoftAzure AD开发者门户注册应用获取Application Id与Application Secret填入 Firebase 控制台并保存将 Firebase OAuth 回调地址my-app-12345.firebaseapp.com/__/auth/handler配置为应用的 Authorization callback URLXcode 中添加REVERSED_CLIENT_IDURL Scheme运行应用选择Microsoft。4.5 GitHubFirebase 控制台Auth → Sign In Method → 开启GitHub在 GitHub 开发者门户构建 OAuth App获取Client ID与Client Secret填入 Firebase 控制台并保存将 Firebase OAuth 回调地址配置为 Authorization callback URLXcode 中添加REVERSED_CLIENT_IDURL Scheme运行应用选择GitHub。4.6 YahooFirebase 控制台Auth → Sign In Method → 开启Yahoo在 Yahoo 开发者门户创建应用获取Client ID与Client Secret填入 Firebase 控制台并保存将 Firebase OAuth 回调地址配置为 Authorization callback URLXcode 中添加REVERSED_CLIENT_IDURL Scheme运行应用选择Yahoo。4.7 Facebook在 Facebook 开发者站点按指引创建 iOS 应用Bundle ID 填写com.google.firebase.quickstart.AuthenticationExample示例默认 Bundle Identifier若修改过需保证与 Facebook 开发者后台一致按 Facebook iOS 集成指南完成配置示例工程已内置FBSDKLoginKit依赖与初始化代码可跳过其指南中的步骤 1 与步骤 3Firebase 控制台Auth → Sign In Method → 开启Facebook填入App Id与App Secret并保存将AuthViewController.swift顶部常量kFacebookAppID的值替换为你的 Facebook App Id也可在示例的Info.plist中配置Xcode 中添加格式为fb App Id的自定义 URL Scheme如fb1234567890运行应用选择Facebook。对应实现见 AuthViewController.swift使用LoginManager请求[email]权限拿到AccessToken.current后通过FacebookAuthProvider.credential(withAccessToken:)构造凭据并signin(with:)。五、邮箱密码认证Email/Password配置Firebase 控制台 → Auth → Sign In Method → 开启Email/Password→ 保存。运行运行应用后选择Email Password。示例工程以 SwiftUI 形式呈现登录界面AuthViewController通过UIHostingController(rootView: LoginView(delegate: self))展示支持登录与创建账户两种操作属于最基础的认证能力也是后续验证邮件、密码重置等 Action Code 流程的载体。六、其他认证方式6.1 Email Link / Passwordless 免密登录邮箱免密登录Passwordless通过向用户邮箱发送一封含特殊Dynamic Link的验证邮件完成认证用户点击链接即可回到应用并自动登录。配置链路较长按以下顺序操作1. 在 Firebase 控制台开启免密Auth → Sign In Method → 确保Email/Password已开启 → 打开Email link (passwordless sign-in)→ 保存。2. 配置 Dynamic Links在项目设置中启用 Dynamic Links需要填写App Store ID示例中可随意填写如123456789与Team ID需与 Apple 开发者账号关联在控制台Dynamic Links面板点击Get Started输入一个域名例如authenticationexample.page.link该域名大概率已被占用可调整为authenticationexample123之类务必保留.page.link后缀在 Xcode 中为应用主 Target 添加Associated Domains能力并将上面复制的域名以applinks:[域名]格式填入例如applinks: authenticationexample.page.link。若工程开启了自动签名可在 Signing Capabilities 页直接点 添加否则需在 Apple Developer 控制台配置并下载描述文件回到 Dynamic Links 面板创建New Dynamic LinkShort URL随意如demo、login、passwordlessDeep Link URL形如https://[authorized domain]/login?emailemail。其中授权域名取自 Firebase 控制台Authentication → Settings → Authorized domains中类似[app 名称].firebaseapp.com的域名也可以把 Dynamic Links 前缀域名加入白名单后使用Define link behavior for iOS选择Open the deep link in your iOS App并在下拉框中选中你的应用其余步骤按需配置后点击Create由于 Dynamic Links 默认使用应用的 Bundle Identifier 作为 URL Scheme需在 Xcode 中把Bundle Identifier添加为自定义 URL Scheme。3. 修改示例代码打开PasswordlessViewController.swift找到sendSignInLink()方法把其中的stringURL常量替换为你创建的 Dynamic Link 长链接对应的授权域名形如let stringURL https://\(authorizedDomain)/login4. 运行验证运行应用 → 选择Email Link/Passwordless→ 输入邮箱并点击Send Sign In Link→ 保持当前页面不退出切到邮件应用等待验证邮件 → 点击邮件中的登录链接 → 应用被唤起并完成登录。6.2 Phone Number 手机号认证手机号认证的工作机制值得注意Firebase Auth 会先尝试向设备发送一条静默的Apple Push NotificationAPN以确认该手机号与当前设备关联如果 APNs 未启用或配置不正确则会回退到带有 reCAPTCHA 验证的网页流程。因此 APNs与 Sign in with Apple 一样是可在 Xcode 或 Apple Developer 控制台开启的能力对手机号认证的体验有直接影响。配置与运行Firebase 控制台 → Auth → Sign In Method → 开启Phone→ 保存 → 运行应用选择Phone Number→ 输入手机号后等待约 5 秒让 Firebase Auth 呈现必要的验证流程。对应实现位于 PhoneAuthViewController.swift核心是PhoneAuthProvider.provider().verifyPhoneNumber(...)获取验证 ID 与发送验证码再通过PhoneAuthProvider.provider().credential(withVerificationID:verificationCode:)完成登录。同时SceneDelegate.swift 中实现了scene(_:openURLContexts:)通过Auth.auth().canHandle(url)处理 reCAPTCHA 的回调 URL——注释特别说明在关闭 swizzling 时该方法是必需的否则 reCAPTCHA 的登录视图控制器无法正确关闭。6.3 Anonymous Authentication 匿名认证配置Firebase 控制台 → Auth → Sign In Method → 开启Anonymous→ 保存。运行运行应用选择Anonymous Authentication。实现极简见 AuthViewController.swiftAppManager.shared.auth().signInAnonymously { result, error in guard error nil else { return self.displayError(error) } self.transitionToUserViewController() }匿名认证常作为游客先用、之后再升级为正式账号的产品方案起点——匿名用户后续可通过link(with:)关联邮箱/第三方凭据。6.4 Custom Auth System 自定义认证系统适用于已有自有账号体系、希望由 Firebase 托管会话与 Token 的场景。确保你的认证服务器能签发自定义签名 Tokencustom signed tokens用户登录时客户端向该服务器请求签名 Token拿到 Token 后调用Auth.auth().signIn(withCustomToken:)完成 Firebase 认证。示例中的演示入口在 CustomAuthViewController.swift粘贴 Token 后点击Login即可登录关联用户。本地生成测试 Token 的方法示例文档给出的配置路径Firebase 控制台 →Project settings→Service accounts标签 → 在All service account区域点击对应链接进入 Google Cloud Console在 Google Cloud Console 选中正确的 Firebase 项目 → 左侧菜单进入API Manager→ 点击Credentials→New credentials→Service account key→ 新建服务账号密钥类型选择JSON点击Create下载 JSON 密钥文件用浏览器打开示例目录LegacyAuthQuickstart子目录中的web/auth.html点击Choose File上传刚下载的 JSON 文件输入任意 User ID 并点击Generate复制生成的 Token在示例应用中选择Custom Auth system粘贴 Token 并登录。七、源码级流程解析Passwordless 免密登录完整调用链示例文档专门用一节So how does this work?讲解免密登录的端到端机制我们结合仓库源码把这条链路完整还原。第一阶段发送验证链接。用户输入邮箱并点击Send Sign In Link后PasswordlessViewController.swift 构造ActionCodeSettings并调用sendSignInLinklet actionCodeSettings ActionCodeSettings() let stringURL https://\(authorizedDomain)/demo actionCodeSettings.url URL(string: stringURL) actionCodeSettings.handleCodeInApp true actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!) actionCodeSettings.linkDomain customDomain AppManager.shared.auth() .sendSignInLink(toEmail: email, actionCodeSettings: actionCodeSettings) { error in ... }三个关键配置的作用url指向 Dynamic Link 的深链地址handleCodeInApp true表示登录操作必须在应用内完成对应控制台Email link开关linkDomain用于指定自定义托管域名。发送成功后示例把email暂存等待后续完成登录时使用。第二阶段接收 Dynamic Link 回调。由于示例采用SceneDelegateAPIDynamic Link 的唤起由 SceneDelegate.swift 的scene(_:continue:)处理其userActivity.webpageURL即为传入的链接func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { if let incomingURL userActivity.webpageURL { handleIncomingDynamicLink(incomingURL) } } private func handleIncomingDynamicLink(_ incomingURL: URL) { let link incomingURL.absoluteString if AppManager.shared.auth().isSignIn(withEmailLink: link) { UserDefaults.standard.set(link, forKey: Link) NotificationCenter.default .post(Notification(name: Notification.Name(PasswordlessEmailNotificationSuccess))) } }这里先用Auth.auth().isSignIn(withEmailLink:)判断链接是否为签名链接而不是普通网页或广告链接若是则将链接存入UserDefaults并向PasswordlessViewController广播通知示意用户点开了我们发送的验证链接可以完成认证了。第三阶段完成登录。PasswordlessViewController在viewDidLoad中注册了同名通知registerForLoginNotifications收到通知后执行passwordlessSignIn()PasswordlessViewController.swiftguard let link UserDefaults.standard.value(forKey: Link) as? String else { return } AppManager.shared.auth().signIn(withEmail: email, link: link) { result, error in ... }Auth.auth().signIn(withEmail:link:)在后台会校验该链接确实是当初发送给对应邮箱的签名链接校验通过即完成登录随后示例通过currentUser.isEmailVerified确认验证状态并跳转到用户页。这条链路完整展示了免密登录的三大要素邮件里的签名链接含邮箱信息、Dynamic Links 将用户从邮件带回应用、signIn(withEmail:link:)的链接-邮箱关联校验。八、进阶能力Token、监听器与多因素认证除了登录流程示例工程还覆盖了 Firebase Auth 的高频进阶 API同样可以在应用中逐项演示入口均位于 AuthViewController.swift 的菜单分发Token 获取与强制刷新currentUser.getIDTokenResult(forcingRefresh:completion:)可查看 ID Token 中携带的 claims认证状态监听Auth.auth().addStateDidChangeListener与removeStateDidChangeListener(handle)用于驱动 UI 随登录态切换示例维护了监听器句柄数组可添加/移除多个监听器addAuthStateListener/removeAuthStateListenerID Token 变化监听addIDTokenDidChangeListener/removeIDTokenDidChangeListenerAction CodeOOB Code全流程sendEmailVerification、sendPasswordReset(withEmail:actionCodeSettings:)、confirmPasswordReset(withCode:newPassword:)、checkActionCode、applyActionCode、verifyPasswordResetCode。actionCodeSettings()通过ActionCodeSettings配置继续 URL、handleCodeInApp与linkDomain并支持在.inApp/.continue/.email三种请求类型间切换toggleActionCodeRequestType多因素认证MFA手机号因子注册user.multiFactor.getSessionWithCompletion→PhoneAuthProvider.provider().verifyPhoneNumber(_:multiFactorSession:)→PhoneMultiFactorGenerator.assertion(with:)→enroll与TOTP 因子注册TOTPMultiFactorGenerator.generateSecret(with:)→ 生成二维码 URL 并唤起 OTP App →TOTPMultiFactorGenerator.assertionForEnrollment→enroll以及按factorInfo.uid解绑因子unenroll(withFactorUID:)登录时的 MFA 二次校验signIn(with:)捕获AuthErrorCode.secondFactorRequired错误取出MultiFactorResolver后通过MFALoginView完成二次验证reCAPTCHA 初始化Auth.auth().initializeRecaptchaConfig()performInitRecaptcha与自定义认证域名Auth.auth().customAuthDomain ...performCustomAuthDomainFlowApp 删除FirebaseApp.delete。九、开发与测试如何运行与验证FirebaseAuth/README.md 说明了两条测试路径单元测试无需额外配置FirebaseAuth/Tests/Unit下的 64 个测试文件61 个 Swift、3 个 Objective-C可随 Firebase 整体单元测试一起运行覆盖 Auth 内核各模块Token 管理、API 请求、用户状态机等示例工程测试Tests/SampleSwift/README.md 中强调AuthenticationExample同时用于手动与自动化集成测试。工程内包含AuthenticationExampleUITestsUI 级自动化测试、SwiftApiTestsSwift API 调用测试与ObjCApiTestsObjective-C API 兼容性测试可验证公开 API 在两种语言下的行为一致性。由于AuthenticationExample依赖真实 Firebase 后端UI/集成测试需要先完成第二节的 Firebase 控制台接入而纯单元测试则完全离线可跑。这种单元测试零配置 集成测试按需配置的分层正是大型 SDK 工程中可借鉴的测试组织方式。十、小结围绕 FirebaseAuth/README.md 定位的多认证方式支持能力本文完整继承了 SampleSwift 示例文档 的全部配置步骤并结合仓库源码补充了底层实现从Firebase 控制台 Xcode 双端配置URL Scheme、Associated Domains、APNs到运行时 API 调用GoogleAuthProvider.credential、sendSignInLink、signIn(with:link:)等每一步都有明确的仓库内实现可供对照第三方 OAuth 类流程统一走Provider SDK 取凭据 →AuthCredential转换 →signIn(with:)模式免密登录则额外依赖 Dynamic Links 与SceneDelegate回调手机号认证的 APN/APNs 回退 reCAPTCHA 机制、Google 登录的REVERSED_CLIENT_IDURL Scheme、Facebook 的fb AppIdScheme 等易错细节均已给出明确结论。如果你需要把某一种登录方式接入自己的应用推荐直接以 AuthViewController.swift 中对应的方法为蓝本保留 Provider SDK 部分、替换为自己的 UI 逻辑即可。【免费下载链接】firebase-ios-sdkFirebase SDK for Apple App Development项目地址: https://gitcode.com/GitHub_Trending/fi/firebase-ios-sdk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考