メインコンテンツまでスキップ

サードパーティ連携(OAuth 2.0)

← 導入ガイドに戻る


OAuth 2.0の認可コードフローを提供します。

業界標準のプロトコルに準拠しているため、外部アプリとの安全な連携を実現できます。


概要図

画面イメージ

┌─────────────────────────────────┐
│ 外部アプリ │
│ │
│ ┌───────────────────────┐ │
│ │ [あなたのサービスと連携] │ ← クリック
│ └───────────────────────┘ │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│ 認証画面          │
│ │
│ メールアドレス: [__________] │
│ パスワード: [__________] │
│ [次へ] │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│ 許可確認画面 │
│ │
│ 「○○アプリ」が以下へのアクセスを │
│ 要求しています: │
│ │
│ ✓ プロフィール情報の閲覧 │
│ ✓ 写真の閲覧・編集 │
│ │
│ ┌─────┐ ┌─────┐ │
│ │拒否 │ │許可 │ │
│ └─────┘ └─────┘ │
└─────────────────────────────────┘

┌─────────────────────────────────┐
│ 外部アプリ │
│ │
│ 連携成功! │
│ あなたの写真にアクセスできます │
└─────────────────────────────────┘

できること

サードパーティアプリへのアクセス許可

ユーザーの許可を得て、外部アプリにデータへのアクセスを提供できます。

あなたのサービスのAPIを、外部の開発者が作ったアプリから安全に使えるようにします。

具体例:

  • あなたが運営: ファイルストレージ

    • 外部のスマホアプリがユーザーのファイルを閲覧・編集
    • 外部のバックアップツールがユーザーのファイルを自動保存
  • あなたが運営: タスク管理サービス

    • 外部のチャットボットがユーザーのタスクを通知
    • 外部のカレンダーアプリがタスク期限を同期
  • あなたが運営: 写真投稿サービス

    • 外部の写真編集アプリがユーザーの写真を加工
    • 外部の印刷サービスがユーザーの写真を印刷

OAuth 2.0標準準拠

業界標準のOAuth 2.0プロトコルを使うので、既存の開発ツールやライブラリがそのまま使えます。

  • 認可コードフロー
  • アクセストークン・リフレッシュトークンの発行
  • トークンのローテーション
  • スコープによる権限管理

ユーザーの許可制御

ユーザーが自分のデータへのアクセスを完全にコントロールできます。

  • 許可の確認: どのアプリが何にアクセスしているか確認可能
  • 許可の取り消し: いつでも外部アプリのアクセスを停止できる
  • アクセス履歴: 誰がいつデータにアクセスしたか記録

柔軟なスコープ設計

アクセス権限を細かく制御できます。

  • 読み取り専用アクセス(read:xxx
  • 書き込みアクセス(write:xxx
  • 管理者権限(admin:xxx
  • カスタムスコープ(あなたのサービス独自の権限)

セキュリティ

認可フローの中でユーザー認証が必須です。

外部アプリにデータアクセスを許可する前に、必ずユーザー本人であることを確認します。

選択できる認証方法:

  • パスワード認証
  • MFA(SMS/メール)
  • パスワードレス認証(FIDO2、生体認証)

セキュリティ要件に応じて、適切な認証レベルを設定できます。


導入時に決めること

1. ユーザー認証方法

外部アプリにデータアクセスを許可する前に、ユーザー本人であることを確認します。

認証方法説明向いているケース
パスワード認証メールアドレス/ユーザー名 + パスワード標準的なセキュリティ要件
MFAパスワード + SMS/メール高セキュリティが必要
パスワードレス認証FIDO2、生体認証(指紋・顔認証)ユーザー体験と高セキュリティ両立

idp-serverでの設定:

  • 認証ポリシーで認証方法を指定
  • セキュリティ要件に応じた認証レベルを設定

詳細は以下を参照:

2. どのような第三者アプリを想定するか

種類説明
モバイルアプリiOS/Androidアプリ公式アプリ以外のクライアント
Webアプリブラウザで動作するサービス他社サービスとの連携
バックエンドサービスサーバー間通信自動化ツール、分析ツール
デスクトップアプリPC向けアプリケーションローカルアプリとの連携

idp-serverでの設定:

  • クライアント登録で各アプリの情報を管理
  • アプリの種類に応じた認証方式・リダイレクトURIを設定

3. どのデータ・機能へのアクセスを許可するか(スコープ設計)

決めること選択肢の例
公開データプロフィール情報、公開投稿の閲覧
個人データ(読み取り)非公開投稿、個人ファイル、メッセージ閲覧
個人データ(書き込み)投稿作成、ファイルアップロード、メッセージ送信
管理操作アカウント設定変更、他ユーザー管理

スコープ設計例:

read:profile    - プロフィール閲覧
read:photos - 写真閲覧
write:photos - 写真アップロード・編集
read:messages - メッセージ閲覧
write:messages - メッセージ送信
admin:users - ユーザー管理(管理者のみ)

idp-serverでの設定:

  • スコープの定義 (※リソースサーバーが、スコープごとのアクセス制御を適切に行えるように設計する必要あります)

4. ユーザーへの許可確認画面

決めること選択肢の例
表示タイミング毎回表示、初回のみ、スコープ変更時のみ
表示内容許可する権限の詳細説明、データの使われ方
デザイン自社ブランド、シンプル、詳細情報付き

許可画面に表示する情報:

  • アプリ名、アイコン、開発者情報
  • 要求されている権限(スコープ)の説明
  • データの使用目的
  • 許可の有効期限

実装方法:

  • 許可確認画面はフルスクラッチで実装
  • idp-serverの view-data APIGET /{tenant-id}/v1/authorizations/{id}/view-data)からクライアント名・ロゴ・スコープ一覧等を取得して表示
  • クライアントにカスタムプロパティを設定すると、アプリ固有のUI設定も client_custom_properties として取得可能

5. アクセストークンの管理

決めること選択肢の例
トークン有効期限1時間、1日、30日
リフレッシュトークンのローテーションローテーションする、しない
リフレッシュトークンの有効期限期限固定、期限延長(使用の度に延長)
トークン失効手動失効可能、自動失効のみ

idp-serverでの設定:

  • アクセストークン有効期限の設定
  • リフレッシュトークンのローテーションポリシー
  • リフレッシュトークンの有効期限設定(固定 or 延長)

6. ユーザーによる許可の管理

決めること選択肢の例
許可の確認許可済みアプリ一覧を表示
許可の取り消しいつでも可能、制限あり
アクセス履歴表示する、表示しない

idp-serverでの設定:

  • 許可取り消し時のトークン失効処理
  • アクセスログの保存と表示

実装方法:

  • ユーザー設定画面(許可済みアプリ一覧)はフルスクラッチで実装

まとめ

サードパーティ連携を導入する際の重要なポイント:

必ず決めること

  1. スコープ設計: どのデータ・機能を第三者に公開するか
  2. トークン戦略: 有効期限、リフレッシュトークンの扱い
  3. 許可の管理: ユーザーがいつでも取り消せる仕組み

idp-serverが提供すること

  • OAuth 2.0標準フローの実装(認可コード発行、トークン発行)
  • スコープ定義と管理
  • トークンのローテーション、有効期限管理
  • トークン失効

自分で実装すること

  • 許可確認画面(UIのフルスクラッチ実装)
  • ユーザー設定画面(許可済みアプリ一覧、取り消し機能)
  • リソースサーバー側のスコープチェック(アクセス制御)

セキュリティの注意点

  • 最小権限の原則: 必要なスコープのみ要求
  • トークンの短命化: アクセストークンは短く(1時間程度推奨)
  • ユーザーの透明性: 何にアクセスされているかユーザーが把握できるように

テンプレートで試す

ローカル環境ですぐに試せるテンプレートが用意されています。

cd config/templates/use-cases/third-party
./setup.sh

セットアップ後の動作確認は VERIFY.md を参照してください。

詳細: config/templates/use-cases/third-party/

関連ドキュメント


最終更新: 2026-01-27