【发布时间】:2021-09-17 11:00:26
【问题描述】:
我有一个 Next.js 应用程序,它使用 AWS Cognito 用户池进行身份验证。我有一个自定义 UI,并且在我的代码中使用 aws-amplify 包直接调用 signIn/signOut/etc...。 (我之前使用过 AWS 托管 UI,并且遇到了下面列出的相同问题 - 我希望切换并深入研究揭示我的问题的实际 API,但事实并非如此)
开发中的一切(在 localhost 上运行)都正常工作 - 我可以使用页面的渲染功能登录并访问我当前的会话
import { Auth } from 'aws-amplify';
...
export default const MyPage = (props) => {
useEffect(async () => {
const session = await Auth.currentSession();
...
}
...
}
在 SSR 期间
import { withSSRContext } from 'aws-amplify';
...
export async function getServerSideProps(context) {
...
const SSR = withSSRContext(context);
const session = await SSR.Auth.currentSession();
...
}
但是,当我部署到运行暂存环境的 AWS Amplify 时,在 SSR 期间获取当前会话的调用失败。这会导致页面呈现好像用户未登录,然后在客户端能够确定用户实际上已登录时切换。
当前假设 - 缺少 cookie(??):
我在登录过程中检查了浏览器中的 AWS cookie 设置是否正确。我也检查过,devtools 告诉我 cookie 正确地与请求一起发送到服务器。
但是,如果我在我的暂存环境中在getServerSideProps 中注销context.req.headers,则缺少 cookie 标头(而在我的开发环境中它显示正确)。如果这是真的,这将解释我所看到的 getServerSideProps 没有看到我的身份验证令牌等......但我看不出为什么 cookie 标头会被剥离?
以前有人见过这样的事情吗?这甚至可能吗?如果是这样,为什么会发生这种情况?我想我错过了一些东西,例如配置相关,但我觉得我已经非常密切地关注文档 - 我当前的 conf 看起来像这样
Amplify.configure({
Auth: {...}
ssr: true
});
Next.js 版本为11.1.2(最新)
非常感谢任何帮助!
【问题讨论】:
-
您好,您能解决上述问题吗?如果是,您能否阐明其背后的原因和原因?
-
恐怕还没有。目前,我已经解决了,因为我不需要搜索引擎对页面的认证版本进行索引,因此可以通过 SSR 提供未经认证的版本。然后我有客户端代码延迟页面的显示,直到验证状态被检查,以确保我们显示正确的版本,而不是显示未经身份验证的版本,然后快速轻弹到经过身份验证的版本。不理想,但目前可以使用,等待更多时间调查
-
嗯.. 感谢您的信息。
-
你在使用云端吗?
-
不,它只是一个基于存储在 CodeCommit 中的 git 存储库的 Amplify 应用程序。构建设置都是自动检测的,但添加了自定义域。所以可能尽可能接近香草设置。
标签: amazon-web-services authentication next.js aws-amplify