認証・認可設計
概要
tanomu-aiには2種類のユーザーが存在する。それぞれに適した認証方式を設計する。
| ユーザー種別 | 認証方式 | 備考 |
|---|---|---|
| AIエージェント(依頼側) | APIキー(Bearer Token) | MVP段階では手動発行 |
| 受注者(タスクを受ける側) | LINE Login | line_sub でユーザー識別 |
AIエージェント向けAPI認証
方式: APIキー(Bearer Token)
AIエージェントはM2M(Machine-to-Machine)通信であり、人間の介在するOAuthフローは不要。シンプルなAPIキー方式を採用する。
MVP段階の運用
- APIキーは手動発行(ダッシュボードは構築しない)
- 連携先の開発者にメール等でキーを送付
- 連携先が増えた段階でキー管理ダッシュボードを検討
将来の拡張
- アカウント単位で複数キー発行・ローテーション対応
- キー単位のスコープ設定(タスク投稿、ステータス確認等)
- キー単位のレートリミット
- キー漏洩時の即時無効化
- サードパーティ連携が増えた場合はOAuth検討
受注者向け認証
方式: LINE Login のみ
LINE Loginを唯一のログイン手段とする。SMS OTP によるログインは提供しない。
認証フロー
POST /auth/line/callback — LINEからのcodeを受け取りトークン発行POST /auth/refresh — refresh_token でアクセストークン更新- access_token: JWT HS256、有効期限1時間
- refresh_token: JWT HS256、有効期限180日、DBにハッシュを保存
選定理由
- ターゲットが日本の主婦層 → LINE利用率が非常に高い
- LINEログインなら電話番号入力もOTP待ちも不要で最速
- LINE連携により将来的にタスク通知をLINEで送信可能
- 認証方式を1つに絞ることでアカウント統合の複雑さを排除
ユーザー識別
- LINE Login の
subクレーム(line_sub)でユーザーを一意に識別する profileスコープのみ使用(userId, displayName, pictureUrl)phoneスコープは使用しない(LINE側の審査リスク回避)- 電話番号はログインとは別にアプリ内で収集する(KYC用途)
セッション管理
- 初回ログイン時にLINE Loginで認証
- リフレッシュトークンで180日間セッション維持
- 主婦層にとって「アプリを開いたら即使える」体験を実現
本人確認(KYC)レベル
代理受領型の決済スキーム(決済フロー設計参照)を採用するため、資金移動業登録は不要。犯収法上のKYC義務も直接は発生しない。
段階的な本人確認で、オンボーディングの摩擦を最小化する。
| レベル | 必要情報 | タイミング | 目的 |
|---|---|---|---|
| Lv.0 | LINE Login のみ | アカウント作成時 | サービス利用開始 |
| Lv.1 | 氏名+振込先口座+電話番号 | 初回タスク完了後 | 報酬振込(口座名義で実質的な本人確認) |
ユーザー体験の流れ
LINEでログイン ↓即タスク閲覧画面へ(Lv.0: LINE認証のみ) ↓タスクを選んで作業・完了 ↓「報酬を受け取るには口座情報を登録してください」 ↓氏名+振込先口座+電話番号を入力(Lv.1)→ 報酬受取LINE認証だけで登録からタスク完了まで進められる。口座情報・電話番号の入力は「報酬がもらえる」というモチベーションがある状態で求めるため、離脱を抑えられる。
eKYC(Lv.2)について
MVP段階ではeKYC(身分証確認)は実装しない。マイクロタスクは少額であり不正のインセンティブが低い。不正発生や取引額の増加に応じて、累計報酬額ベースの閾値でeKYCを後から追加する。
データモデル
workers テーブル(受注者)
workers├── id UUID PK├── line_sub TEXT UNIQUE NOT NULL — LINE の sub クレーム├── name TEXT — LINE 表示名├── avatar_url TEXT — LINE プロフィール画像 URL├── phone TEXT UNIQUE — 電話番号(KYC用途、任意)├── kyc_level INTEGER DEFAULT 0├── refresh_token_hash TEXT├── refresh_token_expires_at TIMESTAMPTZ├── created_at TIMESTAMPTZ└── updated_at TIMESTAMPTZagents・api_keys テーブル(AIエージェント)
agents├── id UUID PK├── name TEXT NOT NULL└── created_at TIMESTAMPTZ
api_keys├── id UUID PK├── agent_id UUID FK → agents├── key_hash TEXT UNIQUE NOT NULL — SHA-256 ハッシュ└── created_at TIMESTAMPTZ認可モデル
ロール
| ロール | 説明 | 認証方式 |
|---|---|---|
agent | AIエージェント(依頼側) | APIキー |
worker | 受注者(タスクを受ける側) | LINE Login |
アクセス制御
| リソース | agent | worker |
|---|---|---|
| タスク投稿 | ○ | × |
| タスク閲覧(一覧) | 自分が投稿したもの | 受注可能なもの(open) |
| タスク受注 | × | ○ |
| 作業中・完了報告 | × | ○(自分が受注したもの) |
| 成果物確認・承認 | ○(自分が投稿したもの) | × |
| 報酬情報 | × | ○(自分の報酬) |