convex-auth について
@convex-dev/auth を使って、プロバイダー設定、サーバーとクライアントの接続、サインイン画面を含むログイン機能をアプリに追加するスキルです。既定ではパスキーを使い、認証が実際に完了することを確認します。
主な機能
- 01パスキー、パスワード、OAuth の設定
- 02jose による JWT キー生成
- 03auth.config.ts の設定
- 04プロバイダー、フック、UI、ルートガードの接続
- 05サインインの往復を検証
活用シーン
- 01アプリへのパスキー認証の追加
- 02指定されたパスワードまたは OAuth ログインの設定
- 03設定ミスによるサインアウト状態の調査
MCP 対応
デプロイ環境変数の設定に Convex MCP の envSet ツールを利用でき、CLI による代替方法も記載されています。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ convex/ agent-skills --skill convex-authインストール後、Claude Code で/convex-authを入力して読み込まれたか確認します。
詳細
アプリにサインインを追加する
現在のアプリに @convex-dev/auth をインストールして接続します。デフォルトではパスキーを使用し、必要に応じて OAuth/パスワードに切り替えます。プロバイダー、サーバー設定、クライアントフック、サインイン UI を正しく設定してください。特に、実際の認証で最もよくある落とし穴である auth.config.ts も忘れずに設定します。
ワークフロー
- @convex-dev/auth(固定ビルド)をインストールし、convex.config.ts に追加します。pnpm の場合は
pnpm add joseも実行してください(それ以外ではホイストされないため)。ステップ 3 で必要になります。 - convex/auth.ts にプロバイダーを追加します(デフォルトは Passkey。リクエストがあれば Password または Google などの OAuth)。
- 認証キーをヘッドレスで生成します。対話型の
npx @convex-dev/authウィザードは実行しないでください。ログイン/TTY が必要で、非対話、匿名、または CI の実行ではハングします(認証で最も時間を浪費する原因です)。joseを使って JWT_PRIVATE_KEY + JWKS を決定論的に生成します。 node -e 'import("jose").then(async({generateKeyPair,exportPKCS8,exportJWK})=>{const k=await generateKeyPair("RS256",{extractable:true});const priv=await exportPKCS8(k.privateKey);const pub=await exportJWK(k.publicKey);process.stdout.write(JSON.stringify({JWT_PRIVATE_KEY:priv.trimEnd().replace(/\n/g," "),JWKS:JSON.stringify({keys:[{use:"sig",...pub}]})}))})' > .auth-keys.json 次に、.auth-keys.json の JWT_PRIVATE_KEY と JWKS、および SITE_URL をデプロイ先に設定します。複数行のキーをシェルで引用するのを避けるため、Convex MCP のenvSetツールを変数ごとに 1 回呼び出す方法を推奨します。CLI を使う場合は NAME=VALUE 形式(npx convex env set "JWT_PRIVATE_KEY=$JWT")を使用してください。env set JWT_PRIVATE_KEY "$JWT"は絶対に使わないでください(値は-----BEGINで始まり、CLI が先頭の-を未知のフラグとして解析します)。SITE_URL は開発用 URL(例:http://localhost:3000)です。作成後、.auth-keys.json を削除します。 - convex/auth.config.ts を作成します(誤っていると、常にサインアウト状態になる不具合が気づかれないまま発生します)。
- クライアントを接続します。ConvexAuthProvider、サインインコンポーネント、ルートガードを追加します。shadcn/ui のプリミティブ(button、input、textarea、label など)をインポートする場合は、まず
npx shadcn@latest add <name>で追加してください。@/components/ui/* が存在しないとビルドエラーになります。 - 完了とする前に、サインインが往復して正常に動作することを確認します。
ルール
joseを使って JWT_PRIVATE_KEY/JWKS を生成します(extractable な RS256、PKCS8 の改行はスペースに置換、JWKS = {keys:[{use:"sig", ...publicJwk}]})。対話型のnpx @convex-dev/authウィザードは実行しないでください。ヘッドレス/匿名の実行ではハングします。変数は MCP のenvSetツール、または NAME=VALUE 形式の CLI で設定します。- 必ず auth.config.ts を作成してください。これがない、または設定が誤っていると、エラーなしで常にサインアウト状態になります。
- デフォルトはパスキーです。パスワード/OAuth に切り替えるのは、明示的なリクエストがあった場合のみです。
- インポートする shadcn/ui のプリミティブは、事前に
npx shadcn@latest add ...で追加してください。@/components/ui/* が存在しないとビルドに失敗します。 - 完了前に、実際のサインインが正常に動作することを確認してください。
コメント
Markdown 対応