使用 Google Cloud Secret Manager 获取 AUTH0_CLIENT_SECRET 并与 nextjs-auth0 一起使用

Use Google Cloud Secret Manager to fetch AUTH0_CLIENT_SECRET and use with nextjs-auth0

我有一个 Next.js 应用程序,其中使用 Auth0 Next.js SDK 设置身份验证。

目前 AUTH0_CLIENT_SECRET 在部署时被设置为环境变量。

我想使用 Google Cloud Secret Manager 在运行时获取 AUTH0_CLIENT_SECRET 并使用 initAuth0 方法设置它。

我正在关注这个例子:https://github.com/auth0/nextjs-auth0/blob/main/EXAMPLES.md#create-your-own-instance-of-the-sdk

但是当我需要为调用方法 initAuth0({clientSecret...}) 准备好秘密并且我需要它来设置身份验证端点时,我无法弄清楚如何等待秘密管理器的响应auth0.handleAuth().

这是我的尝试:/pages/api/auth/[...auth].ts

import { initAuth0 } from "@auth0/nextjs-auth0";

const asyncHandleAuth = async () => {
  const clientSecret = await getSecret("AUTH0_CLIENT_SECRET");

  const auth0 = initAuth0({ 
    clientSecret // The rest of the config is set with environment variables
  }); 

  return auth0.handleAuth();
};

export default asyncHandleAuth();

在您在答案中发布的代码中:

const clientSecret = await getSecret("AUTH0_CLIENT_SECRET");

您已经在等待秘密返回:您的代码将在该行暂停,直到 getSecret 结束。因此,当使用 initAuth0 函数时,secret 应该准备就绪。

也许,根据您的意见,问题可能是由您的导出引起的。您正在像这样导出 asyncHandleAuth 函数:

export default asyncHandleAuth();

但我认为应该改为:

export default asyncHandleAuth;

您的回答非常有道理:实际问题是您需要向处理函数提供适当的参数、请求和响应表示以执行实际调用。但是请注意,建议的 export default 仍然有效,在您的代码中,您正在执行一个 returns 正在导出的 thing 的函数。也许你可以像这样简化它:

import { initAuth0 } from "@auth0/nextjs-auth0";

const asyncHandleAuth = async (req: NextApiRequest, res: NextApiResponse) => {
  const clientSecret = await getSecret("AUTH0_CLIENT_SECRET");

  const auth0 = initAuth0({ 
    clientSecret // The rest of the config is set with environment variables
  }); 

  return auth0.handleAuth()(req, res);
};

export default asyncHandleAuth;

注意不需要第一个箭头函数。

经过一番摸索,我发现了问题所在。 Next.js 期望导出默认函数的类型为 NextApiHandler,但我返回的是 Promise<NextApiHandler>。 我通过将它包装在另一个函数中来解决它,该函数接受请求和响应参数并在返回之前使用它们调用 handleAuth。

这对我有用:

const asyncHandleAuth =
  () => async (req: NextApiRequest, res: NextApiResponse) => {
    const clientSecret = await getSecret("AUTH0_CLIENT_SECRET");

    const auth0 = initAuth0({
      clientSecret, // The rest of the config is set with environment variables
    });
    
    return auth0.handleAuth()(req, res);
  };

export default asyncHandleAuth();