TypeORM Adapter
리소스
설정
설치
npm install @auth/typeorm-adapter typeorm
환경 변수
AUTH_TYPEORM_CONNECTION=postgres://postgres:adminadmin@0.0.0.0:5432/db
설정
./auth.ts
import NextAuth from "next-auth"
import { TypeORMAdapter } from "@auth/typeorm-adapter"
export const { handlers, auth, signIn, signOut } = NextAuth({
adapter: TypeORMAdapter(process.env.AUTH_TYPEORM_CONNECTION),
})
TypeORMAdapter
는 첫 번째 매개변수로 연결 문자열 또는 ConnectionOptions
객체를 받습니다.
Advanced usage
커스텀 모델
TypeORM 어댑터는 데이터의 구조를 정의하기 위해 Entity
클래스를 사용합니다.
기본 엔티티를 재정의하고 추가 필드를 포함한 커스텀 엔티티 파일을 만들 수 있습니다.
- 수정된 엔티티를 포함하는 파일을 생성하세요:
lib/entities.ts
import {
Entity,
PrimaryGeneratedColumn,
Column,
ManyToOne,
OneToMany,
ValueTransformer,
} from "typeorm"
const transformer: Record<"date" | "bigint", ValueTransformer> = {
date: {
from: (date: string | null) => date && new Date(parseInt(date, 10)),
to: (date?: Date) => date?.valueOf().toString(),
},
bigint: {
from: (bigInt: string | null) => bigInt && parseInt(bigInt, 10),
to: (bigInt?: number) => bigInt?.toString(),
},
}
@Entity({ name: "users" })
export class UserEntity {
@PrimaryGeneratedColumn("uuid")
id!: string
@Column({ type: "varchar", nullable: true })
name!: string | null
@Column({ type: "varchar", nullable: true, unique: true })
email!: string | null
@Column({ type: "varchar", nullable: true, transformer: transformer.date })
emailVerified!: string | null
@Column({ type: "varchar", nullable: true })
image!: string | null
+ @Column({ type: "varchar", nullable: true })
+ role!: string | null
@OneToMany(() => SessionEntity, (session) => session.userId)
sessions!: SessionEntity[]
@OneToMany(() => AccountEntity, (account) => account.userId)
accounts!: AccountEntity[]
}
@Entity({ name: "accounts" })
export class AccountEntity {
@PrimaryGeneratedColumn("uuid")
id!: string
@Column({ type: "uuid" })
userId!: string
@Column()
type!: string
@Column()
provider!: string
@Column()
providerAccountId!: string
@Column({ type: "varchar", nullable: true })
refresh_token!: string | null
@Column({ type: "varchar", nullable: true })
access_token!: string | null
@Column({
nullable: true,
type: "bigint",
transformer: transformer.bigint,
})
expires_at!: number | null
@Column({ type: "varchar", nullable: true })
token_type!: string | null
@Column({ type: "varchar", nullable: true })
scope!: string | null
@Column({ type: "varchar", nullable: true })
id_token!: string | null
@Column({ type: "varchar", nullable: true })
session_state!: string | null
@Column({ type: "varchar", nullable: true })
oauth_token_secret!: string | null
@Column({ type: "varchar", nullable: true })
oauth_token!: string | null
@ManyToOne(() => UserEntity, (user) => user.accounts, {
createForeignKeyConstraints: true,
})
user!: UserEntity
}
@Entity({ name: "sessions" })
export class SessionEntity {
@PrimaryGeneratedColumn("uuid")
id!: string
@Column({ unique: true })
sessionToken!: string
@Column({ type: "uuid" })
userId!: string
@Column({ transformer: transformer.date })
expires!: string
@ManyToOne(() => UserEntity, (user) => user.sessions)
user!: UserEntity
}
@Entity({ name: "verification_tokens" })
export class VerificationTokenEntity {
@PrimaryGeneratedColumn("uuid")
id!: string
@Column()
token!: string
@Column()
identifier!: string
@Column({ transformer: transformer.date })
expires!: string
}
TypeORMAdapter
에 전달하세요:
./auth.ts
import NextAuth from "next-auth"
import { TypeORMAdapter } from "@auth/typeorm-adapter"
import * as entities from "lib/entities"
export const { handlers, auth, signIn, signOut } = NextAuth({
adapter: TypeORMAdapter("yourconnectionstring", { entities }),
})
TypeORM의 synchronize: true
옵션은 엔티티와 정확히 일치하는 SQL을
생성합니다. 이 옵션은 엔티티 모델에서 발견된 변경 사항을 자동으로 적용합니다.
개발 환경에서 유용한 옵션입니다.
⚠️
synchronize: true
는 프로덕션 데이터베이스에 대해 활성화하지 마세요. 구성된
스키마가 예상 스키마와 일치하지 않으면 데이터 손실이 발생할 수 있습니다!
프로덕션 데이터베이스는 빌드 시점에 동기화/마이그레이션하는 것을 권장합니다.
네이밍 컨벤션
만약 여러분이 사용하는 데이터베이스 시스템에서 snake_case
와 camelCase
컬럼 이름이 혼용되는 것이 문제가 된다면, TypeORM의 네이밍 전략 기능을 사용하여 대상 필드 이름을 변경하는 것을 추천합니다. typeorm-naming-strategies
라는 패키지가 있는데, 여기에는 snake_case
전략이 포함되어 있습니다. 이 전략은 Auth.js가 기대하는 필드 이름을 실제 데이터베이스에서 snake_case
로 변환해 줍니다.
예를 들어, NextAuth 설정에서 연결 객체에 네이밍 컨벤션 옵션을 추가할 수 있습니다.
./auth.ts
import NextAuth from "next-auth"
import { TypeORMAdapter } from "@auth/typeorm-adapter"
import { SnakeNamingStrategy } from "typeorm-naming-strategies"
import { ConnectionOptions } from "typeorm"
const connection: ConnectionOptions = {
type: "mysql",
host: "localhost",
port: 3306,
username: "test",
password: "test",
database: "test",
namingStrategy: new SnakeNamingStrategy(),
}
export const { handlers, auth, signIn, signOut } = NextAuth({
adapter: TypeORMAdapter(connection),
})