使用Google Cloud Secret Manager获取AUTH0_CLIENT_SECRET并与nextjs-a



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

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

我想使用谷歌云秘密管理器在运行时获得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();

经过一番努力,我发现了问题所在。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();

在你的回答中张贴的代码:

const clientSecret = await getSecret("AUTH0_CLIENT_SECRET");

你已经在等待secret返回:你的代码将挂起在那一行,直到getSecret结束。因此,当使用initAuth0函数时,secret应该准备好了。

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

export default asyncHandleAuth();

但我认为应该改为:

export default asyncHandleAuth;

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

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;

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

最新更新