Skip to main content
OAuthアプリを使うと、メンバーが個別にAPIキーを発行しなくても、社内ポータルがそのメンバーのノートを代わりに取得できます。メンバーはTiroへのログインと同意画面を一度通るだけで、アプリはそのユーザーが持つ権限の範囲内でのみ動作します。

どのようなときに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 IDClient Secret が表示されます。Client Secretが表示されるのはこのときの1回限りで、あとから確認することはできません。サーバーの環境変数など、安全な場所にすぐ保存してください。
http://localhost はリダイレクトURIとして登録できません。ローカルで開発する場合は、HTTPSトンネルや開発用のドメインをリダイレクトURIとして登録し、そのURLからコールバックをローカルへ転送する構成にしてください。
OAuthアプリの登録画面は、順次公開しています。メニューが表示されない場合は、導入担当マネージャーまたはpartners@theplato.ioへご依頼いただければ、アプリを発行いたします。
Client Secretは、登録画面を閉じるとどこからも再表示できません。紛失した場合は、アプリを新しく登録するか、担当マネージャーへ再発行をご依頼ください。アプリを破棄すると、そのアプリで結ばれたユーザーの接続もあわせて解除されます。

リクエストできるスコープ

OAuthアプリがリクエストできるのは、ユーザーが委任できるスコープのみです。組織管理用のスコープ(organization_member:*workspace:*session:write)は委任できず、組織APIキーでのみご利用いただけます。 アプリが実際に届く範囲は、ユーザーが同意したスコープと、そのユーザーがTiroで持つ権限が重なる部分です。ユーザーが閲覧できないワークスペースやノートは、スコープの同意を得ても取得できません。

ステップ2. ユーザーの同意を得る

アプリからユーザーをTiroの認証ページへ遷移させます。まずランダムな code_verifier を生成し、その文字列をUTF-8バイトでSHA-256ハッシュしたあと、パディングなしのBase64URLでエンコードした値を code_challenge として送ります。16進数の文字列やハッシュの生バイトをそのまま送ると、トークン交換の段階で拒否されます。
ユーザーがTiroアカウントでログインし、同意画面でアプリ名とリクエストされたスコープを確認して承認すると、リダイレクトURIへ codestate が返ります。

コールバックではstateを必ず検証してください

トークンを交換する前に、まず state を確認します。authorizeリクエストのときに生成した値をユーザーのセッションに保存しておき、コールバックで返ってきた値と一致するか比較したうえで、保存した値を削除します。値がない場合や一致しない場合は、その時点でリクエストを中断します。 この検証を省くと、攻撃者が開始した認証の結果が被害者のセッションに結び付き、被害者が知らないアカウントへ接続されるログインCSRFが可能になります。
SSOを利用している組織のメンバーは、同意画面の前に、普段どおり社内のIdPでログインします。同意画面はそのメンバーのTiroアカウントを基準に表示され、アプリが引き継ぐのもそのアカウントの権限だけです。

ステップ3. トークンを交換する

検証を終えた code を、サーバー側でアクセストークンに交換します。Client Secretはサーバーでのみ扱い、ブラウザやアプリのコードには入れないでください。認可コードは一度しか使えないため、2回送ると invalid_grant で拒否されます。
クライアント認証は、HTTP Basicとボディのパラメータ(client_idclient_secret)の両方に対応しています。
expires_in は秒単位の残り時間で、アプリの設定によって変わります。値をコードに固定せず、レスポンスで返ってきた値をそのままお使いください。レスポンスに refresh_token があわせて返るアプリは以下の更新手順に従い、返らないアプリは、有効期限が切れる前にユーザーを再び認証ページへ遷移させてください。

ステップ4. APIを呼び出す

アクセストークンは、APIキーと同じ方法で Authorization ヘッダーに入れます。呼び出せるエンドポイントとレスポンス形式は、API概要にまとめたものと同じです。
レスポンスに含まれるノートは、同意したユーザーがアプリで閲覧できる範囲です。そのユーザーのアカウントAPIキーで呼び出したときと同じになります。

ステップ5. トークンを更新する

トークン交換のレスポンスに refresh_token があれば、ユーザーから改めて同意を得ることなく、新しいアクセストークンを取得できます。
  • リフレッシュトークンは一度しか使えません。レスポンスに新しいリフレッシュトークンが返ってきたら、以前の値は破棄して新しい値を保存してください。
  • 使用済みのリフレッシュトークンを再送すると、盗用と判断して、そのユーザー接続のトークンをすべて無効化します。この場合は、ユーザーから改めて同意を得る必要があります。
  • 長期間更新されていない接続は期限切れになります。更新のたびに有効期限が延びるため、継続して使っている接続が切れることはありません。
  • アプリを破棄した場合や、ユーザーが接続を解除した場合、更新は拒否されます。
更新リクエストを送ったあと、ネットワークの問題でレスポンスを受け取れなかった場合は、同じリフレッシュトークンを再送しないでください。サーバー側ではすでに入れ替えが完了している可能性があります。保存したトークンを削除して、ユーザーに再認証をご案内するほうが安全です。

接続を解除する

ユーザーがアプリの利用をやめた場合は、リフレッシュトークンを破棄して接続を解除します。すでに発行済みのアクセストークンは、expires_in を過ぎれば自然に期限切れになります。

サーバーメタデータ

エンドポイントと対応方式は、標準のメタデータ文書で確認できます。

よくあるエラー


関連ページ: 認証 · 組織単位の連携 · API概要