Swift使用Amplify对接AWS Cognito:登录成功后如何获取用户令牌?
解决方案
你调用的Amplify.Auth.getCurrentUser()接口本身仅返回用户ID、用户名这类基础身份信息,不包含任何令牌类数据,要获取用户令牌需要调用fetchAuthSession接口实现,修改后的参考代码如下:
func login(userData: RegistrationFields) { _ = Amplify.Auth.signIn(username: userData.email.data, password: userData.password.data) { [weak self] result in switch result { case .success(let signInResult): if signInResult.isSignedIn { self?.fetchUserAuthSession() debugPrint("Sign in succeeded") } case .failure(let error): debugPrint("Sign in failed \(error)") self?.authStateDelegate?.authState(state: .error(error: error)) } } } // 替换原有getCurrentUser方法,新增令牌获取逻辑 func fetchUserAuthSession() { _ = Amplify.Auth.fetchAuthSession { [weak self] result in switch result { case .success(let session): guard let authSession = session as? AWSAuthSession else { return } // 获取各类令牌 let idToken = try? authSession.userPoolTokensResult.get().idToken let accessToken = try? authSession.userPoolTokensResult.get().accessToken let refreshToken = try? authSession.userPoolTokensResult.get().refreshToken // 原有获取当前用户逻辑可保留 guard let user = Amplify.Auth.getCurrentUser() else {return} // 可根据需要把令牌信息一起传给代理 self?.authStateDelegate?.authState(state: .session(user: user, idToken: idToken, accessToken: accessToken)) case .failure(let error): debugPrint("Fetch auth session failed \(error)") self?.authStateDelegate?.authState(state: .error(error: error)) } } }
常见注意点
- 调用
fetchAuthSession时如果出现令牌获取失败的错误,可先调用Amplify.Auth.signOut()清理本地缓存的无效会话,再重新登录测试 - 如果你使用的是 Amplify V2 版本,接口命名会略有调整,对应读取
userPoolTokens属性即可,核心逻辑不变 - 令牌默认存在过期时间,后端校验令牌过期后可调用刷新令牌接口重新获取有效令牌,不需要用户重新登录
内容的提问来源于stack exchange,提问作者Tomer
相关产品推荐
相关产品推荐

