使用 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();
我有一个 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();