Frame.io TypeScript SDK — 認証ガイド
Frame.io TypeScript SDK — 認証ガイド
このガイドでは、Frame.io TypeScript SDK(frameio)を使用してFrame.io APIで認証する方法について説明します。Frame.io V4 APIはAdobe Identity Management Service(IMS)、アドビのOAuth 2.0アイデンティティプラットフォームを使用します。
これはTypeScript/JavaScript開発者向けのスタンドアロンリファレンスです。以下のすべてのコード例とフローはframeioパッケージのみを対象としています。
TypeScript SDKの認証タイプ
TypeScript SDKは、4つのOAuth認証クラスと、トークンを直接使用する方法をサポートしています。
Server-to-Serverは、ユーザーの操作なしでアプリをサービスアカウントとして動作させます。これは、Adobe Admin Consoleで管理されているFrame.io V4アカウントでのみ利用できます。
Web AppとSPAは、アプリを特定のユーザーとして動作させます。どちらも内部的にAdobe IMSを使用します。ユーザーがアプリを認可し、SDKは結果のコードをトークンと交換します。TypeScript SDKは、IMSの/authorize/v2および/token/v3フローを処理します。Web Appにはクライアントシークレットが必要ですが、SPAは代わりにPKCEを使用します。
Native AppはSPAと同じPKCEフローに従いますが、Adobeがネイティブアプリ資格情報に割り当てるadobe+<hash>://callbackリダイレクトURIを使用します。これにより、認可後にOSレベルでアプリケーションがリダイレクトをインターセプトできます。
サービスアカウントユーザー
Server-to-Server認証を使用する場合、アプリケーションはサービスアカウントユーザーとして動作します。これは、サービスに代わってアクションを実行できる独特なアカウントタイプです。これらはFrame.ioの他のユーザーに表示されます。サービスアカウントがアクションを実行すると、その名前がUIに表示されます。
Adobe Admin ConsoleとDeveloper Consoleを通じてサービスアカウントアクセスを付与および取り消すことができます。サービスアカウント名はFrame.io UIから管理されます。デフォルトでは、最初のS2S接続はService Account User、2番目はService Account User 2、というように名前が付けられます。
詳細については、Frame.ioサーバー間サポートを使用した設定の自動化を参照してください。
クイックスタート
前提条件
-
Adobe Developer Consoleからの資格情報:
- Client ID — すべてのOAuthフローに必要
- Client Secret — Server-to-ServerおよびWeb Appフローに必要
- Redirect URI — Web App、SPA、Native Appフローに必要。Adobeプロジェクトに登録する必要があります
-
SDKをインストール:
方法の選択
- ユーザーが関与しない場合: Server-to-Server(
ServerToServerAuth)を使用します。 - ユーザーが関与し、シークレットを保存できる場合: Web App(
WebAppAuth)を使用します。 - ユーザーが関与するが、シークレットを保存できない場合: ** ブラウザーアプリにはSPA**(
SPAAuth)を、デスクトップ/モバイルアプリにはNative App(NativeAppAuth)を使用します。
アクセストークン
既にアクセストークンがある場合(他のOAuthシステムまたは以前の交換から、例えばAPI Explorer経由)、直接渡すことができます:
これは最もシンプルなアプローチですが、トークンは最終的に期限切れになり、SDKは自動的に更新しません。
レガシーデベロッパートークン
Adobe Admin Consoleでまだ管理されていないV4移行アカウントの場合、Frame.io developer siteからのレガシーデベロッパートークンを引き続き使用できます。x-frameio-legacy-token-authヘッダーを含め、trueに設定する必要があります:
レガシーデベロッパートークンは期限切れになりませんが、移行メカニズムです。新しい統合と本番ワークロードには、以下のOAuth 2.0フローのいずれかを使用することをお勧めします。詳細については、移行ガイドを参照してください。
Server-to-Server(クライアント資格情報)
ユーザーの操作なしにFrame.ioアクセスが必要なバックエンドサービスやスクリプトに使用します。このフローは、Adobe Admin Consoleで管理されているFrame.io V4アカウントでのみ利用できます。アプリケーションは、人間のループなしでサービスアカウントユーザーとして認証されます。
これで完了です。auth.getToken()は、SDKがすべてのリクエストで呼び出す非同期関数です。現在のトークンがまだ有効な場合は、すぐに戻ります。期限切れが近い場合は、完全に透過的に新しいトークンを最初に取得します。
仕組み
クライアント資格情報(クライアントID + シークレット)は期限切れになりません。セキュリティ衛生のために手動でのみ回転させます。S2Sは、手動介入なしで効果的に永続的で中断のないAPIアクセスを提供します。
内部的には:
- 最初のAPI呼び出しで、
getToken()はclient_credentials付与を使用してAdobe IMSから新しいアクセストークンをリクエストします。 - トークンはメモリにキャッシュされます。個別のアクセストークンは期限切れになりますが(通常24時間)、これは自動的に処理されます。
- キャッシュされたトークンが更新バッファー内にある場合(デフォルト:期限切れの60秒前)、SDKは同じクライアント資格情報を使用して自動的に新しいトークンを取得します。
- リフレッシュトークンは関与しません。クライアント資格情報自体が長期間有効なシークレットであり、常に新しいアクセストークンを発行するために使用できます。
明示的な認証
トークンを積極的に取得したい場合(例えば、起動時に不正な資格情報で高速に失敗させるため):
Webアプリ(認証コード)
ユーザーがAdobe IDでログインするサーバーサイドアプリケーションに使用します。このフローにはクライアントシークレットが必要で、サーバーに安全に保存する必要があります。
完全なExpressの例
シングルページアプリケーション / PKCE(認証コード + PKCE)
ブラウザーベースのアプリケーション、デスクトップアプリケーション、またはクライアントシークレットを安全に保存できないCLIツールに使用します。このフローはPKCE (RFC 7636)を使用して認証コード交換を保護します。
codeVerifierは認証リクエストとコード交換の間、クライアント側で安全に保存する必要があります。ブラウザーアプリではsessionStorageまたは同等のものを使用してください。
ネイティブアプリ(認証コード + PKCE)
デスクトップおよびモバイルアプリケーションに使用します。Adobe Developer Consoleでネイティブアプリ資格情報を作成すると、Adobeはadobe+<hash>://callbackの形式のリダイレクトURIを割り当てます — OSレベルでそのカスタムURIスキームを処理するようにアプリケーションを登録します。ループバックリダイレクト(http://127.0.0.1:<port>/callback)もローカル開発でサポートされています。フローはSPAと同じです — クライアントシークレットなしでPKCEを使用します。
リダイレクトURIルール
Adobeは2つのポイントでリダイレクトURIルールを適用します:Adobe Developer Consoleで資格情報を登録するときと、redirect_uriパラメーターが/authorize/v2エンドポイントにヒットするときです。このSDKでredirectUriに渡す値は、資格情報に登録した「リダイレクトURIパターン」のいずれかと一致する必要があります — そうでなければ、Adobeは代わりに資格情報のデフォルトリダイレクトURIにリダイレクトします。
- Web AppおよびSPA資格情報にはHTTPSが必要です。
- Native App資格情報は非HTTPSリダイレクトを使用します — 通常はDeveloper Consoleで資格情報に表示される
adobe+<hash>://callbackURIです。
資格情報で受け入れられる正確なパターンについては、Adobe Developer Consoleを参照してください。
Python SDKにはNative App資格情報クラスは含まれていません。Pythonにはカスタム URIスキームハンドラーを登録する標準的な方法がないためです。TypeScript SDKはNative Appを含むすべての4つの資格情報タイプをサポートしています。
手動トークン更新
Web App、SPA、およびNative Appフローでは、SDKはgetToken()を介してトークンを自動的に更新します。明示的な制御が必要な場合は、refresh()を直接呼び出すことができます:
これは、自動更新バッファーに依存するのではなく、重要な操作の前に強制的に更新したい場合に便利です。
refresh()はWebAppAuth、SPAAuth、およびNativeAppAuthで利用できます。リフレッシュトークンが利用できない場合(つまり、最初にexchangeCode()を呼び出す必要がある場合)、ConfigurationErrorをスローします。ServerToServerAuthにはrefresh()メソッドがありません — 代わりにクライアント資格情報を介して新しいトークンを取得するためにauthenticate()を使用します。
トークンの永続化
すべての認証クラスは、再起動間でトークン状態を永続化するためにexportTokens()とimportTokens()をサポートしています。Webアプリ、SPA、ネイティブアプリのフローでは、アクセストークンとリフレッシュトークンがデフォルトでメモリに保存されるため、これは特に重要です。アプリケーションが再起動すると、トークンを永続化しない限り、ユーザーは再認証する必要があります。Server-to-Serverでは、永続化はオプションです(クライアント資格情報は常に新しいトークンを発行できます)が、キャッシュされたトークンをインポートすることで、起動時の余分なラウンドトリップを回避できます。
エクスポートとインポート
エクスポートしたトークンは安全に保存してください。これらにはAPIアクセスを付与するアクセストークンとリフレッシュトークンが含まれています。本番環境ではプレーンテキストファイルへのトークンの書き込みは避けてください。
onTokenRefreshedによる自動永続化
トークンが更新されるたびに自動的に永続化するには、onTokenRefreshedコールバックを使用します:
コールバックはexportTokens()と同じ形式を受け取り、トークンの更新が成功するたびに実行されます。
トークンの取り消し
ユーザーをログアウトし、Adobe IMSでトークンを無効にするには:
これにより、Adobe IMSに対して2つのベストエフォート取り消しリクエストが並行して実行されます。1つはアクセストークン用、もう1つはリフレッシュトークン用で、すべてのローカルトークン状態がクリアされます。機密クライアント(WebAppAuth)の場合、取り消しリクエストはHTTP Basic Authを使用します。パブリッククライアント(SPAAuth、NativeAppAuth)の場合、client_idはクエリパラメータとして送信されます。取り消しエラーはログに記録されますが、スローされません。取り消し後、ユーザーは再認証する必要があります。
エラーハンドリング
すべての認証エラーはFrameioAuthErrorから継承されるため、広範囲にキャッチするか、特定のケースを処理できます:
エラーリファレンス
本番環境での期限切れリフレッシュトークンの処理
Webアプリ、SPA、およびネイティブアプリフローでは、リフレッシュトークンは最終的に期限切れになります。その場合、getToken()はTokenExpiredErrorをスローします。これをキャッチして、ユーザーを再度認証フローにリダイレクトする必要があります。
設定リファレンス
これらのパラメーターには適切なデフォルト値があり、設定が必要になることはほとんどありません。動作をカスタマイズする必要がある場合(ステージングIMSを指定する、カスタムfetchを挿入する、タイムアウトを調整する、ロガーを接続するなど)は、認証クラスを構築する際にオプションパラメーターとして渡してください:
ステージング環境
imsBaseUrlをオーバーライドしてステージングのAdobe IMSインスタンスを指定します。SDKはDEFAULT_IMS_BASE_URL(https://ims-na1.adobelogin.com)もエクスポートしており、プログラム的に本番環境の値を参照する必要がある場合に使用できます。
カスタムfetch
プロキシサポートやカスタムTLS設定の場合:
同時実行の安全性
TypeScript SDKは同時使用に対して安全です。複数のgetToken()呼び出しが同時に発生し、更新が必要な場合、更新リクエストは1つだけ実行されます。他の呼び出しは同じプロミスを待機し、同じ結果を受け取ります。外部ロックは必要ありません。
この重複除外は、JavaScriptのシングルスレッドイベントループと共有Promiseを使用します — 更新が既に実行中の場合、同時呼び出し元は2番目のリクエストを開始する代わりにそれに参加します。
更新の実行中にrevoke()が呼び出された場合、更新はAuthenticationErrorで拒否され、トークンはクリアされたままになります — 取り消しが常に優先されます。