BoxAPIを使ってPHPでファイルをアップロード

4 min read読了の目安(約4100字

概要

SDKを利用して認証・アップロードを行う記事はあったのですが、SDKを利用しない記事・ドキュメントが少なくかなり苦労したので、、、誰かこれを見て楽してください!!

カスタムアプリの作成と設定

カスタムアプリをなんで作らなきゃいけないの??👀

カスタムアプリでは、OAuth 2.0およびJWT認証がサポートされます。これらの認証によって、アプリケーションは、ファイルやフォルダを操作できるだけでなく、タスクやリーガルホールドなど、会社レベルのプロパティを操作できるようになります。[1]

カスタムアプリの作成

  1. 開発者コンソールに移動し、マイアプリからアプリの新規作成をクリックする。
  2. 認証方法のダイアログが表示されるので、デフォルトのサーバー認証(JWT使用) を選択し、任意のアプリ名を入力する。

カスタムアプリの設定

カスタムアプリ作成完了後、自動的に構成の設定画面へ遷移します。

  1. アプリケーションスコープ

    • Boxに格納されているすべてのファイルとフォルダへの書き込みのチェックボックスをオンにする
      ※今回の記事は、ファイルをアップロードが必要なので読み取りのみ場合は、無視してOKです!
    • 管理操作については、リファレンスを参考に任意で設定お願いします。
  2. 公開キーの追加と管理

    • 公開/秘密のキーペアを生成をクリックすると、<enterpriseID>.<publicKeyID>.config.jsonファイルがダウンロードされます。後々のAPI認証時に利用します。
  3. アプリを承認する

    • 承認タブをクリックし、確認して送信をクリックします。
    • カスタムアプリを作成したアカウントにメールが送信されるので、メールからアプリをレビューボタンを押し、承認します。承認後、ステータスが有効になっていることを確認してください。

SDKを利用せずにPHPでファイルアップロードを行う

前提条件

  • JWTライブラリをインストールしている [2]
  • HTTPクライアントライブラリ"Guzzle"をインストールしている [3]

Box SDKを使用しないJWT認証

JWTってなに??👀

JSONウェブトークン (JWT) を使用するサーバー側の認証は、Box APIで認証するための最も一般的な方法です。JWTは、効果的にサーバー間認証を実現するよう設計されたオープンスタンダードです。[4]

  1. JSON構成を読み取る
// カスタムアプリ作成時にダウンロードしたJSONファイル
// セキュリティ上git管理外にする必要アリです!
$json = file_get_contents('<enterpriseID>.<publicKeyID>.config.json');
$config = json_decode($json);
  1. 秘密キーを復号化する
$private_key = $config->boxAppSettings->appAuth->privateKey;
$passphrase = $config->boxAppSettings->appAuth->passphrase;
$key = openssl_pkey_get_private($private_key, $passphrase);
  1. JWTアサーションを作成する
$authenticationUrl = 'https://api.box.com/oauth2/token';

$claims = [
  'iss' => $config->boxAppSettings->clientID,
  'sub' => $config->enterpriseID,
  'box_sub_type' => 'enterprise',
  'aud' => $authenticationUrl,
  'jti' => base64_encode(random_bytes(64)),
  'exp' => time() + 45,
  'kid' => $config->boxAppSettings->appAuth->publicKeyID
];
  1. JWTのheaderを構成
use \Firebase\JWT\JWT;
$assertion = JWT::encode($claims, $key, 'RS512');
  1. アクセストークンをリクエストする
use GuzzleHttp\Client;

$params = [
  'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
  'assertion' => $assertion,
  'client_id' => $config->boxAppSettings->clientID,
  'client_secret' => $config->boxAppSettings->clientSecret
];

$client = new Client();
$response = $client->request('POST', $authenticationUrl, [
  'form_params' => $params
]);

$data = $response->getBody()->getContents();
$access_token = json_decode($data)->access_token;

PHPのcURL関数を使ってファイルをアップロードする

// cURL セッションを初期化する
$curl = curl_init();

// cURL 転送用オプションを設定する
curl_setopt_array($curl, array(
                CURLOPT_URL => "https://upload.box.com/api/2.0/files/content",
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "POST",
                CURLOPT_POSTFIELDS => array(
                    'attributes' => '{"name": "Boxで表示されるファイル名", "parent": {"id": "アップロード先のフォルダーID"}}',
                    'file'=> new CURLFILE("アップロードしたいファイルのフルパス")
                ),
                CURLOPT_HTTPHEADER => array(
                    "Authorization: Bearer $access_token",
                ),
)); 

// cURL セッションを実行する
curl_exec($curl);
// cURL セッションを閉じる
curl_close($curl);

参考にさせていただいたもの

https://support.box.com/hc/en-us/community/posts/360049160514-File-upload-using-BOX-API
脚注
  1. https://ja.developer.box.com/guides/applications/custom-apps/ ↩︎

  2. https://github.com/firebase/php-jwt ↩︎

  3. https://packagist.org/packages/guzzlehttp/guzzle ↩︎

  4. https://ja.developer.box.com/guides/authentication/jwt/ ↩︎