Nextjs Auth0 在 getServerSideProps 中获取数据

Posted

技术标签:

【中文标题】Nextjs Auth0 在 getServerSideProps 中获取数据【英文标题】:Nextjs Auth0 get data in getServerSideProps 【发布时间】:2021-09-04 10:22:11 【问题描述】:

我正在使用 Auth0 对用户进行身份验证。

我像这样受保护的 api 路由:

// pages/api/secret.js

import  withApiAuthRequired, getSession  from '@auth0/nextjs-auth0';

export default withApiAuthRequired(function ProtectedRoute(req, res) 
  const session = getSession(req, res);
  const data =  test: 'test' ;
  res.json( data );
);

我的问题是当我尝试从 getServerSideProps 获取数据时,我收到 401 错误代码。

如果我使用 useEffect 我可以从 api 路由获取数据。

我正在尝试这样获取数据:

export const getServerSideProps = withPageAuthRequired(
  async getServerSideProps(ctx) 
    const res = await fetch('http://localhost:3000/api/secret');
    const data = await res.json();

    return  props:  data  ;
  ,
);

我收到以下回复: 错误:“not_authenticated”,描述:“用户没有活动会话或未通过身份验证”

有什么想法吗?谢谢!!

【问题讨论】:

您应该直接在getServerSideProps 中使用您的API 路由中的逻辑,而不是从您的内部API 中获取。有关详细信息,请参阅Internal API fetch with getServerSideProps? (Next.js)。 我明白了。我会查一下!非常感谢! 【参考方案1】:

当您从 getServerSideProps 受保护的 API 端点调用时,您并未将任何用户的上下文(例如 Cookies)传递给请求,因此,您未通过身份验证。

当您从useEffect 调用时,它会在您的浏览器中运行,它将所有 cookie 附加到请求中,其中之一是会话 cookie。

您需要将传递给getServerSideProps(由浏览器)的会话cookie 转发给API 调用。

export const getServerSideProps = withPageAuthRequired(
  async getServerSideProps(ctx) 
    const res = await fetch('http://localhost:3000/api/secret', 
      headers:  Cookie: ctx.req.headers.cookie ,
// ---------------------------^ this req is the browser request to the getServersideProps
    );
    const data = await res.json();

    return  props:  data  ;
  ,
);

对于more info。

【讨论】:

非常感谢您的回答!你可以想象我不是专业人士。我通过互联网学习。我添加了这一行,现在我开始了:TypeError: ctx.req.getHeader is not a function 我将其更改为 ctx.req.headers.cookie,现在它可以工作了!非常感谢!

以上是关于Nextjs Auth0 在 getServerSideProps 中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在附加 API 服务 Auth0 中获取访问令牌?

NEXT JS 使用 Auth0 运行时错误,一秒钟后消失

在 auth0 中获取 accessToken

将参数传递到 Auth0 注册

如何在 getServerSideProps 中获取 Auth0 用户对象?

Next.js withPageAuthRequired 和 getStaticProps