# Kizashi: Threads OAuth連携 ローカル検証手順 対象ブランチ: `claude/threads-oauth-token-management-6blv4t` 対象: `apps/kizashi-api` Threads側のOAuthはredirect_uriがHTTPSである必要があるため、`wrangler dev`(ローカルhttp)単体では検証できません。本手順では `wrangler dev --remote` を使い、Cloudflare上で実行される開発用Workerに対してテストします。 --- ## 0. 事前準備 ``` cd apps/kizashi-api ``` 以下の2つのシークレットはランダム値でよいので、先に生成しておきます。 ```bash openssl rand -base64 32 # → TOKEN_ENCRYPTION_KEY に使う openssl rand -base64 32 # → AUTH_SESSION_SECRET に使う(上とは別の値) ``` --- ## 1. Meta for Developersでアプリを用意する 1. https://developers.facebook.com/ にログインし、「アプリを作成」 2. アプリ種別は「その他」→ 用途は「ビジネス」等を選択(個人利用ならこだわらなくてOK) 3. 作成後のダッシュボードで製品を追加 →「Threads API」を追加 4. 左メニューの「Threads API設定」を開き、以下を確認・設定 - **Threads use case** の権限設定で以下3つを有効化 - `threads_basic` - `threads_content_publish` - `threads_manage_insights` - **Redirect Callback URLs** に、後述の手順3で得られる `wrangler dev --remote` のURL + `/threads-accounts/oauth/callback` を登録 - 例: `https://xxxxx.your-subdomain.workers.dev/threads-accounts/oauth/callback` - このURLは実際に`wrangler dev --remote`を起動してみないと確定しないため、一度手順3を先に実行してURLを確定させてから、このステップに戻って登録してください 5. 「アプリのロール」→「テスター(Tester)」に、自分のThreadsアカウントを追加 - Meta App Reviewを通していない段階では、明示的にテスターとして追加されたThreadsアカウントでしかOAuth認可できません - 招待を送ると、Threadsアプリ側(自分のThreadsアカウント)で承認操作が必要です 6. ダッシュボードのトップから **App ID** と **App Secret** を控えておく --- ## 2. `.dev.vars` を作成する `apps/kizashi-api/.dev.vars.example` をコピーして値を埋めます。このファイルは `.gitignore` 済みなのでコミットされません。 ```bash cp .dev.vars.example .dev.vars ``` `.dev.vars` の中身: ``` TOKEN_ENCRYPTION_KEY=<手順0で生成した1つ目の値> AUTH_SESSION_SECRET=<手順0で生成した2つ目の値> THREADS_APP_ID=<手順1で控えたApp ID> THREADS_APP_SECRET=<手順1で控えたApp Secret> THREADS_REDIRECT_URI=https://xxxxx.your-subdomain.workers.dev/threads-accounts/oauth/callback FRONTEND_ORIGIN=http://localhost:3000 ``` `THREADS_REDIRECT_URI` は、Meta側の「Redirect Callback URLs」に登録した値と**完全一致**させてください(末尾スラッシュの有無なども含めて厳密です)。 --- ## 3. `wrangler dev --remote` を起動する ```bash pnpm --filter kizashi-api exec wrangler dev --remote ``` - 初回はCloudflareアカウントへのログインを求められる場合があります - 起動すると `https://xxxxx.your-subdomain.workers.dev` のようなHTTPSのURLが払い出されます。このURLをメモしてください - このURLが確定したら、手順1の「Redirect Callback URLs」と `.dev.vars` の `THREADS_REDIRECT_URI` を両方このURLに合わせて更新し、Workerを再起動してください(`.dev.vars`変更時は再起動が必要です) D1(`kizashi-db`)は `--remote` モードなのでCloudflare上の本物のD1に対して読み書きします。事前にマイグレーションが当たっていることを確認してください。 ```bash pnpm --filter kizashi-api run db:migrate:remote ``` --- ## 4. ユーザー登録・ログイン(Cookieセッション)を確認する 以下、`$API` は手順3で払い出されたURLに読み替えてください。 ```bash API="https://xxxxx.your-subdomain.workers.dev" # サインアップ(Cookieを cookies.txt に保存) curl -c cookies.txt -X POST "$API/auth/signup" \ -H "Content-Type: application/json" \ -d '{"email":"you@example.com","password":"testpassword123"}' # ログイン確認(同じcookies.txtを使い回す) curl -b cookies.txt -c cookies.txt -X POST "$API/auth/login" \ -H "Content-Type: application/json" \ -d '{"email":"you@example.com","password":"testpassword123"}' ``` `{"id": "...", "email": "..."}` が返り、`cookies.txt` に `kizashi_session` が保存されていればOKです。 --- ## 5. Threads OAuth連携を確認する(ブラウザ操作) OAuth開始・コールバックはブラウザでのリダイレクトが前提のため、ここはcurlではなくブラウザで行います。 1. ブラウザの開発者ツール等で、手順4で取得したセッションCookie(`kizashi_session`)を `$API` のドメインに対してセットする - 簡単な方法: ブラウザで一度 `$API` にアクセスした状態で、開発者ツールのApplication/Storage画面から手動でCookieを追加する - もしくは、`/auth/signup` をブラウザから直接叩けるような簡易フォームがあれば、それ経由でも可(現時点ではAPI単体なので、上記の手動Cookie設定が最も簡単です) 2. ブラウザで `$API/threads-accounts/oauth/start` にアクセスする 3. Threadsの認可画面にリダイレクトされるので、手順1でテスター登録した自分のThreadsアカウントでログイン・認可する 4. `$API/threads-accounts/oauth/callback` に自動的に戻ってきて、以下のようなJSONが表示されれば成功です ```json { "status": "connected", "threads_account_id": "xxxxxxxx-xxxx-...", "threads_user_id": "179xxxxxxxxxxxxxx", "display_name": "your_threads_username", "token_expires_at": "2026-10-17T..." } ``` この `threads_account_id` を次の手順6で使います。 5. 一覧確認(暗号化トークンは含まれないこと) ```bash curl -b cookies.txt "$API/threads-accounts" ``` --- ## 6. 実際に1件投稿してみる(検証スクリプト) `TOKEN_ENCRYPTION_KEY` は手順2で `.dev.vars` に設定した値と同じものを、環境変数として渡します。 ```bash cd apps/kizashi-api TOKEN_ENCRYPTION_KEY=<.dev.varsと同じ値> \ pnpm run threads:verify-publish -- --account-id <手順5のthreads_account_id> --text "Kizashiからのテスト投稿" ``` - 内部で `wrangler d1 execute kizashi-db --remote` を実行してD1から暗号化済みトークンを取得・復号します - コンテナ作成後、Threads API推奨に従い30秒待ってから publish します - 成功すると `published: threads_post_id=...` が出力されます。実際にThreads上に投稿されているか確認してください --- ## トラブルシューティング | 症状 | 確認ポイント | |---|---| | `/threads-accounts/oauth/start` にアクセスすると401 | セッションCookie(`kizashi_session`)が正しくセットされているか | | Threads認可画面で「このアプリは使えません」的なエラー | 手順1-5のテスター登録が完了しているか、招待の承認をThreads側で行ったか | | callbackで `invalid oauth state` | `kizashi_oauth_state` Cookieが10分以内に消えていないか(start→認可→callbackを10分以内に完了する)。ブラウザのCookieブロック設定も確認 | | callbackで `threads oauth callback failed` | `THREADS_REDIRECT_URI` がMeta側の登録値と完全一致しているか、`THREADS_APP_SECRET`が正しいか | | verify-threads-publishで復号エラー | `TOKEN_ENCRYPTION_KEY` が `.dev.vars` の値と一致しているか(OAuth連携時と検証スクリプト実行時で同じ値を使う必要がある) | | verify-threads-publishでcontainer作成が失敗 | `threads_content_publish` スコープが有効か、テキストが500文字を超えていないか | --- ## 補足 - 本手順はPhase 1「Threads連携の疎通確認」のための一時的な検証フローです。`/threads-accounts/oauth/start` へのアクセスは現状ブラウザでの手動Cookie設定を前提にしていますが、Phase 7でkizashi-webのアカウント連携画面ができれば、そこからボタン一つで同じ導線を踏めるようになります - 動作確認が完了したら `CLAUDE.md` の実装状況チェックボックスで Phase 1 にチェックを入れてください