どのようなときにOAuthアプリを使いますか?
OAuthアプリはAuthorization Code方式のみに対応しており、PKCEが必須です。ユーザーを介さずにトークンを取得する
client_credentials 方式は提供していないため、サーバー間の連携にはAPIキーをご利用ください。
ステップ1. OAuthアプリを登録する
組織のアプリは組織の Admin または Developer が、ワークスペースのアプリはワークスペースの Admin が、Tiro Platformで登録します。1
OAuthアプリの画面を開く
Tiro Platformのサイドメニューから、組織またはワークスペースの [OAuthアプリ] メニューを開き、[OAuthアプリを登録] ボタンを押します。
2
アプリ情報を入力する
アプリ名、[リダイレクトURI]、ユーザーにリクエストする [スコープ] を入力します。リダイレクトURIは
https:// で始まる必要があり、URLにユーザー情報や # 以降のフラグメントが含まれていると登録できません。認証後に戻るURLと1文字まで完全に一致する必要があり、登録後は変更できないため、URLが変わった場合はアプリを新しく登録してください。3
Client IDとClient Secretを保存する
登録の直後に、画面へ Client ID と Client Secret が表示されます。Client Secretが表示されるのはこのときの1回限りで、あとから確認することはできません。サーバーの環境変数など、安全な場所にすぐ保存してください。
http://localhost はリダイレクトURIとして登録できません。ローカルで開発する場合は、HTTPSトンネルや開発用のドメインをリダイレクトURIとして登録し、そのURLからコールバックをローカルへ転送する構成にしてください。
OAuthアプリの登録画面は、順次公開しています。メニューが表示されない場合は、導入担当マネージャーまたはpartners@theplato.ioへご依頼いただければ、アプリを発行いたします。
リクエストできるスコープ
OAuthアプリがリクエストできるのは、ユーザーが委任できるスコープのみです。組織管理用のスコープ(organization_member:*、workspace:*、session:write)は委任できず、組織APIキーでのみご利用いただけます。
アプリが実際に届く範囲は、ユーザーが同意したスコープと、そのユーザーがTiroで持つ権限が重なる部分です。ユーザーが閲覧できないワークスペースやノートは、スコープの同意を得ても取得できません。
ステップ2. ユーザーの同意を得る
アプリからユーザーをTiroの認証ページへ遷移させます。まずランダムなcode_verifier を生成し、その文字列をUTF-8バイトでSHA-256ハッシュしたあと、パディングなしのBase64URLでエンコードした値を code_challenge として送ります。16進数の文字列やハッシュの生バイトをそのまま送ると、トークン交換の段階で拒否されます。
ユーザーがTiroアカウントでログインし、同意画面でアプリ名とリクエストされたスコープを確認して承認すると、リダイレクトURIへ
code と state が返ります。
コールバックではstateを必ず検証してください
トークンを交換する前に、まずstate を確認します。authorizeリクエストのときに生成した値をユーザーのセッションに保存しておき、コールバックで返ってきた値と一致するか比較したうえで、保存した値を削除します。値がない場合や一致しない場合は、その時点でリクエストを中断します。
この検証を省くと、攻撃者が開始した認証の結果が被害者のセッションに結び付き、被害者が知らないアカウントへ接続されるログインCSRFが可能になります。
SSOを利用している組織のメンバーは、同意画面の前に、普段どおり社内のIdPでログインします。同意画面はそのメンバーのTiroアカウントを基準に表示され、アプリが引き継ぐのもそのアカウントの権限だけです。
ステップ3. トークンを交換する
検証を終えたcode を、サーバー側でアクセストークンに交換します。Client Secretはサーバーでのみ扱い、ブラウザやアプリのコードには入れないでください。認可コードは一度しか使えないため、2回送ると invalid_grant で拒否されます。
client_id、client_secret)の両方に対応しています。
ステップ4. APIを呼び出す
アクセストークンは、APIキーと同じ方法でAuthorization ヘッダーに入れます。呼び出せるエンドポイントとレスポンス形式は、API概要にまとめたものと同じです。
ステップ5. トークンを更新する
トークン交換のレスポンスにrefresh_token があれば、ユーザーから改めて同意を得ることなく、新しいアクセストークンを取得できます。
- リフレッシュトークンは一度しか使えません。レスポンスに新しいリフレッシュトークンが返ってきたら、以前の値は破棄して新しい値を保存してください。
- 使用済みのリフレッシュトークンを再送すると、盗用と判断して、そのユーザー接続のトークンをすべて無効化します。この場合は、ユーザーから改めて同意を得る必要があります。
- 長期間更新されていない接続は期限切れになります。更新のたびに有効期限が延びるため、継続して使っている接続が切れることはありません。
- アプリを破棄した場合や、ユーザーが接続を解除した場合、更新は拒否されます。
接続を解除する
ユーザーがアプリの利用をやめた場合は、リフレッシュトークンを破棄して接続を解除します。すでに発行済みのアクセストークンは、expires_in を過ぎれば自然に期限切れになります。
サーバーメタデータ
エンドポイントと対応方式は、標準のメタデータ文書で確認できます。よくあるエラー
関連ページ: 認証 · 組織単位の連携 · API概要