{"id":15723485,"url":"https://github.com/shinosaki/hono-kv-session","last_synced_at":"2025-05-13T10:29:38.095Z","repository":{"id":194705705,"uuid":"691735644","full_name":"shinosaki/hono-kv-session","owner":"shinosaki","description":"Stateful session middleware for Hono. Works on Cloudflare Workers, Node.js, Bun, etc.","archived":false,"fork":false,"pushed_at":"2024-04-02T04:48:40.000Z","size":63,"stargazers_count":10,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-18T01:49:11.579Z","etag":null,"topics":["bun","cloudflare-workers","hono","kv","redis","session"],"latest_commit_sha":null,"homepage":"https://hono-kv-session.la1n.workers.dev","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shinosaki.png","metadata":{"files":{"readme":"README.ja.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-09-14T19:25:01.000Z","updated_at":"2025-02-25T04:54:27.000Z","dependencies_parsed_at":"2024-04-02T05:43:38.094Z","dependency_job_id":null,"html_url":"https://github.com/shinosaki/hono-kv-session","commit_stats":null,"previous_names":["shinosaki/hono-kv-session"],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shinosaki%2Fhono-kv-session","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shinosaki%2Fhono-kv-session/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shinosaki%2Fhono-kv-session/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shinosaki%2Fhono-kv-session/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shinosaki","download_url":"https://codeload.github.com/shinosaki/hono-kv-session/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249502754,"owners_count":21282465,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bun","cloudflare-workers","hono","kv","redis","session"],"created_at":"2024-10-03T22:11:52.328Z","updated_at":"2025-04-20T23:30:47.773Z","avatar_url":"https://github.com/shinosaki.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## サポートしているキーバリューストア\n- Cloudflare KV\n- Redis ([node-redis](https://github.com/redis/node-redis)を使用)\n- Deno KV\n- **New!** Cloudflare D1 (sqlite)\n\n## サポートしているランタイム\n| 対応 | ランタイム | 動作確認 |\n| --- | --- | --- |\n| ✔️ | Bun | ✔️ |\n| ✔️ | Cloudflare Workers | ✔️ |\n| ✔️ | Cloudflare Pages (Functions) |  |\n| ✔️ | Node.js | ✔️ |\n| ✔️ | Deno (with Redis) | ✔️ |\n| ✔️ | Deno KV | ✔️ |\n\n## インストール\n```\nnpm install hono-kv-session\n```\n\n## KVのセットアップ\n- Cloudflare Workers\n  1. バインド名が`SESSION`のKVネームスペースを`wrangler`で作成します。  \n     `$ wrangler kv:namespace create SESSION`\n  2. `1.`で生成されたUUIDを`wrangler.toml`に設定します。  \n     こんな感じ: `{ binding = \"SESSION\", id = \"b80d8fc5924d43ba85b56aa6b6dbb1c3\" }`\n- Bun, Node.js, Denoなど\n  1. Redisサーバを起動するだけ。  \n     systemdの場合: `# systemctl start redis-server`\n- Deno KV  \n  **[Deno KVは現在ベータ版です](https://docs.deno.com/kv/manual)**  \n  このように、Denoプログラムに`--unstable`フラグを付けて実行してください。  \n  ```bash\n  $ deno run --allow-net --watch --unstable app.ts\n  ```\n- Cloudflare D1\n  1. D1データベースを作成します\n     `$ wrangler d1 create session-db`\n  2. `wrangler.toml`の`database_id`を**1.**で出力されたIDと置き換えます\n     ```toml\n     [[ d1_databases ]]\n     binding = \"SESSION_DB\"\n     database_name = \"session-db\"\n     database_id = \"\u003cここにIDを入力します\u003e\"\n     preview_database_id = \"local\"\n     ```\n  3. `$ npm run d1:init`を実行します\n\n## 使い方\nGithubの[`./dev`](./dev)ディレクトリに`hono-kv-session`を使ったサンプルコードがあります。\n\n### KVクライアント\n- **Cloudflare Workers, Cloudflare Pages**\n  ```js\n  import { kvClient } from 'hono-kv-session/cloudflare';\n  app.use('*', kvClient());\n  ```\n\n- **Node.js, Bun, Deno (with Redis)**\n  ```js\n  import { kvClient } from 'hono-kv-session/redis';\n  app.use('*', kvClient());\n\n  // もしくは、node-redisのcreateClient()のオプションを指定できます\n  app.use('*', kvClient({\n    url: 'redis://alice:foobared@awesome.redis.server:6380'\n  }));\n  ```\n\n- **Deno KV**\n  ```js\n  import { kvClient } from 'https://deno.land/x/hono_kv_session/kv/denokv.js';\n  app.use('*', kvClient());\n  ```\n\n- **Cloudflare D1**\n  ```js\n  import { kvClient } from 'hono-kv-session/d1';\n  app.use('*', kvClient());\n  ```\n\n### SessionManagerを利用する\n\n- `SessionManager()`ミドルウェアの設定\n   ```js\n   import { SessionManager, createSession, deleteSession } from 'hono-kv-session' // Denoを利用している場合、モジュール名を'npm:hono-kv-session'に置き換えてください\n   \n   app.use('*', SessionManager({\n     // Cookieの名前\n     name: 'session_cookie' // デフォルト: 'id'\n   \n     // HonoのSigned cookie用のシークレット\n     secret: 'Strong_Secret_123' // デフォルト: null\n\n     // セッションのTTL（有効期限の秒数）。 KVとCookieの両方に設定される。 最低値は60（下回る場合は60に設定）\n     ttl: 60, // デフォルト: 604800 (一週間)\n\n     // アクセス毎にセッションの有効期限(TTL)を延長する。\n     renew: true, // デフォルト: true\n\n     // アクセス毎にセッションIDを再生成する。\n     regenerate: true, // デフォルト: false\n   }))\n   ```\n   - `secret`にはHonoのSigned cookie用のシークレットを設定します （ただし、この機能は動作未確認です）。  \n     Signed Cookieの詳細は、Honoの[Cookie Helper](https://hono.dev/helpers/cookie)ドキュメントを参照してください。\n\n- セッションデータを取得\n   ```js\n   app.get('/', async (c) =\u003e {\n     const { value, key, name, status } = c.session;\n     return c.json({\n       username: value,\n       session_id: key, // デフォルト: crypto.randomUUID() で設定されたUUID\n       cookie_id: name,\n       status,\n     })\n   })\n   ```\n\n- アクセス拒否\n  `denyAccess()`ミドルウェアを挟まないと、不正なセッションを拒否せずアクセスされてしまいます。\n  `c.session.status = true|false`を参照することで、特定のルートやHTTPメソッドのみを対象としたアクセス制限が可能です。\n  ```js\n  import { denyAccess } from 'hono-kv-session';\n\n  // If JSON\n  app.use('*', denyAccess({\n    type: 'json', // 'json' or 'html' or 'text'\n    status: 401, // status code\n    response: { status: false, message: 'Invalid session' }\n  }))\n\n  // If HTML\n  app.use('*', denyAccess({\n    type: 'html', // 'json' or 'html' or 'text'\n    status: 401, // status code\n    response: '\u003cp\u003eInvalid session\u003c/p\u003e'\n  }));\n  ```\n\n- セッションの作成\n   ```js\n   app.post('/login', async (c) =\u003e {\n     // FormDataからユーザ名を取得\n     const { user } = await c.req.parseBody()\n   \n     // セッションを作成\n     await createSession(c, user, {\n       secret: 'Strong_Secret_123'// Signed Cookieを使う場合はsecretを設定して\n     })\n   \n     return c.redirect('/')\n   })\n   ```\n\n- セッションの更新\n   ```js\n   app.post('/renew', async (c) =\u003e {\n     await renewSession(c)\n     return c.redirect('/')\n   })\n   ```\n\n- セッションの削除\n   ```js\n   app.post('/logout', async (c) =\u003e {\n     await deleteSession(c)\n     return c.redirect('/')\n   })\n   ```\n\n## セッションの形式\n- KVストア: `session:\u003cホスト名\u003e:\u003cuuid\u003e` と `value`  \n  キー: `session:www.example.com:49b0b962-5b95-43c6-9e00-94ce1313d0ed`  \n  値: `user01`  \n- Cookie: `id=49b0b962-5b95-43c6-9e00-94ce1313d0ed`  \n- `c.session`の中身  \n  ```js\n  c.session = {\n    session: 'user01' // KVの値\n    key: `49b0b962-5b95-43c6-9e00-94ce1313d0ed` // KVのキー\n    name: 'id' // Cookieの名前\n  }\n  ```\n\n## 依存関係\n- [hono](https://hono.dev/)\n- [node-redis](https://github.com/redis/node-redis)\n\n## ライセンス\nMIT","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshinosaki%2Fhono-kv-session","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshinosaki%2Fhono-kv-session","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshinosaki%2Fhono-kv-session/lists"}