部署
环境变量
为了保持一致性,我们建议所有 Auth.js 环境变量都以 AUTH_
为前缀。这样可以让我们更好地自动检测它们,并且它们也更容易与其他环境变量区分开来。
Auth.js 库要求您设置一个 AUTH_SECRET
环境变量。这用于加密 cookie 和令牌。它应该是一个至少 32 个字符的加密安全随机字符串
npm exec auth secret
如果您正在使用 OAuth 提供商,您的提供商会为您提供一个 **客户端 ID** 和 **客户端密钥**,您需要将它们也设置为环境变量(在使用 OIDC 提供商(如 Auth0)的情况下,可能还需要第三个 issuer
值,请参考提供商的特定文档)。
Auth.js 支持 **环境变量推断**,这意味着如果您按照特定语法命名提供商环境变量,您就不需要在配置中明确传递它们。
客户端 ID 和客户端密钥应该分别命名为 AUTH_[PROVIDER]_ID
和 AUTH_[PROVIDER]_SECRET
。如果您的提供商需要一个发行者,则应将其命名为 AUTH_[PROVIDER]_ISSUER
。例如
AUTH_OKTA_ID=abc
AUTH_OKTA_SECRET=abc
AUTH_OKTA_ISSUER=abc
有关更多信息,请查看我们的 环境变量 页面。
AUTH_SECRET
这是唯一严格要求的环境变量。它是用于对 JWT 进行编码并在传输过程中加密内容的密钥。如上所述,我们建议至少使用 32 个字符的随机字符串。这可以通过 CLI 使用 npm exec auth secret
或通过 openssl 使用 openssl rand -base64 33
生成。
AUTH_TRUST_HOST
当您在反向代理后面部署应用程序时,您需要将 AUTH_TRUST_HOST
设置为 true
。这告诉 Auth.js 信任反向代理的 X-Forwarded-Host
标头。如果我们检测到表明您的应用程序正在支持的托管提供商之一上运行的环境变量,Auth.js 将自动推断为 true。目前支持 VERCEL
和 CF_PAGES
(Cloudflare Pages)。
AUTH_URL
这个环境变量在 v5 中基本不需要,因为主机是从请求头中推断出来的。但是,如果您正在使用不同的基本路径,您也可以设置此环境变量。例如,AUTH_URL=https://127.0.0.1:3000/web/auth
或 AUTH_URL=https://company.com/app1/auth
AUTH_REDIRECT_PROXY_URL
此环境变量专为高级用例设计,例如在将 Auth.js 用作预览部署的代理时。有关更多详细信息,请参阅下面的 保护预览部署 部分。
无服务器
- 创建所需 环境变量,以用于您所需的环境。别忘了也添加所需的环境变量,以用于您选择的提供商(例如,OAuth
clientId
/clientSecret
等)。 - 在使用 OAuth 提供商时,请确保为您的生产 URL 正确设置回调 URL。许多 OAuth 提供商只允许您为每个 OAuth 应用程序设置一个
callbackUrl
。在这种情况下,您需要为每个环境(开发、生产等)创建单独的应用程序。其他提供商,如 Google,允许您为一个应用程序添加多个callbackUrl
。- 默认情况下,
next-auth
(Next.js)应用程序的 callbackUrl 应类似于以下内容:https://company.com/api/auth/callback/[provider]
(将company.com
替换为您的域名,将provider
替换为提供商名称,例如github
)。 - 所有其他框架(
@auth/sveltekit
、@auth/express
等),默认情况下,将使用路径/auth/callback/[provider]
。
- 默认情况下,
- 部署!设置了这两个先决条件后,您应该能够在 Netlify、Vercel 等上部署并运行您的 Auth.js 应用程序。
如果您将用户存储在 数据库 中,我们建议使用不同的 OAuth 应用程序进行开发/生产,以避免混合您的测试和生产用户群。
可观测性
要将您当前用户的详细信息传递到您的可观测性工具,您可以使用 Auth.js 提供的回调。例如,在 session
回调中,您可以将 user.id
传递到 Sentry。
import * as Sentry from "@sentry/browser"
import NextAuth from "next-auth"
export const { handlers, auth, signIn, signOut } = NextAuth({
callbacks: {
session({ session, user }) {
const scope = Sentry.getCurrentScope()
scope.setUser({
id: user.id,
email: user.email,
})
return session
},
},
})
自托管
Auth.js 也可以部署在您能够部署所选框架的任何地方。查看框架的文档以了解自托管。
Docker
在 Docker 环境中,请确保在您的 Auth.js 配置中设置 trustHost: true
或将 AUTH_TRUST_HOST
环境变量设置为 true
。
我们的示例应用程序也通过 Docker 托管 此处(查看 源代码)。以下是使用 Auth.js 的 Next.js 应用程序的示例 Dockerfile
。
# syntax=docker/dockerfile:1
# syntax=docker/dockerfile:1
FROM node:20-alpine AS base
# Install dependencies only when needed
FROM base AS deps
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
RUN apk add --no-cache libc6-compat
WORKDIR /app
# Install dependencies
COPY package.json pnpm-lock.yaml* ./
RUN corepack enable pnpm && pnpm i --frozen-lockfile
# Rebuild the source code only when needed
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
# Next.js collects completely anonymous telemetry data about general usage.
# Learn more here: https://nextjs.net.cn/telemetry
# Uncomment the following line in case you want to disable telemetry during the build.
# ENV NEXT_TELEMETRY_DISABLED 1
RUN corepack enable pnpm && pnpm build
# Production image, copy all the files and run next
FROM base AS runner
WORKDIR /app
ENV NODE_ENV production
# Uncomment the following line in case you want to disable telemetry during runtime.
# ENV NEXT_TELEMETRY_DISABLED 1
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
# Set the correct permission for prerender cache
RUN mkdir .next
RUN chown nextjs:nodejs .next
# Automatically leverage output traces to reduce image size
# https://nextjs.net.cn/docs/advanced-features/output-file-tracing
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
ENV PORT 3000
ENV HOSTNAME "0.0.0.0"
# server.js is created by next build from the standalone output
# https://nextjs.net.cn/docs/pages/api-reference/next-config-js/output
CMD ["node", "server.js"]
保护预览部署
大多数 OAuth 提供商无法配置多个回调 URL 或使用通配符。
但是,Auth.js **支持预览部署**,即使 **使用 OAuth 提供者**。其理念是使用一个代理身份验证请求到主应用程序动态 URL 的部署。因此,您可以拥有一个稳定的部署,例如在 auth.company.com
,您可以在其中指向所有 OAuth 提供者的 callbackUrl
,然后此应用程序将在身份验证成功后将用户重定向回预览部署 URL,例如 https://git-abc123-myapp.vercel.app
。请按照以下步骤开始使用 Auth.js 来保护预览部署。
- 确定一个稳定的部署 URL。例如,一个 URL 在构建之间不会更改的部署,例如。
auth.yourdomain.com
(使用子域不是必需的,这也可以是主网站的 URL,例如。) - 在预览环境和稳定环境中,将
AUTH_REDIRECT_PROXY_URL
设置为该稳定的部署 URL,包括 Auth.js 处理路由的路径。例如:(https://auth.yourdomain.com/api/auth
) - 更新 OAuth 提供者配置中的
callbackUrl
以使用稳定的部署 URL。例如,对于 GitHub,它将是https://auth.yourdomain.com/api/auth/callback/github
。
有趣的事实:我们所有的示例应用程序都在使用代理功能!
为了支持预览部署,AUTH_SECRET
值需要对稳定部署和需要 OAuth 支持的部署相同。
这是如何工作的?
为了支持预览部署,Auth.js 需要一个在部署中稳定的部署 URL 作为重定向代理服务器。
它将重定向 OAuth 回调请求到预览部署 URL,但仅当 AUTH_REDIRECT_PROXY_URL
环境变量设置时。
当用户在预览部署中启动 OAuth 登录流程时,我们将它的 URL 保存在 state
查询参数中,但将 redirect_uri
设置为稳定部署。
然后,OAuth 提供者会将用户重定向到上面提到的稳定 URL,该 URL 会验证 state
参数,如果 state
有效,则将用户重定向回预览部署 URL。这是通过依靠稳定部署和预览部署的同一服务器端 AUTH_SECRET
来保障的。