box?

これ

クラウドストレージサービスで、APIが提供されています。

APIで何ができんの?

これ

boxでは、超最強管理者権限をもっていると管理配下のユーザーになりすますことができます。(As-User API)
これをプログラム上から使うことで、自動で

  • 特定用途のフォルダを全ユーザーに作成できたり
  • 不適切なファイルを勝手に削除できたり
  • 不適切なコラボレータ設定を直したり

色々できちゃいます!

As-Userを利用しなくても自分の生活を豊かにするあら便利なアプリの作成は可能です。

もっと応用すると

  • S3にファイルが置かれたらバックアップをbox上に保存する
  • Slackに投稿されたファイルをboxにおく(ファイルの有効期限設定してる場合とかに有効/Slackが漏れても画像とかの面に関しては安心)

ちなみに僕はこれで権限のないユーザでも公開アップロード専用Webページと管理画面を作成しました。
めっっっっっっちゃ便利でセキュアなのでだいぶ有益でした。そのうち公開します。

どうやって開発するの?

公式のSDKが提供されています。
先の公開アップロード専用Webページは、公式SDKとAPIを使って実現してます。

GitHub

boxの開発者みたいなロールを管理者から付与されると、左ペインに 開発者コンソール のリンクがでてきます。
そのリンクから各種アプリ設定を行い、AccessKey/SecretKeyを作成することで独自のアプリの作成が開始できます。

ただ注意点があって、上記SDKはNode.js用なので、webアプリでは使えません。
webから使う場合は、ワンタイムキーを都度発行する必要があり超冗長なコードになります。

なので、以下のようなPromiseを返却する なんかそれっぽい moduleつくっちゃった方が楽でしょう。

token.js

import * as config from '../config';
import axios from 'axios';

axios.defaults.baseURL = config.api_uri;

export default {
    request() {
        const refreshToken = localStorage.getItem('refresh_token') || null;
        const code = localStorage.getItem('code') || null;

        let params = {
            client_id: config.client_id,
            client_secret: config.client_secret
        };

        if (refreshToken) {
            params['grant_type'] = 'refresh_token';
            params['refresh_token'] = refreshToken;
        } else {
            params['grant_type'] = 'authorization_code';
            params['code'] = code;
        }

        return axios.post("/oauth2/token", this.buildParams(params));
    },

    header(data) {
        this.save(data);
        return {
            Authorization: `Bearer ${data.access_token}`
        };
    }
}

余談

ちなみに先日、Node.jsのSDKが全体的にPromisifyされたのですごく使いやすくなりました。
docsの更新はされてないのにREADMEが更新されてて気づくのに遅れました。

before.js

client.folders.get('12345',  {fields: 'name'}, (err, data) => {
  //
});

after.js

client.folders.get('12345',  {fields: 'name'})
    .then(result => {
        //
    })
    .catch(error => {
        //
    })

よいboxライフを!

元記事はこちら

boxのAPIのおかげで身長が3cm伸びました