无法从AWS Cognito获取用户邮箱,无法导入Auth模块求替代方案
解决方案:AWS Cognito获取用户邮箱/手机号 + Auth模块导入问题
一、解决无法导入Auth模块的问题
Amplify v6版本重构了模块结构,Auth模块不再从aws-amplify根包导入,需要单独从子路径引入:
import { Auth } from 'aws-amplify/auth';
二、获取用户邮箱、手机号的方案
方案1:基于Amplify Auth模块获取完整属性
当前代码中Authenticator提供的user对象可能仅包含基础信息,手动调用Auth接口可获取完整用户属性,修改代码如下:
import React, { useEffect, useState } from 'react'; import { Amplify } from 'aws-amplify'; import { Auth } from 'aws-amplify/auth'; // 正确导入Auth import awsmobile from './aws-exports'; import { withAuthenticator, Authenticator } from '@aws-amplify/ui-react'; import '@aws-amplify/ui-react/styles.css'; Amplify.configure(awsmobile); function App() { const [userAttrs, setUserAttrs] = useState(null); useEffect(() => { const getFullUserAttrs = async () => { try { const currentUser = await Auth.currentAuthenticatedUser(); const attrs = await Auth.userAttributes(currentUser); setUserAttrs(attrs); } catch (err) { console.error('获取用户属性失败:', err); } }; getFullUserAttrs(); }, []); return ( <Authenticator> {({ signOut, user }) => ( <div className="App"> <p>Hey {user.username}, welcome to my channel, with auth!</p> {userAttrs ? ( <> <h2>邮箱:{userAttrs.email || '未设置'}</h2> <h2>手机号:{userAttrs.phone_number || '未设置'}</h2> </> ) : ( <h2>加载用户属性中...</h2> )} <button onClick={signOut}>Sign Out</button> </div> )} </Authenticator> ); } export default withAuthenticator(App);
方案2:检查Cognito用户池配置(必做)
确保用户池配置满足以下条件,否则即使代码正确也无法获取属性:
- 在用户池属性中,启用邮箱、手机号作为可选/必填属性
- 在应用客户端设置的OAuth范围中,勾选
email、phone_number - 用户注册时已填写并验证邮箱/手机号(若开启验证要求)
三、替代模块/库
如果不想依赖Amplify Auth,可直接用AWS SDK v3调用Cognito原生API:
- 安装依赖:
npm install @aws-sdk/client-cognito-identity-provider
- 调用示例:
import { CognitoIdentityProviderClient, GetUserCommand } from '@aws-sdk/client-cognito-identity-provider'; import { Auth } from 'aws-amplify/auth'; const fetchUserAttrsWithSDK = async () => { try { const currentUser = await Auth.currentAuthenticatedUser(); const client = new CognitoIdentityProviderClient({ region: awsmobile.aws_cognito_region }); const command = new GetUserCommand({ AccessToken: currentUser.signInUserSession.accessToken.jwtToken }); const res = await client.send(command); // 格式化属性为键值对 const attrs = res.UserAttributes.reduce((acc, item) => { acc[item.Name] = item.Value; return acc; }, {}); return attrs; } catch (err) { console.error('获取属性失败:', err); } };
内容的提问来源于stack exchange,提问作者Romeo Joseph
相关产品推荐
相关产品推荐

