
アクセス権限のないアプリにJavaScriptからだけアクセスを許可する方法
2021-9-30
2021-9-3
KintoneでAPIを使用する際、APIを介してアクセスする各アプリの権限は、そのアカウントに対するアクセス権限に依存します。
例えば、在庫マスターアプリと在庫一覧アプリが存在し、従業員Aさんは在庫一覧アプリにのみアクセスできる設定がされているとします。
この場合、Aさんのアカウントで実行されたJavaScriptにも同様のアクセス権限が適用されるため、在庫マスターアプリにアクセスするようなJavaScriptが実行されたとしても、アクセスすることができずエラーとなります。
このため現在の仕様では、JavaScriptからだけアクセスしたい場合でも、そのアカウントにアクセスできる権限を付与する必要があります。
しかし、それぞれのアカウントにアプリは表示したくないけど、APIだけ利用したい。(ユーザは閲覧することができないが、内部的にはアクセスしたい)といった場合もあるかと思います。
今回はこの対処方法を紹介します。
- この方法はKintoneが本来想定している仕様から外れた操作になるため、アップデートにより突然実行できなくなる可能性があります。十分注意してご利用下さい。
結論
まず結論からお伝えすると、APIトークンを発行することで対応します。
公式のcybozu developer networkには、
※APIトークンはREST APIを実行するためのトークンであるため、JavaScript API内では利用できないので注意してください。
とありますが、同じくKintoneが用意しているproxy APIを使用すれば動作します。
余談ですが、Kintone REST APIの認証方法にはID、パスワードを使う方法と、APIトークンを使用する方法があります。
今回の例に関わらず、セキュリティリスクを抑えたいのであれば、REST APIを利用する場合は、APIトークンによる認証を使うべきです。
APIトークンについて
2014年6月までは、REST APIにおける認証には、ユーザID、パスワードを使う他ありませんでした。現在はその代わりに、アプリ単位で発行されるAPIトークンを使用することでも、APIを利用できるようになっています。
APIトークンを利用することで、より的を絞った使用が可能になります。
公式にも記載されていますが、APIトークンを使うことで、以下のようなメリットがあります。全て、機能を絞ることによるセキュリティリスクの軽減と言えます。
- ユーザIDとパスワードが必要ない
- 限られたアプリにのみ、REST APIを実行できる
- 実行できるREST APIの種類を制限することができる
ID、パスワードによる認証方法だと、どうしてもアカウント情報が分散されてしまうため、メンテナンス性も、セキュリティもあまりよくありません。全権限を使用したい場合でも、基本的にはAPIトークンを利用した認証方法が望ましいと思います。
アクセス権限のないアプリにアクセスする方法
本題ですが、冒頭でお話した、
それぞれのアカウントにアプリは表示したくないけど、APIだけ利用したい
といった場合の実装方法です。
const useBackdoor = (uri, method, param, apiToken) => {
const header = { "X-Cybozu-API-Token": apiToken };
let uri = kintone.api.url("/k/v1/record", true);
let body = "";
if (typeof param === "string") {
uri += encodeURI(param);
} else {
header["Content-Type"] = "application/json";
body = param;
}
return kintone.proxy(uri, method, header, body);
};
今回のコードではグローバル変数のkintoneに関数を追加していますが、通常のjavascript APIのように即時関数の中だけで関数を定義し利用しても構いません。
処理としては、kintoneから一度外に出て、別のkintoneにアクセスするようなイメージです。