秘匿情報を扱うkintoneプラグインを作成してみよう
はじめに
前回までプラグインの作り方の基本を学んできましたが、今回はプラグインのメリットのひとつ「プラグインで秘匿情報を扱う方法」を紹介します。
具体的には、次の3点を学習します。
- 秘匿情報をプラグインの設定情報として保存する方法
- 保存した秘匿情報を取得する方法
- 保存した秘匿情報を使って外部APIのリクエストを送信する方法
プラグインで秘匿情報を扱うメリットとそのしくみは、次のページを参考してください。
kintoneプラグインのメリット:秘匿情報を隠蔽できるためセキュリティが向上する
サンプルプラグインのイメージ
今回は、レコードの編集画面で翻訳ボタンをクリックすると「原文」フィールドの内容を英訳して「訳文」フィールドに書き込むプラグインを作ります。
プラグインでは、翻訳サービスが提供するWeb APIを実行します。
このAPIの実行にはサービスの認証情報が必要ですが、プラグインで認証情報を隠すことで、アプリの利用者に認証情報を漏洩させることなく安全にWeb APIを実行します。
翻訳サービスは、DeepL社が提供している翻訳サービスの無料版を使います。
詳細はDeepLの公式サイトを参考してください。
DeepL API Free
準備するもの
DeepLアカウント作成
次の手順にしたがってDeepLアカウントを作成し、DeepL APIを呼び出すには必要なAPIキーを発行しておきます。
- 次のページからアカウントを登録します。
DeepLアカウント登録 - DeepLにログインします。
- 画面上の[プロダクト]>[DeepL API]をクリック
- 「価格を見る」をクリックし、「無料で登録する」を選択します。
- 登録後の確認メールを確認し、DeepLトップページに戻ります。
- 画面右上からプロフィールのアイコンをクリックし、「アカウント」をクリックします。
- 「APIキーと制限」タブを開き、APIキー右側のアイコンをクリックしてAPIキーをコピーします。
APIキーは後で使うので、メモしておきます。
kintoneアプリ作成
プラグインを動作確認するためのアプリを作成します。
以下のフィールドをアプリのフォームに配置します。
他のフィールドの配置は任意です。
| フィールドタイプ | フィールドコード | フィールド名 |
|---|---|---|
| 文字列(複数行) | source | 原文 |
| 文字列(複数行) | target | 訳文 |
| スペース | なし 要素IDに「button-space」を設定します。 |
なし |
ベースとなるプラグインの作成
これまで習ったことを復習しながら、ベースとなるプラグインを作成します。
まずは、「原文」「訳文」フィールドや「翻訳」ボタンを表示するスペースフィールドを設定画面から指定できるようにします。
-
プラグインの設定画面のHTMLファイル(config.html)を作成します。
コードは、後述の 設定画面のHTMLサンプルソースコード を参考してください。
設定項目のスタイルには、51-modern-defaultを適用しています。
51-modern-default項目名 タイプ 説明 スペースフィールド ドロップダウン 「翻訳」ボタンを配置するためのスペースフィールドを指定します。
スペースフィールドのみ選択可能です。原文フィールド ドロップダウン 原文フィールドを指定します。
文字列(複数行)のみ選択可能です。訳文フィールド ドロップダウン 翻訳結果を保存するための訳文フィールドを指定します。 DeepLキー テキストボックス DeepLアカウント作成でメモしたAPIキーを入力します。
文字列(複数行)のみ選択可能です。 -
設定項目を制御するJavaScriptを記述し、config.jsとして保存します。
ドロップダウンは、@kintone/rest-api-clientフィールド情報を取得する方法を使って、実際のアプリのフィールド情報を選択できるように実装しています。
コードは、後述の 設定画面のJSサンプルソースコード を参考してください。 -
desktop.jsという名前で中身が空白のカスタマイズファイルを作成します。
-
プラグインのアイコンファイルを用意し、icon.pngとして保存します。
お手軽にプラグインを作ってみたい方向けに、今回使ったアイコンファイルを貼っておきます。 -
最後に、マニフェストファイルを作成します。
コードは後述の manifestのサンプルソースコード を参考してください。
マニフェストファイルの書き方は次の記事を参考してください。
プラグインを作成してみよう
最終的なファイル構造は次のようになります。
|
|
設定画面のHTMLサンプルソースコード
|
|
設定画面のJSサンプルソースコード
|
|
manifestのサンプルソースコード
|
|
秘匿情報をプラグインの設定情報として保存する方法
利用するkintone JavaScript API
これまで、プラグインの設定情報を保存するにはkintone.plugin.app.setConfig()を使っていました。
このAPIで保存した情報は、kintone.plugin.app.getConfig()を使って取り出すことができます。
kintone.plugin.app.getConfig()はレコードの画面でも実行できるため、アプリの利用者にも保存した設定情報が見えてしまいます。
そのため秘匿情報の保存には使えません。
その代わり、kintone.plugin.app.setProxyConfig()というkintone JavaScript APIを利用します。
外部APIの実行に必要な情報をプラグインへ保存する
:kintone.plugin.app.setProxyConfig()
このAPIで保存した情報は、kintone.plugin.app.getProxyConfig()というAPIで取得できます。
kintone.plugin.app.getProxyConfig()はプラグインの設定画面でだけ実行できるAPIなので、プラグインの設定画面にアクセス権がないアプリの利用者は、保存した情報を見ることができません。
APIドキュメントによると、kintone.plugin.app.setProxyConfig()に指定する引数は次のとおりです。
kintone.plugin.app.setProxyConfig(url, method, headers, data, successCallback)
- 第1引数:Web APIのURL(文字列)
- 第2引数:HTTPメソッド(文字列)
- 第3引数:リクエストヘッダー(オブジェクト)
- 第4引数:リクエストボディ(オブジェクト)
- 第5引数:
kintone.plugin.app.setProxyConfig()の実行が終わった後の処理
DeepL APIのリクエスト情報
リクエストの内容や、認証情報の指定方法はWeb APIによって異なります。
今回使うDeepL APIに必要な情報を調べてみましょう。
DeepL API
のドキュメントによると、このAPIを実行するには、次の情報が必要です。
| 項目 | 値 |
|---|---|
| URL | https://api-free.deepl.com/v2/translate |
| メソッド | POST |
| リクエストヘッダー |
|
| リクエストボディ |
|
kintone.plugin.app.setProxyConfig()の引数の指定方法に合わせると、コードは次のようになります。
実際のリクエストはカスタマイズファイルから行うので、リクエストボディには空のオブジェクトを指定します。
|
|
では、ベースとなるプラグインにkintone.plugin.app.setProxyConfig()の処理を追加しましょう。
config.jsを開いて、87行目〜91行目を追記します。
また、秘匿情報ではない設定情報を保存処理は、kintone.plugin.app.setProxyConfig()の実行が終わって行います。
そのため、successCallback()の中でkintone.plugin.app.setConfig()を実行するように、97行目〜126行目のように変更します。
|
|
保存した秘匿情報を取得する方法
設定画面を表示したときにkintone.plugin.app.setProxyConfig()で保存した内容が表示されるよう、保存した設定情報を取得し設定項目の初期値としてセットしましょう。
保存した秘匿情報を取得するには、次のAPIを利用します。
外部APIの実行に必要な情報を取得する
:kintone.plugin.app.getProxyConfig()
上記APIドキュメントによると、引数に次の2つを指定します。
- url:Web APIのURL
今回は、 DeepL APIのリクエスト情報 で宣言したapiUrl変数です。 - method:HTTPメソッド
今回は DeepL APIのリクエスト情報 で宣言したmethod変数です。
したがって、コードは次のようになります。
|
|
続いて、取得した設定情報からDeepL APIキーを取り出します。
ヘッダー情報はproxyConfigのheadersプロパティに保存されています。
データ構造は次のとおりです。
|
|
ここでは、DeepL-Auth-Key YOUR_AUTH_KEYに注目してください。
Authorizationの値には、APIキーだけではなく「DeepL-Auth-Key」という文字列が先頭についています。
そのため、次のようにAPIキーだけを取り出す処理が必要になります。
|
|
最後に、テキストボックスのHTML要素にAPIキーをセットします。
|
|
最終的なコードは次のようになります。
|
|
保存した秘匿情報を使って外部APIのリクエストを送信する方法
次はカスタマイズファイルのdesktop.jsを編集していきます。
カスタマイズファイルでは、次の機能を実装します。
- プラグインの設定情報を使って、カスタマイズを適用するフィールド情報を取得します。
- 「翻訳」ボタンをクリックしたときに、DeepL APIを実行し、「原文」フィールドの内容を翻訳して「訳文」フィールドにセットします。
プラグインの設定情報を使ってカスタマイズを適用するフィールド情報を取得する
これまでのチュートリアルで学習した内容の復習です。
プラグインの設定情報を取得して、「原文」「訳文」フィールドのフィールドコードや「翻訳」ボタンを表示するスペースフィールドの情報を取得しましょう。
「翻訳」ボタンを表示するスペースフィールドには、「翻訳」ボタンを表示し、クリックイベントのイベントハンドラーを登録しておきます。
忘れてしまった人は、次のページで復習しましょう。
プラグインを作成してみよう
また、ボタンの作り方は次のページを参考してください。
レコード詳細画面にボタンを配置してみよう
コードは次のとおりになります。
|
|
DeepLのAPIを実行して「原文」の内容を翻訳する
最後に、DeepLのAPIを実行して「原文」の内容を翻訳する機能を実装します。
DeepLのAPIを実行、すなわち外部のWeb APIを実行するには、次のkintone JavaScript APIを利用します。
プラグインから外部APIを実行する
:kintone.plugin.app.proxy()
引数として、今回は次の情報を指定します。
- url:Web APIのURL
今回は、”https://api-free.deepl.com/v2/translate”です。 - method:HTTPメソッド
今回は”POST”です。 - data:リクエストボディ
今回は、 DeepL APIリクエストの
dataです。
上記の引数を指定してAPIを実行すると、プロキシサーバー上で、DeepLのAPIが実行されます。
このとき、kintone.plugin.app.setProxyConfig()を使って保存した内容と、kintone.plugin.app.proxy()で指定した内容が比較されます。
次の3つの情報が一致すると、リクエストヘッダーとリクエストボディが付与されます。
- プラグインID
- URL
- HTTPメソッド
レスポンスとして返ってきた翻訳結果を「訳文」フィールドにセットします。
最終的なコードは次のとおりです。
|
|
動作確認
プラグインの動作確認
作ったプラグインが正しく動作するか確認しましょう。
作ったプラグインファイルをパッケージングし、「kintoneシステム管理」からプラグインを読み込み、
kintoneアプリ作成
で作ったアプリに追加します。
次の2点を確認します。
- 設定画面では次のことを確認します。
- 複数選択フィールドの一覧が表示され、選択できること
- 保存したプラグインの情報が初期値としてセットされること
- レコード編集画面で「翻訳」ボタンをクリックすると、原文フィールドの内容の英訳が訳文フィールドに書き込まれること
秘密情報が見えないことを確認
アプリの利用者には、プラグインの設定画面で保存したAPIキーが見えないことを確認してみましょう。
kintone.plugin.app.proxy.getConfig() で秘匿情報が見えないこと
レコードの編集画面を開いて、ブラウザーの「コンソール」タブを開きます。
次のコードを貼り付けてkintone.plugin.app.proxy.getConfig()を実行してみましょう。
プラグインIDは後述の
「ネットワーク」タブのリクエスト情報
から確認できます。
|
|
次のように、実行結果がnullになり、アプリの利用者には秘匿情報が見えないことを確認できました。
ネットワークタブのリクエストでも見えないこと
レコードの編集画面でブラウザーの「ネットワーク」タブを開きます。
「翻訳」ボタンをクリックして表示されたcall.json?文字列...をクリックします。
すると、DeepL APIを実行したときのリクエスト内容が表示されます。
リクエスト内容から、ヘッダーに付与されるAPIキーが表示されていないことを確認できます。
詳細な検証方法は、 kintoneプラグインで秘匿情報を隠す〜実践編〜 を参考してください。
まとめ
今回は、プラグインで認証情報などの秘匿情報を隠す方法を紹介しました。
より安全に外部サービスと連携したい方、ぜひプラグインを検討してみてください。
このTipsは、2025年5月版kintoneで動作を確認しています。