Amplify Gen2中Google社交登录后调用fetchUserAttributes失败的问题咨询
兄弟,我之前也踩过Amplify社交登录后拿用户属性的坑,咱们来一步步解决这个问题~
首先给你吃个定心丸:你不需要手动处理授权码的回调逻辑,Amplify Auth模块已经帮你封装好这部分了,出问题大概率是因为会话就绪的时机没卡对。
你提到Hub已经监听到登录成功,但调用fetchUserAttributes还是报未认证,这是因为Hub的signIn事件触发时,Amplify可能还没完全把重定向回来的会话持久化并加载完成——简单说就是监听到登录成功和会话真正可用之间有个时间差,这时候直接调用属性查询就会翻车。
给你几个实操的解决方法:
优先用
Auth.currentAuthenticatedUser()确认会话状态
这个方法是Amplify用来检查用户认证状态的核心方法,它会自动处理重定向后的会话恢复逻辑。你可以在应用初始化的地方(比如根组件的useEffect里)先调用它,等它返回用户对象后,再去调用fetchUserAttributes,代码大概是这样:import { Auth, Hub } from 'aws-amplify'; import { useEffect } from 'react'; function App() { useEffect(() => { const handleUserAuth = async () => { try { // 先确认用户会话已就绪 const authenticatedUser = await Auth.currentAuthenticatedUser(); // 现在再安全地获取用户属性 const userAttributes = await Auth.fetchUserAttributes(authenticatedUser); console.log('用户属性获取成功:', userAttributes); // 这里可以把属性存到状态里用 } catch (error) { console.log('用户未登录或会话未准备好:', error); } }; // 页面加载时先检查一次 handleUserAuth(); // 同时保留Hub监听,处理后续的登录状态变化 const unsubscribeHub = Hub.listen('auth', (data) => { if (data.payload.event === 'signIn') { // 登录事件触发后再检查一次,确保会话就绪 handleUserAuth(); } }); return () => unsubscribeHub(); }, []); // 组件其他内容... }检查回调URL配置是否匹配
你得确保Amplify配置里的redirectSignIn、redirectSignOut和你在Google开发者平台里设置的授权回调URL完全一致,包括HTTP/HTTPS、域名、路径,差一个字符都可能导致Amplify无法正确获取会话。试试清除浏览器缓存/无痕模式测试
有时候浏览器里的旧会话缓存会干扰新的登录流程,用无痕模式或者清除缓存后再测试,排除缓存问题。
总结一下:核心就是不要在Hub事件触发后立刻调用属性接口,先通过currentAuthenticatedUser()确保会话真正可用,Amplify会自动处理重定向的回调,不用你自己写那部分逻辑~
内容来源于stack exchange

