runlot
データ認証

env.auth.user

リクエストのログインユーザーを返します。ログインしていないリクエストには null を返します。

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const user = await env.auth.user(request);
    if (!user) return Response.redirect(new URL("/__runlot/auth/sign-in", request.url));
    return Response.json({ email: user.email });
  },
};
user() には必ずリクエストオブジェクトを渡してください。 セッション情報はリクエストのクッキーまたはヘッダーにあり、env の寿命はリクエストより長いためです。引数を省略すると env.auth.user(request): リクエストオブジェクトを渡してください というエラーになります。Next.js の @runlot/next ではアダプターが現在のリクエストを管理するため、引数なしで呼び出せる例外があります。

User

export interface User {
  id: string;                  // uuid
  email: string | null;
  emailVerified: boolean;
  name: string | null;
  avatarUrl: string | null;
  providers: string[];         // 例: ["password", "github"]
  createdAt: string;           // ISO 8601
  lastSignInAt: string | null;
}

idrunlot_auth.users の主キーです。あなたのテーブルでユーザー所有のデータを紐づけるときは、この値を使ってください。

create table posts (
  id       bigserial primary key,
  owner_id uuid not null,
  title    text not null
);
const user = await env.auth.user(request);
await env.db.exec("insert into posts (owner_id, title) values ($1, $2)", [user.id, title]);

ログアウト

if (url.pathname === "/logout") {
  return new Response(null, {
    status: 302,
    headers: { location: "/", ...(await env.auth.signOut(request)) },
  });
}

signOut はサーバー側のセッションを削除し、クッキーを空にするヘッダーオブジェクトを返します。ブラウザのフォームからは POST /__runlot/auth/sign-out にリクエストを送ってもかまいません。

ユーザー管理

const u = await env.auth.users.get(id);
const byEmail = await env.auth.users.getByEmail("[email protected]");
const page = await env.auth.users.list({ limit: 50, cursor });
await env.auth.users.update(id, { name: "新しい名前" });
await env.auth.users.delete(id);
await env.auth.sessions.revokeAll(userId);

list が返す件数はデフォルトで 50 件、最大で 200 件です。cursor が空文字列なら最後のページです。

ブラウザ用ヘルパー

import { session, signInUrl, signOutUrl } from "@runlot/auth/client";

const { user } = await session();          // ログインしていなければ { user: null }
location.href = signInUrl("github", { next: "/app" });

このモジュールに外部依存はありません。next に外部 URL を渡した場合は、セキュリティのため無視されます。

リクエストなしで呼び出す方法

リクエスト引数なしで env.auth.user() を呼び出せるのは、フレームワークのアダプターが提供する機能です。現在提供しているアダプターは Next.js 用の @runlot/next だけです。それ以外の環境では、必ずリクエストオブジェクトを渡してください。

このページの目次