- Cloudflare KV
- Redis (node-redisを使用)
- Deno KV
- New! Cloudflare D1 (sqlite)
対応 | ランタイム | 動作確認 |
---|---|---|
✔️ | Bun | ✔️ |
✔️ | Cloudflare Workers | ✔️ |
✔️ | Cloudflare Pages (Functions) | |
✔️ | Node.js | ✔️ |
✔️ | Deno (with Redis) | ✔️ |
✔️ | Deno KV | ✔️ |
npm install hono-kv-session
- Cloudflare Workers
- バインド名が
SESSION
のKVネームスペースをwrangler
で作成します。
$ wrangler kv:namespace create SESSION
1.
で生成されたUUIDをwrangler.toml
に設定します。
こんな感じ:{ binding = "SESSION", id = "b80d8fc5924d43ba85b56aa6b6dbb1c3" }
- バインド名が
- Bun, Node.js, Denoなど
- Redisサーバを起動するだけ。
systemdの場合:# systemctl start redis-server
- Redisサーバを起動するだけ。
- Deno KV
Deno KVは現在ベータ版です
このように、Denoプログラムに--unstable
フラグを付けて実行してください。$ deno run --allow-net --watch --unstable app.ts
- Cloudflare D1
- D1データベースを作成します
$ wrangler d1 create session-db
wrangler.toml
のdatabase_id
を**1.**で出力されたIDと置き換えます[[ d1_databases ]] binding = "SESSION_DB" database_name = "session-db" database_id = "<ここにIDを入力します>" preview_database_id = "local"
$ npm run d1:init
を実行します
- D1データベースを作成します
Githubの./dev
ディレクトリにhono-kv-session
を使ったサンプルコードがあります。
-
Cloudflare Workers, Cloudflare Pages
import { kvClient } from 'hono-kv-session/cloudflare'; app.use('*', kvClient());
-
Node.js, Bun, Deno (with Redis)
import { kvClient } from 'hono-kv-session/redis'; app.use('*', kvClient()); // もしくは、node-redisのcreateClient()のオプションを指定できます app.use('*', kvClient({ url: 'redis://alice:foobared@awesome.redis.server:6380' }));
-
Deno KV
import { kvClient } from 'https://deno.land/x/hono_kv_session/kv/denokv.js'; app.use('*', kvClient());
-
Cloudflare D1
import { kvClient } from 'hono-kv-session/d1'; app.use('*', kvClient());
-
SessionManager()
ミドルウェアの設定import { SessionManager, createSession, deleteSession } from 'hono-kv-session' // Denoを利用している場合、モジュール名を'npm:hono-kv-session'に置き換えてください app.use('*', SessionManager({ // Cookieの名前 name: 'session_cookie' // デフォルト: 'id' // HonoのSigned cookie用のシークレット secret: 'Strong_Secret_123' // デフォルト: null // セッションのTTL(有効期限の秒数)。 KVとCookieの両方に設定される。 最低値は60(下回る場合は60に設定) ttl: 60, // デフォルト: 604800 (一週間) // アクセス毎にセッションの有効期限(TTL)を延長する。 renew: true, // デフォルト: true // アクセス毎にセッションIDを再生成する。 regenerate: true, // デフォルト: false }))
secret
にはHonoのSigned cookie用のシークレットを設定します (ただし、この機能は動作未確認です)。
Signed Cookieの詳細は、HonoのCookie Helperドキュメントを参照してください。
-
セッションデータを取得
app.get('/', async (c) => { const { value, key, name, status } = c.session; return c.json({ username: value, session_id: key, // デフォルト: crypto.randomUUID() で設定されたUUID cookie_id: name, status, }) })
-
アクセス拒否
denyAccess()
ミドルウェアを挟まないと、不正なセッションを拒否せずアクセスされてしまいます。c.session.status = true|false
を参照することで、特定のルートやHTTPメソッドのみを対象としたアクセス制限が可能です。import { denyAccess } from 'hono-kv-session'; // If JSON app.use('*', denyAccess({ type: 'json', // 'json' or 'html' or 'text' status: 401, // status code response: { status: false, message: 'Invalid session' } })) // If HTML app.use('*', denyAccess({ type: 'html', // 'json' or 'html' or 'text' status: 401, // status code response: '<p>Invalid session</p>' }));
-
セッションの作成
app.post('/login', async (c) => { // FormDataからユーザ名を取得 const { user } = await c.req.parseBody() // セッションを作成 await createSession(c, user, { secret: 'Strong_Secret_123'// Signed Cookieを使う場合はsecretを設定して }) return c.redirect('/') })
-
セッションの更新
app.post('/renew', async (c) => { await renewSession(c) return c.redirect('/') })
-
セッションの削除
app.post('/logout', async (c) => { await deleteSession(c) return c.redirect('/') })
- KVストア:
session:<ホスト名>:<uuid>
とvalue
キー:session:www.example.com:49b0b962-5b95-43c6-9e00-94ce1313d0ed
値:user01
- Cookie:
id=49b0b962-5b95-43c6-9e00-94ce1313d0ed
c.session
の中身c.session = { session: 'user01' // KVの値 key: `49b0b962-5b95-43c6-9e00-94ce1313d0ed` // KVのキー name: 'id' // Cookieの名前 }
MIT