Box Python SDKとJWTの使用
JSONウェブトークン (JWT) を使用するサーバー側の認証は、Box APIで認証するための最も一般的な方法です。JWTは、効果的にサーバー間認証を実現するよう設計されたオープンスタンダードです。
この記事では、JSONウェブトークン (JWT) を使用するBoxのサーバー側の認証の使用方法について説明します。
Box OAuth 2.0では、アプリケーションがユーザーのセキュリティコンテキスト内でユーザーに代わってAPIを呼び出しますが、JWTによるBoxのサーバー側の認証を使用する場合、アプリケーションには独自のセキュリティコンテキストがあるため、アプリケーションが特定のユーザーの代わりとなる場合もあれば、ならない場合もあります。
JWTを使用したサーバー側の認証は、以下に当てはまるアプリに最適な認証方法です。
- Boxアカウントを持たないユーザーが使用する
- 独自のIDシステムを使用する
- ユーザーにBoxを使用していることを認識させたくない
- アプリケーションのBoxアカウント内にデータを保存し、ユーザーのBoxアカウントには保存しない
要件
サンプルアプリ
こちらのリポジトリを複製すると、この演習の最終結果を確認できます。詳細については、readmeを参照してください。
Boxアプリの作成
JWTを使用するよう構成されたBoxアプリケーションが必要になります。
最初に、Box.comアカウントを取得する必要があります。
アカウントを取得したら、Box開発者コンソールに移動し、アプリを作成または構成します。
この例では、デフォルトのアプリケーションスコープで問題ありませんが、アプリの機能に応じて、アプリケーションスコープの変更が必要になる場合があります。
CORSドメインを設定します。
公開キーと秘密キーのペアを生成します。
config.jsonファイルがダウンロードされ、そのファイルに暗号化された秘密キーが含まれています。このキーは他の場所には保存されません。そのため、このファイルをなくした場合は、新しいキーペアを生成する必要があります。
このファイルは、後で認証を設定する際に使用します。
次に、承認を得るためにアプリを送信します。
Box.comのEnterprise管理者は、リクエストが記載されたメールを受け取ると、アプリの承認を続行できます。開発者アカウントを使用している場合は、自分でアプリを承認できます。
直接、管理コンソールのカスタムアプリマネージャに移動します。
JWTを使用したBoxのサーバー側の認証
JWTを使用してBoxに対して認証を受けるプロセスは簡単です。
手順1: JWTを使用して認証する
これは、Box Python SDKのJWTAuthクラスで処理されます。
from_settings_file() メソッドを使用して、ダウンロードしたconfig.jsonファイルを読み取ります。
store_tokensパラメータを使用して、アクセストークンを格納するためにcallableを渡します。
既存のアクセストークンを渡します。JWTAuthクラスは、有効なアクセストークンがまだあるかどうかを確認し、ない場合は自動的に新しいアクセストークンを取得します。
必要に応じて、各パラメータを手動で指定することもできます。以下に例を示します。
暗号化された秘密キーファイルへのパスがあることに注意してください。
authenticate_instance() メソッドが認証API呼び出しをトリガーすると、アクセストークンが返されます。
手順2: API呼び出しを行う
Clientクラスは、API呼び出しを行うための入り口で、JWTAuthインスタンスを受け入れます。これは、次のように簡単に指定できます。
JWTを使用する場合、(OAuth 2.0のように) 更新トークンはありません。アクセストークンの有効期限が切れると、JWT認証が再度使用されます。
まとめ
この例では、アクセストークンを必要とするUI Elements JavaScriptコンポーネントを使用しています。その他のJavaScriptオブジェクトと同様、これはブラウザツールを使用して確認できます。
トークンのダウンスコープ
より制限の厳しいアクセストークンを取得するために、アクセストークンを取得し、UI Elementsに付与された特定の権限を使用してそのトークンを「ダウンスコープ」します。各Elementはさまざまなアクセスレベルをサポートしています。
上記の例では、トークンの有効期限が切れているかどうかを確認するのではなく、flask_cachingを試しています。
ダウンスコープされたアクセストークンの使用
アプリは、UI Elementsで使用するアクセストークンが必要になるたびに、jwt_downscoped_access_token_get() メソッドを呼び出すことができます。
Clientクラスの使用
アプリでAPIを使用する必要がある場合は、Clientクラスをインスタンス化するだけです。
例えば、アップロードを保持するデモフォルダをアプリで作成する場合は、次のようになります。
また、アプリでデモフォルダ内のファイルを取得する場合は、次のようになります。
このJWTの例では、Box Python SDKとUI Elementsを組み合わせています。
この組み合わせにより、アプリは、独自のファイル、フォルダの所有権、その他すべてのBox機能が備わっているBoxユーザーとして動作することができます。
また、一からやり直して必要なすべてのインターフェースを設計する必要なく、アプリケーションのユーザーがBox.comに保存されているコンテンツを操作できるようにもなります。
Box Python SDKは、承認プロセスの管理に役立つほか、Box.com API全体へのアクセスも提供します。
あとは、いくつかアプリを作成するだけです。