One-Time Token 플러그인

One-Time Token (OTT) 플러그인은 안전한 일회용 세션 토큰을 생성하고 검증하는 기능을 제공합니다. 이는 일반적으로 도메인 간 인증에 사용됩니다.

설치

auth 구성에 플러그인 추가

One-Time Token 플러그인을 사용하려면 auth 구성에 추가합니다.

auth.ts
import { betterAuth } from "better-auth";
import { oneTimeToken } from "better-auth/plugins/one-time-token";

export const auth = betterAuth({
    plugins: [
      oneTimeToken()
    ]
    // ... 기타 auth 구성
});

클라이언트 플러그인 추가

다음으로, 인증 클라이언트 인스턴스에 one-time-token 클라이언트 플러그인을 포함합니다.

auth-client.ts
import { createAuthClient } from "better-auth/client"
import { oneTimeTokenClient } from "better-auth/client/plugins"

export const authClient = createAuthClient({
    plugins: [
        oneTimeTokenClient()
    ]
})

사용법

1. 토큰 생성

auth.api.generateOneTimeToken 또는 authClient.oneTimeToken.generate를 사용하여 토큰을 생성합니다.

GET
/one-time-token/generate
const { data, error } = await authClient.oneTimeToken.generate();

이렇게 하면 현재 세션에 연결된 token이 반환되며, 일회용 토큰을 검증하는 데 사용할 수 있습니다. 기본적으로 토큰은 3분 후에 만료됩니다.

2. 토큰 검증

사용자가 링크를 클릭하거나 토큰을 제출하면 다른 API 라우트에서 auth.api.verifyOneTimeToken 또는 authClient.oneTimeToken.verify 메서드를 사용하여 토큰을 검증합니다.

POST
/one-time-token/verify
const { data, error } = await authClient.oneTimeToken.verify({    token: "some-token", // required});
PropDescriptionType
token
검증할 토큰입니다.
string

이렇게 하면 토큰에 연결된 세션이 반환됩니다.

옵션

oneTimeToken 플러그인을 추가할 때 다음 옵션을 구성할 수 있습니다:

  • disableClientRequest (boolean): 선택 사항. true인 경우 토큰은 서버 측에서만 생성됩니다. 기본값: false.
  • expiresIn (number): 선택 사항. 토큰이 유효한 기간(분)입니다. 기본값: 3.
oneTimeToken({
    expiresIn: 10 // 10분
})
  • generateToken: session 객체와 ctx를 매개변수로 받는 사용자 정의 토큰 생성기 함수입니다.

  • storeToken: 선택 사항. 이 옵션을 사용하면 토큰이 데이터베이스에 저장되는 방식을 구성할 수 있습니다.

    • plain: 토큰이 일반 텍스트로 저장됩니다. (기본값)
    • hashed: 토큰이 기본 hasher를 사용하여 해시됩니다.
    • custom-hasher: 토큰을 받아 해시된 토큰을 반환하는 사용자 정의 hasher 함수입니다.

참고: 전송되는 토큰에는 영향을 미치지 않으며, 데이터베이스에 저장된 토큰에만 영향을 미칩니다.

예제:

해싱 없음 (기본값)
oneTimeToken({
    storeToken: "plain"
})
내장 hasher
oneTimeToken({
    storeToken: "hashed"
})
사용자 정의 hasher
oneTimeToken({
    storeToken: {
        type: "custom-hasher",
        hash: async (token) => {
            return myCustomHasher(token);
        }
    }
})

On this page