Swift使用AppAuth-iOS接入Google登录时如何获取新access_token而非缓存旧令牌
AppAuth-iOS 实现Google登录返回旧access_token的解决方案
问题原因
- 系统调用的授权浏览器(ASWebAuthenticationSession/SFSafariViewController)会自动复用设备上已登录的Google账号会话缓存,默认跳过账号选择/登录流程,直接返回已有授权账号的凭证
- 你当前的授权请求没有指定强制账号选择/重新登录的参数,Google OAuth服务会直接返回已存在的授权令牌
修复步骤
- 添加prompt强制提示参数
在初始化OIDAuthorizationRequest的additionalParameters字段中加入prompt参数,可选值如下:
select_account:强制弹出账号选择页,用户可选择已有账号或添加新账号登录(最符合你的需求)login:强制要求用户重新输入账号密码登录consent:强制重新弹出授权同意页,即使用户之前已完成授权
- 清空旧授权状态缓存
每次发起新的登录请求前,先清空你存储在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
相关产品推荐
相关产品推荐

