コンテンツにスキップ

認証

認証は https://haneoka.org/api/auth にあります。Worker は下記の対応する 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 で送ってください。サイトキーは設定のエンドポイントから得られます。

セッションとメール・パスワードのルート

Section titled “セッションとメール・パスワードのルート”

/api/auth の下で次のルートに対応しています。

メソッドパス認証用途
GET, HEAD/api/auth/get-session匿名現在のセッションを読む。Cookie がなければ匿名の正常な結果。
POST/api/auth/sign-in/email匿名メールアドレスとパスワードでログインする。
POST/api/auth/sign-in/social匿名設定済みのソーシャルログインを始める。
POST/api/auth/sign-outCookie現在のセッションを終える。
POST/api/auth/send-verification-emailCookieメール配信が有効なとき、確認メールを要求する。
GET/api/auth/verify-emailトークンメール確認のリンクを使う。
POST/api/auth/request-password-reset匿名再設定メールを要求する。
POST/api/auth/reset-passwordトークン本文またはクエリの再設定トークンで新しいパスワードを設定する。
GET/api/auth/reset-password/{token}トークンパスワード再設定の続きのリンクを開く。セッションの Cookie は不要。
POST/api/auth/change-emailCookieメールアドレスの変更を要求する。
POST/api/auth/change-passwordCookie現在のパスワードを変更する。
GET/api/auth/list-accountsCookie連携済みのアカウントを一覧する。
POST/api/auth/link-socialCookie設定済みのソーシャルアカウントを連携する。
POST/api/auth/unlink-accountCookieアカウントのポリシーに従って連携を解除する。
GET/api/auth/list-sessionsCookie有効なセッションを一覧する。
POST/api/auth/revoke-sessionCookieセッションを 1 つ無効にする。
POST/api/auth/revoke-sessionsCookieBetter Auth のペイロードに従い、選んだ、またはすべてのセッションを無効にする。
POST/api/auth/revoke-other-sessionsCookie現在以外のセッションを無効にする。
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 をキャッシュしたり、Cookie をログにコピーしたり、クライアントシークレットをフロントエンドのコードに置いたりしないでください。

Worker にデータベースや 32 文字の認証シークレットがない場合、認証のルートは 503 auth_not_configured を返します。メールだけを使うルートは、配信が設定されていなければ 503 を返します。登録は、不正なメールアドレスや本文に 400、クロスオリジンや検証の失敗に 403、大きすぎる本文に 413、JSON でない本文に 415、レート制限時には Retry-After: 60 付きの 429 を返すことがあります。

Better Auth では、プロバイダー固有のリクエスト・レスポンスのフィールドが変わることがあります。選んだ操作には Better Auth のルートで文書化されたペイロードを使い、追加のレスポンスフィールドは任意として扱ってください。Haneoka の Worker の契約が保証するのは、上記のルートが利用できることと、Cookie と同一オリジンの挙動です。