配置AWS Cognito后获取用户邮箱属性提示权限范围错误求助
问题:React结合AWS Amplify获取用户邮箱时提示「Access Token does not have required scopes」
登录成功后调用fetchUserAttributes()获取用户邮箱属性,抛出错误:
"Error fetching user attributes NotAuthorizedException: Access Token does not have required scopes"
已在AWS Amplify配置和Cognito应用客户端侧设置了openid和email权限范围,但问题依旧。
相关代码
React组件代码
import { useState, useEffect } from "react"; import { fetchUserAttributes } from "aws-amplify/auth"; import { useNavigate } from "react-router-dom"; function App(props) { const [email, setEmail] = useState(""); const [userGroups, setUserGroups] = useState([]); const navigate = useNavigate(); useEffect(() => { fetchUserAttributes() .then((userAttrs) => { setEmail(userAttrs.email || ""); }) .catch((error) => { console.error("Error fetching user attributes", error); }); }, [navigate]); return ( <> <p>Hello {email}</p> <p> You can <button onClick={props.signOut}>logout</button> </p> </> ); } export default App;
Amplify配置代码
// Configure AWS Amplify Amplify.configure({ Auth: { Cognito: { loginWith: { oauth: { redirectSignIn: ["http://localhost:5173"], redirectSignOut: ["http://localhost:5173"], domain: "us-east-domain", providers: ["Google"], scopes: ["openid", "email"], responseType: "code", }, }, userPoolId: "userpoolid", userPoolClientId: "userpoolclientid", }, }, });
解决步骤
补全Cognito应用客户端的OAuth权限范围
进入AWS控制台的Cognito用户池,找到对应应用客户端:- 确认「允许的OAuth范围」除了
openid、email,必须勾选aws.cognito.signin.user.admin——这个权限是调用fetchUserAttributes获取用户属性的核心权限,多数场景下是遗漏此权限导致的报错 - 确认「OAuth 2.0授权类型」勾选了
Authorization code grant(与配置中的responseType: "code"匹配)
- 确认「允许的OAuth范围」除了
更新Amplify配置的scopes
在现有scopes数组中添加aws.cognito.signin.user.admin,修改后的配置片段:Amplify.configure({ Auth: { Cognito: { loginWith: { oauth: { // 保留其他原有配置 scopes: ["openid", "email", "aws.cognito.signin.user.admin"], }, }, // 保留其他原有配置 }, }, });重置登录会话
旧的access token是基于旧权限生成的,必须执行以下操作:- 调用登出接口清除当前用户会话
- 清除浏览器本地存储(localStorage/sessionStorage)中Amplify相关的缓存数据
- 重新登录获取携带新权限的access token
验证Token权限
可以在浏览器控制台中执行以下代码,解码access token确认权限范围:import { Auth } from "aws-amplify"; Auth.currentSession().then(session => { const accessToken = session.getAccessToken(); console.log("当前Token权限范围:", accessToken.payload.scope); });输出结果需包含
email和aws.cognito.signin.user.admin确认第三方登录的属性映射
由于你使用Google作为登录提供商,需在Cognito用户池的「身份提供商」设置中,确认Google的属性映射规则已将Google的email字段正确映射到Cognito用户的email属性
内容的提问来源于stack exchange,提问作者user28587481
相关产品推荐
相关产品推荐

