Box Developer Blog
Published in

Box Developer Blog

Box Python SDKとOAuth 2.0の使用

クライアント側OAuth 2.0は、Box APIに対してユーザーを認証するための最も簡単な方法の1つです。これは、ユーザーがアプリケーションから他のアプリケーションにある自分のデータにアクセスできるようにすることを目的としたオープンスタンダードです。

この記事では、Box OAuth 2.0 APIを使用して、ユーザーが自分のBoxアカウントへのアクセスをアプリに許可できるようにする方法について説明します。

要件

サンプルアプリ

こちらのリポジトリを複製すると、この演習の最終結果を確認できます。詳細については、readmeを参照してください。

Boxアプリの作成

OAuth 2.0を使用するよう構成されたBoxアプリケーションが必要になります。

最初に、Box.comアカウントを取得する必要があります。

アカウントを取得したら、Box開発者コンソールに移動し、アプリを作成または構成します。

アプリの作成

[構成] タブで、[OAuth 2.0資格情報] を探し、クライアントIDとクライアントシークレットを書き留めておきます。

OAuth 2.0資格情報

リダイレクトURIも構成する必要があります。リダイレクトURIは、承認コードを送信して承認プロセスを続行する際にBox.comによってブラウザがリダイレクトされる場所になります。

最後に、CORSドメインを、アプリで使用するものに設定する必要があります。

Box OAuth 2.0

OAuth 2.0は、通常、3つの手順で構成されています。それでは、始めましょう。

手順1: 承認コードを取得する

本来、この手順では、アプリケーションからBoxユーザーのリソースにアクセスする必要があることをBox APIに指示します。Box Python SDKのOAuth2クラスには、必要なものがすべて揃っています。

このメソッドでは、ユーザーのリダイレクト先となるURLが返されるだけです。サンプルのURLは次のようになります。

https://account.box.com/api/oauth2/authorize?
state=box_csrf_token_HMu2KmBMQUuPYNPI&
response_type=code&
client_id=w4a96f3tlv72rh9cxgt7jofad52rtrd9&
redirect_uri=https%3A%2F%2Fbox-dev.barduino.net%2Fui-elements-oauth%2Foauth%2Fcallback

状態: 実際にレスポンスがこの特定のリクエストによって発生したかどうかを確認するためにアプリで使用される一意の文字列 (予測は難しく、同じものが使用されることはありません) を表します。

レスポンスタイプ: レスポンスタイプが常に「code」になるようにアクセスコードを取得する必要があります。

クライアントID: アプリケーションの一意の識別子を表します。

リダイレクトURI: アクセスコードを処理する、アプリ内のエントリポイント。これは、Boxアプリの構成と一致している必要があります。

ご覧のとおり、OAuth2.Get_Authorization_URLによって、URL全体と状態 (別名、CRSFトークン) が生成されます。この状態は、後で確認できるようにアプリに保存する必要があります。あとは、ブラウザを認証用URLにリダイレクトするだけです。

この例では、次のように、その処理だけを実行するページがあります。

このアプリの承認プロセスを開始するためにユーザーを招待します。

ユーザーは、Box.comの承認ページにリダイレクトされます。

その後、ユーザーはBox.comにログインし、アプリにアクセスを許可する必要があります。アプリの構成で指定した権限が要求されていることに注意してください。

手順2: OAuthコールバックを処理する

その後、ブラウザは、アプリのエントリポイント (OAuthコールバック) にリダイレクトされます。次に例を示します。

http://localhost:5000/oauth/callback?
state=box_csrf_token_DqbEFHUzaBxxx0l7&
code=JeRZftRFSvbTtZ3OXAyDHntpTUIkTPyq

この時点で、アプリでは、このリダイレクトの状態が最初のリクエストの状態と一致しているかどうかを確認する必要があります。一致しない場合、再度処理を開始する必要があります。

さらに、このOAuthコールバックでエラーも処理できるはずです。最も一般的なのは、ユーザーがアプリを承認しないエラーです。

手順3: アクセストークンを取得する

アプリでアクセスコードを取得したら、それを適切なアクセストークンに交換できます。

Box SDKのOAuth2クラスは、その処理にも役立ちます。

アクセストークンを取得したら、APIへのリクエストの送信を開始することも、UI Elementsでアクセストークンを使用することもできます。

ただし、まだ終わりではありません。

まとめ

Python Box SDKのOAuthクラスとClientクラスで自動的にトークンを更新できますが、ユーザーがアプリを繰り返し承認する必要がなくなるようにこれらのトークンを保存する方法が依然として必要です。

アクセストークンの有効期間は60分ですが、更新トークンの有効期間は60日です。また、更新トークンは1回しか使用できません。

そのため、アクセストークンが期限切れになると、SDKでは更新トークンを使用して新しいアクセストークンを取得し、同時に新しい更新トークンを取得します。更新トークンが期限切れになった場合、ユーザーは、アプリを再度承認する必要があります。

また、クリアテキストのパスワードを保存しないのと同様、暗号化されていないトークンは保存しないでください。

最後に、UI Elementsは、アクセストークンを必要とするJavaScriptコンポーネントです。その他のJavaScriptオブジェクトと同様、これはブラウザツールを使用して確認できます。ユーザーアクセストークンは、その権限がUI Elementのコンテキストのみで有効になるようにダウンスコープする必要があります。

それでは、暗号化から見ていきましょう。

トークンの暗号化

通常パスワードを取得できないようにハッシュ化されているパスワードとは異なり、トークンはデータベースから読み取る必要があるため、何らかの形で暗号化を使用する必要があります。

暗号化は幅広いトピックのため、この例では、Python Fernetを使用して簡潔に説明します。この例での実装は理想的ではなく、これらのトークンを暗号化する必要があることを強調しているだけです。

上記のメソッドは、トークンの読み取りまたは書き込み時に使用されます。

トークンの保管

各ユーザーは1組のアクセストークンと更新トークンを所有するため、それらのトークンをユーザープロフィールに暗号化された状態で保存します。

Box Python SDKには、トークンが取得または更新されるたびにメソッドを実行できるようにするコールバックがあります。コールバックをstore_tokensパラメータに渡します。

store_tokens() メソッドは次のとおりです。

OAuthクラスでトークンの取得または更新が必要になるたびに、ユーザープロフィールが更新されます。

トークンのダウンスコープ

より制限の厳しいアクセストークンを取得するために、ユーザーアクセストークンを取得し、UI Elementsに付与された特定の権限を使用してそのトークンを「ダウンスコープ」します。各Elementはさまざまなアクセスレベルをサポートしています。

ダウンスコープされたアクセストークンの使用

アプリは、UI Elementsで使用するアクセストークンが必要になるたびに、downscoped_access_token_get() メソッドを呼び出すことができます。

Clientクラスの使用

アプリでAPIを直接使用する必要がある場合は、Clientクラスをインスタンス化するだけです。このクラスは、Box API全体への入り口となります。

たとえば、このデモでは、ユーザーに対してルートフォルダへのファイルのアップロードについて警告するために、アップローダーUI Elementのアップロード先フォルダが作成されているかどうかを確認する必要があります。

また、プレビューアーでは、アプリがデモフォルダにあるすべてのファイルを探して、そのリストをプレビューアーUI Elementに渡します。

このOAuth 2.0の例では、Box Python SDKとUI Elementsを組み合わせています。

この組み合わせにより、一からやり直して必要なすべてのインターフェースを設計する必要なく、アプリでは、ユーザーがBox.comに保存されているコンテンツを自身のセキュリティコンテキストを使用して操作できるようになります。

Box Python SDKは、承認プロセスの管理に役立つほか、Box.com API全体へのアクセスも提供します。

あとは、いくつかアプリを作成するだけです。

--

--

News and stories for working with the Box APIs

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store