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

Swift使用AppAuth-iOS接入Google登录时如何获取新access_token而非缓存旧令牌

AppAuth-iOS 实现Google登录返回旧access_token的解决方案

问题原因

  • 系统调用的授权浏览器(ASWebAuthenticationSession/SFSafariViewController)会自动复用设备上已登录的Google账号会话缓存,默认跳过账号选择/登录流程,直接返回已有授权账号的凭证
  • 你当前的授权请求没有指定强制账号选择/重新登录的参数,Google OAuth服务会直接返回已存在的授权令牌

修复步骤

  1. 添加prompt强制提示参数
    在初始化OIDAuthorizationRequest的additionalParameters字段中加入prompt参数,可选值如下:
  • select_account:强制弹出账号选择页,用户可选择已有账号或添加新账号登录(最符合你的需求)
  • login:强制要求用户重新输入账号密码登录
  • consent:强制重新弹出授权同意页,即使用户之前已完成授权
  1. 清空旧授权状态缓存
    每次发起新的登录请求前,先清空你存储在AppDelegate中的currentAuthorizationFlow对象,以及本地持久化存储的所有旧OIDAuthState相关数据,避免复用历史授权状态

修改后的代码示例

@IBAction func googleLoginButtonTapped(_ sender: Any) {
    let authorizationEndpoint = URL(string: "https://accounts.google.com/o/oauth2/v2/auth")!
    let tokenEndpoint = URL(string: "https://oauth2.googleapis.com/token")!
    
    let configuration = OIDServiceConfiguration(authorizationEndpoint: authorizationEndpoint, tokenEndpoint: tokenEndpoint)
    
    // 新增prompt参数,强制显示账号选择页
    let additionalParams = ["prompt": "select_account"]
    
    let request = OIDAuthorizationRequest.init(
        configuration: configuration,
        clientId: "970857005723-hgran64vnmn3avdqeanvl3eq4seteau7.apps.googleusercontent.com",
        scopes: [OIDScopeOpenID],
        redirectURL: URL(string: "com.googleusercontent.apps.970857005723-hgran64vnmn3avdqeanvl3eq4seteau7:/oauth2redirect/google")!,
        responseType: OIDResponseTypeCode,
        additionalParameters: additionalParams
    )
    
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    // 发起新请求前先清空旧的授权流
    appDelegate.currentAuthorizationFlow = nil
    appDelegate.currentAuthorizationFlow = OIDAuthState.authState(byPresenting: request, presenting: self, callback: { (authState, error) in
        if let authState = authState, let accessToken = authState.lastTokenResponse?.accessToken {
            print("Got authorization tokens. Access token: \(accessToken)")
        }
    })
}

修改后再次发起登录请求时就会弹出账号选择页面,用户选择新账号登录后就能拿到对应新账号的全新access_token。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:24:04