콘텐츠로 이동

인증

인증은 https://haneoka.org/api/auth에 있습니다. 워커는 아래의 지원되는 Better Auth 라우트에 처리를 넘기고, /api/v1/account/register에 Haneoka 자체 이메일 가입 흐름을 더합니다.

GET /api/v1/account/config

예:

{
"available": true,
"emailDeliveryEnabled": true,
"emailSignUpEnabled": true,
"providers": ["github", "google"],
"turnstileSiteKey": "public-site-key-or-null"
}

providers는 설정된 소셜 프로바이더 ID 목록입니다. 시크릿, 클라이언트 시크릿, 인증 키, Turnstile 시크릿 키는 이 응답에 절대 들어가지 않습니다.

POST /api/v1/account/register
Content-Type: application/json
X-Captcha-Response: <turnstile-token-when-enabled>
{ "email": "person@example.test" }

이 라우트는 같은 출처 전용이며 이메일 필드만 받습니다. 성공하면 202를 반환합니다.

{ "accepted": true }

기존 주소든 새 주소든 응답은 같습니다. Turnstile이 켜져 있으면 브라우저 챌린지 토큰을 X-Captcha-Response로 보내세요. 사이트 키는 설정 엔드포인트에서 얻습니다.

세션과 이메일·비밀번호 라우트

섹션 제목: “세션과 이메일·비밀번호 라우트”

/api/auth 아래에서 다음 라우트를 지원합니다.

메서드경로인증용도
GET, HEAD/api/auth/get-session익명현재 세션을 읽는다. 쿠키가 없으면 익명의 정상 결과.
POST/api/auth/sign-in/email익명이메일과 비밀번호로 로그인한다.
POST/api/auth/sign-in/social익명설정된 소셜 로그인을 시작한다.
POST/api/auth/sign-out쿠키현재 세션을 끝낸다.
POST/api/auth/send-verification-email쿠키이메일 발송이 켜져 있으면 인증 메일을 요청한다.
GET/api/auth/verify-email토큰이메일 인증 링크를 사용한다.
POST/api/auth/request-password-reset익명재설정 메일을 요청한다.
POST/api/auth/reset-password토큰본문이나 쿼리의 재설정 토큰으로 새 비밀번호를 정한다.
GET/api/auth/reset-password/{token}토큰비밀번호 재설정 이어하기 링크를 연다. 세션 쿠키는 필요 없다.
POST/api/auth/change-email쿠키이메일 변경을 요청한다.
POST/api/auth/change-password쿠키현재 비밀번호를 바꾼다.
GET/api/auth/list-accounts쿠키연결된 계정을 나열한다.
POST/api/auth/link-social쿠키설정된 소셜 계정을 연결한다.
POST/api/auth/unlink-account쿠키계정 정책에 따라 연결을 해제한다.
GET/api/auth/list-sessions쿠키활성 세션을 나열한다.
POST/api/auth/revoke-session쿠키세션 하나를 무효화한다.
POST/api/auth/revoke-sessions쿠키Better Auth 페이로드에 따라 선택한 세션이나 모든 세션을 무효화한다.
POST/api/auth/revoke-other-sessions쿠키현재 세션 외의 세션을 무효화한다.
GET, POST/api/auth/callback/{provider}OAuth설정된 프로바이더 콜백을 완료한다.
GET/api/auth/error익명인증 오류 응답을 표시한다.
GET/api/auth/ok익명Better Auth의 상태 확인 응답.

프로바이더 콜백은 discord, github, google, twitter 중 설정된 것만 받습니다. providers에 없는 프로바이더는 현재 배포에서 지원하는 라우트가 아닙니다.

계정을 바꿀 때는 credentials: "include"를 쓰고 같은 출처로 보내세요.

const response = await fetch("/api/auth/get-session", {
credentials: "include",
headers: { Accept: "application/json" },
});

인증 응답은 Cache-Control: no-store입니다. 세션 JSON을 캐시하거나, 쿠키를 로그에 복사하거나, 클라이언트 시크릿을 프런트엔드 코드에 두지 마세요.

워커에 데이터베이스나 32자 인증 시크릿이 없으면 인증 라우트는 503 auth_not_configured를 반환합니다. 이메일 전용 라우트는 발송이 설정되지 않았으면 503을 반환합니다. 가입은 잘못된 이메일이나 본문에 400, 교차 출처나 검증 실패에 403, 너무 큰 본문에 413, JSON이 아닌 본문에 415, 속도 제한 시 Retry-After: 60과 함께 429를 반환할 수 있습니다.

Better Auth는 프로바이더별 요청·응답 필드가 바뀔 수 있습니다. 고른 작업에는 Better Auth 라우트에서 문서화한 페이로드를 쓰고, 추가 응답 필드는 선택 항목으로 다루세요. Haneoka 워커 계약이 보장하는 것은 위 라우트의 제공과 쿠키·같은 출처 동작입니다.