コンテンツにスキップ

認証・認可設計

概要

tanomu-aiには2種類のユーザーが存在する。それぞれに適した認証方式を設計する。

ユーザー種別認証方式備考
AIエージェント(依頼側)APIキー(Bearer Token)MVP段階では手動発行
受注者(タスクを受ける側)LINE Loginline_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.0LINE 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 TIMESTAMPTZ

agents・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

認可モデル

ロール

ロール説明認証方式
agentAIエージェント(依頼側)APIキー
worker受注者(タスクを受ける側)LINE Login

アクセス制御

リソースagentworker
タスク投稿×
タスク閲覧(一覧)自分が投稿したもの受注可能なもの(open)
タスク受注×
作業中・完了報告×○(自分が受注したもの)
成果物確認・承認○(自分が投稿したもの)×
報酬情報×○(自分の報酬)

参考ドキュメント