AWS Amplify v6 Vue项目无法导入Auth对象及获取OAuth令牌问题
我正在使用VueJS构建AWS Amplify应用,执行以下命令添加并部署认证模块:
amplify add auth amplify push amplify env pull dev
通过导入@aws-amplify/ui-vue中的<Authenticator>组件实现了认证功能,代码如下:
import { Authenticator } from "@aws-amplify/ui-vue"; <authenticator> <template v-slot="{ user, signOut }"> ...
为调用其他服务需获取OAuth用户令牌,我记得曾有Auth对象可提供用户详情获取方法,但按指南导入时:
import { Auth } from 'aws-amplify';
应用无法正常显示,浏览器抛出异常:
App.vue:4 Uncaught SyntaxError: The requested module '/node_modules/.vite/deps/aws-amplify.js?v=ec6e723f' does not provide an export named 'Auth' (at App.vue:4:10)
我的环境版本:amplify --version: 12.8.2,"aws-amplify": "^6.0.5"。我尝试用以下代码获取access_token,但不确定是否为最优方案:
import { fetchAuthSession } from 'aws-amplify/auth'; onMounted( async() => { try { console.log("AUTH: "+ JSON.stringify(await fetchAuthSession() )); } catch(err) { console.error(err); } })
请问如何正确获取Auth对象或OAuth令牌?
1. 关于Auth导入失败的原因
AWS Amplify v6采用模块化导入设计,不再提供全局Auth对象,所有认证相关API需从aws-amplify/auth单独导入,这是v6的核心变更之一。
2. 正确获取OAuth令牌的方式
你使用的fetchAuthSession就是v6中获取认证会话(包含令牌)的标准最优方案,可直接从返回结果提取所需令牌:
import { fetchAuthSession } from 'aws-amplify/auth'; onMounted(async () => { try { const session = await fetchAuthSession(); // 获取access token const accessToken = session.tokens?.accessToken?.toString(); // 若需要id token可提取 const idToken = session.tokens?.idToken?.toString(); console.log('Access Token:', accessToken); } catch (err) { console.error('获取会话失败:', err); } });
3. 原Auth对象常用功能的替代方案
如果需要v5中Auth对象的其他功能,可使用对应的模块化API:
- 获取当前用户:
import { getCurrentUser } from 'aws-amplify/auth'; - 登出操作:
import { signOut } from 'aws-amplify/auth'; - 强制刷新会话:
await fetchAuthSession({ forceRefresh: true });
4. 结合<Authenticator>组件使用
在组件插槽中可通过user对象获取基础用户信息,但令牌仍需调用fetchAuthSession获取:
<authenticator> <template v-slot="{ user, signOut }"> <button @click="getToken">获取令牌</button> </template> </authenticator> <script setup> import { Authenticator } from "@aws-amplify/ui-vue"; import { fetchAuthSession } from 'aws-amplify/auth'; const getToken = async () => { const session = await fetchAuthSession(); console.log(session.tokens?.accessToken?.toString()); }; </script>
内容的提问来源于stack exchange,提问作者gusto2

