我有一个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;
注意,不需要第一个箭头函数。