APIトークンと認証
kintone REST API を利用する際、リクエストを送信するだけではデータにアクセスできません。認証の仕組みを正しく理解し、適切に設定する必要があります。
kintone では主に 3 つの認証方法が提供されており、利用する場面や目的に応じて使い分けます。認証方法を誤ると、セキュリティ上のリスクや、想定外のアクセス権の問題が発生する可能性があります。
この記事では、kintone REST API の認証方法の仕組みと使い分け、セキュリティのベストプラクティスを解説します。
認証方法の種類と使い分け
kintone REST API では、以下の 3 つの認証方法が利用できます。
| 認証方法 | ヘッダー名 | 利用場面 |
|---|---|---|
| API トークン認証 | X-Cybozu-API-Token | 外部サービスからの API 呼び出し、サーバーサイド連携 |
| パスワード認証 | X-Cybozu-Authorization | 特定ユーザーとして操作する場合(使用頻度は低い) |
| セッション認証 | (自動) | kintone.api を使った JavaScript カスタマイズ内の呼び出し |
kintone の JavaScript カスタマイズ内で kintone.api
を使用する場合は、ログインユーザーのセッション情報が自動的に使用されるため、認証ヘッダーの設定は不要です。
API トークン認証
API トークンとは
API トークンは、アプリごとに発行される認証用の文字列です。ユーザーのログイン情報を使わずに、プログラムから安全に API を呼び出すことができます。
API トークンの主な特徴:
- アプリ単位で発行される(1 つのトークンは 1 つのアプリに紐づく)
- 権限を細かく制御できる(閲覧のみ、追加のみ、など)
- 複数のトークンを発行でき、用途ごとに分けて管理できる
- トークンを無効化(削除)すれば、即座にアクセスを遮断できる
API トークンの発行手順
- 対象のアプリを開く
- アプリの設定(歯車アイコン)をクリック
- 設定 タブの API トークン をクリック
- 生成する ボタンをクリック
- 必要なアクセス権にチェックを入れる
- 保存 → アプリを更新 をクリック
API トークンを生成・変更した後は、必ずアプリを更新してください。保存しただけでは反映されません。
API トークンのアクセス権
API トークンには以下のアクセス権を設定できます:
| アクセス権 | 説明 |
|---|---|
| レコード閲覧 | レコードの取得(GET) |
| レコード追加 | レコードの追加(POST) |
| レコード編集 | レコードの更新(PUT) |
| レコード削除 | レコードの削除(DELETE) |
| アプリ管理 | アプリ設定の取得・変更 |
最小権限の原則に従い、用途に必要な最小限のアクセス権のみを付与してください。例えば、データの読み取りだけが目的のトークンに「レコード削除」の権限を付与する必要はありません。
API トークンを使ったリクエスト
Node.js(fetch)の場合
const KINTONE_DOMAIN = 'your-subdomain.cybozu.com';
const API_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
const APP_ID = 1;
const getRecords = async () => {
const url = `https://${KINTONE_DOMAIN}/k/v1/records.json?app=${APP_ID}`;
const response = await fetch(url, {
method: 'GET',
headers: {
'X-Cybozu-API-Token': API_TOKEN,
},
});
if (!response.ok) {
const error = await response.json();
throw new Error(`[${error.code}] ${error.message}`);
}
return response.json();
};
curl の場合
curl -X GET \
"https://your-subdomain.cybozu.com/k/v1/records.json?app=1" \
-H "X-Cybozu-API-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Python の場合
import requests
KINTONE_DOMAIN = "your-subdomain.cybozu.com"
API_TOKEN = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
APP_ID = 1
url = f"https://{KINTONE_DOMAIN}/k/v1/records.json"
headers = {"X-Cybozu-API-Token": API_TOKEN}
params = {"app": APP_ID}
response = requests.get(url, headers=headers, params=params)
response.raise_for_status()
data = response.json()
print(data["records"])
Google Apps Script の場合
function getRecords() {
const KINTONE_DOMAIN = 'your-subdomain.cybozu.com';
const API_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
const APP_ID = 1;
const url = `https://${KINTONE_DOMAIN}/k/v1/records.json?app=${APP_ID}`;
const options = {
method: 'get',
headers: {
'X-Cybozu-API-Token': API_TOKEN,
},
};
const response = UrlFetchApp.fetch(url, options);
const data = JSON.parse(response.getContentText());
Logger.log(data.records);
}
複数 API トークンの同時指定
bulkRequest や 複数アプリにまたがる操作を行う場合、1 つのリクエストに複数のアプリの API トークンが必要になることがあります。その場合は、カンマ区切りで複数のトークンを指定します。
const TOKEN_APP_A = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
const TOKEN_APP_B = 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb';
const url = `https://${KINTONE_DOMAIN}/k/v1/bulkRequest.json`;
const response = await fetch(url, {
method: 'POST',
headers: {
'X-Cybozu-API-Token': `${TOKEN_APP_A},${TOKEN_APP_B}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
requests: [
{
method: 'POST',
api: '/k/v1/record.json',
payload: { app: 1, record: { /* ... */ } },
},
{
method: 'PUT',
api: '/k/v1/record.json',
payload: { app: 2, record: { /* ... */ } },
},
],
}),
});
複数の API
トークンを指定する場合、トークン間はカンマ(,)で区切ります。スペースは不要です。各トークンは、対応するアプリへのリクエストに対して認証に使用されます。
パスワード認証
パスワード認証は、kintone のログイン名とパスワードを Base64 エンコードして送信する方式です。
const loginName = 'user@example.com';
const password = 'your-password';
// Base64エンコード
const credentials = btoa(`${loginName}:${password}`);
const response = await fetch(url, {
method: 'GET',
headers: {
'X-Cybozu-Authorization': credentials,
},
});
パスワード認証はユーザーのログイン情報をそのまま使用するため、トークンが漏洩した場合の影響が大きくなります。外部サービスとの連携には API トークン認証 を優先してください。パスワード認証は、API トークンでは対応できない操作(ユーザー管理 API 等)に限定することを推奨します。
セッション認証
kintone の JavaScript カスタマイズ内(kintone.api)では、ログインユーザーのセッション情報が自動的に使用されます。これがセッション認証です。
// kintone.api を使う場合、認証ヘッダーは不要
const response = await kintone.api(
kintone.api.url('/k/v1/records.json', true),
'GET',
{ app: kintone.app.getId() }
);
セッション認証の特徴:
- 認証ヘッダーの設定が不要
- ログインユーザーのアクセス権限がそのまま適用される
- kintone の画面上で動作するカスタマイズ専用(外部からは使えない)
kintone.api はセッション認証に加え、CSRF トークンも自動的に付与します。そのため、POST / PUT /
DELETE リクエストでも追加の設定なしで安全に実行できます。
ゲストスペースの API 呼び出し
ゲストスペース内のアプリに対して API を呼び出す場合、エンドポイントの URL が通常のアプリとは異なります。
// 通常のアプリ
// /k/v1/records.json
// ゲストスペースのアプリ
// /k/guest/{スペースID}/v1/records.json
const GUEST_SPACE_ID = 5;
const APP_ID = 100;
// kintone.api.url の第2引数を true にすると、自動的にゲストスペース対応のURLが生成される
const url = kintone.api.url('/k/v1/records.json', true);
// 外部から呼び出す場合は、URLを手動で構築
const externalUrl = `https://${KINTONE_DOMAIN}/k/guest/${GUEST_SPACE_ID}/v1/records.json`;
const response = await fetch(externalUrl, {
method: 'GET',
headers: {
'X-Cybozu-API-Token': API_TOKEN,
},
});
kintone JavaScript カスタマイズ内では、kintone.api.url の第 2 引数に true
を指定すると、ゲストスペースかどうかを自動判定して適切な URL
を返してくれます。外部から呼び出す場合のみ、URL を手動で構築する必要があります。
セキュリティのベストプラクティス
API トークンの安全な管理
| 方針 | 説明 |
|---|---|
| ソースコードにハードコーディングしない | 環境変数やシークレット管理サービスを使用する |
| 最小権限の原則 | 必要なアクセス権のみを付与する |
| 用途ごとにトークンを分ける | 読み取り専用トークン、書き込み用トークンなど用途別に発行する |
| 不要になったトークンは削除する | 使わなくなったトークンは速やかに削除する |
| 定期的な棚卸し | 発行済みトークンの一覧を定期的に確認し、不要なものを整理する |
Node.js での環境変数の活用
// .env ファイル(.gitignore に追加すること)
// KINTONE_DOMAIN=your-subdomain.cybozu.com
// KINTONE_API_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
import 'dotenv/config';
const KINTONE_DOMAIN = process.env.KINTONE_DOMAIN;
const API_TOKEN = process.env.KINTONE_API_TOKEN;
if (!KINTONE_DOMAIN || !API_TOKEN) {
throw new Error('環境変数 KINTONE_DOMAIN と KINTONE_API_TOKEN を設定してください');
}
.env ファイルには機密情報が含まれるため、必ず .gitignore に追加してください。Git リポジトリに
API トークンをコミットしてしまうと、トークンを再発行する必要があります。
kintone.proxy と API トークンの併用
kintone の JavaScript カスタマイズ内から、API トークンを使って別アプリにアクセスする場合は kintone.proxy を使います。これは、ログインユーザーにはアクセス権がないが、API トークンでのみアクセスを許可したいケースに有効です。
(() => {
'use strict';
const API_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
const TARGET_APP_ID = 50;
/**
* APIトークンを使って別アプリのレコードを取得する
* @param { string } query - クエリ
* @returns { Promise<Record<string, any>[]> }
*/
const getRecordsWithToken = async (query) => {
const url = kintone.api.urlForGet(
'/k/v1/records.json',
{ app: TARGET_APP_ID, query },
true
);
const [body] = await kintone.proxy(url, 'GET', { 'X-Cybozu-API-Token': API_TOKEN }, {});
const response = JSON.parse(body);
return response.records;
};
kintone.events.on(['app.record.detail.show'], async (event) => {
const records = await getRecordsWithToken('ステータス in ("公開")');
console.log('取得結果:', records);
return event;
});
})();
まとめ
- kintone REST API の認証方法は API トークン認証、パスワード認証、セッション認証 の 3 種類
- JavaScript カスタマイズ内では
kintone.apiを使えばセッション認証が自動的に適用される - 外部サービスからの連携には API トークン認証 を使用し、パスワード認証は避ける
- API トークンはアプリ単位で発行し、最小権限の原則で権限を設定する
- 複数アプリにまたがる操作では、カンマ区切りで複数の API トークンを同時指定できる
- ゲストスペースの API 呼び出しは、エンドポイント URL に
/guest/{スペースID}/を含める - API トークンは環境変数で管理し、ソースコードにハードコーディングしない