Wener Notes

NextAuth

约 2 分钟阅读
标签:认证授权
  • nextauthjs/next-authGitHubnextauthjs/next-authnextauthjs/next-auth · ISC, TS · NextAuth -> Auth.js · 回调 · Provider · Gitlab · 回调要完整,127.0.0.1 要额外加 · 可以配置多个回调 · Github笔记:NextAuth
    • ISC, TS
    • NextAuth -> Auth.js
  • 回调 /api/auth/callback/<NAME>
  • Provider
    • Gitlab
      • 回调要完整,127.0.0.1 要额外加
      • 可以配置多个回调
    • Github
      • 回调配前缀,默认支持 127.0.0.1
      • 只能配置一个回调
envfor
NEXTAUTH_URL
NEXTAUTH_SECRET生产环境必须
NEXTAUTH_URL_INTERNAL默认 NEXTAUTH_URL
  • AUTH_TRUST_HOST || VERCEL
    • 用于 detectHost
TypeScript
// 内部全局上下文
const __NEXTAUTH: NextAuthClientConfig = {
  baseUrl: parseUrl(process.env.NEXTAUTH_URL ?? process.env.VERCEL_URL).origin,
  basePath: parseUrl(process.env.NEXTAUTH_URL).path,
  baseUrlServer: parseUrl(process.env.NEXTAUTH_URL_INTERNAL ?? process.env.NEXTAUTH_URL ?? process.env.VERCEL_URL)
    .origin,
  basePathServer: parseUrl(process.env.NEXTAUTH_URL_INTERNAL ?? process.env.NEXTAUTH_URL).path,
  _lastSync: 0,
  _session: undefined,
  _getSession: () => {},
};

// profile 转 account 逻辑
const getProfile = {
  profile,
  account: {
    provider: provider.id,
    type: provider.type,
    providerAccountId: profile.id.toString(),
    ...tokens,
  },
  OAuthProfile: profile,
};

export const defaultCallbacks: CallbacksOptions = {
  signIn() {
    // 是否允许登录
    // 可以返回 字符串做 redirect
    return true;
  },
  redirect({ url, baseUrl }) {
    if (url.startsWith('/')) return `${baseUrl}${url}`;
    else if (new URL(url).origin === baseUrl) return url;
    return baseUrl;
  },
  session({ session }) {
    return session;
  },
  // jwt session
  jwt({ token }) {
    return token;
  },
};
  • callbacks - next-auth.js.org/configuration/callbacks
    • signIn - 可以拒绝用户登录
    • redirect - 构造跳转 URL
    • jwt
      • 触发 /api/auth/signin, /api/auth/session, getSession(), getServerSession(), useSession()
      • 第一次创建时有的参数 user, account, profile, isNewUser
      • 之后都只有 token
      • token 基础属性 - name, email, sub, iat, exp, jti
    • session
      • 触发 getSession(), useSession(), /api/auth/session
  • tokens
    • 包含 access_token
  • createState - state
    • maxAge: 900 - 15m
  • 会在 sessionMaxAge 更新 session 有效期
TypeScript
import { generators } from 'openid-client';
// 生成 state
const state = generators.state();

数据模型

  • User -1-*-> Account
  • User -1-*-> Session
  • VerificationToken

Adapter

  • 登录
    • createUser
    • getUser
    • getUserByEmail
    • getUserByAccount
    • linkAccount
    • createSession
    • getSessionAndUser
    • updateSession
    • deleteSession
    • updateUser
  • 邮箱/无密码登录
    • createVerificationToken
    • useVerificationToken
  • 目前没用到
    • deleteUser
    • unlinkAccount

REST API

methodurlnote
GET/api/auth/signin内置登录页
GET/api/auth/signout内置登出页
POST/api/auth/signout退出登录 - CSRF
GET/api/auth/csrf获取 CSRF
GET/api/auth/session
GET/api/auth/providers
POST/api/auth/signin/
开始登录流程
GET/api/auth/callback/
OAuth 回调
POST/api/auth/callback/
账号密码登录 - CSRF

FAQ

刷新 JWT

CORS

  • HTTP Only
JavaScript
function getCookie(name) {
  const value = `; ${document.cookie}`;
  const parts = value.split(`; ${name}=`);
  if (parts.length === 2) return parts.pop().split(';').shift();
}
getCookie('next-auth.session-token');

关联信息

反向链接、本文链接的其他页面和外部资料。

反向链接

  • NextJS FAQ
    笔记 · next-auth

    https://github.com/vercel/next.js/blob/canary/packages/next/src/lib/server-external-packages.json · react router 会导致页面整个刷新 #49479

References

GitHub5 条
其他外链5 条
最近更新commit 5820d2aEdit

On this page