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 トークンの発行手順

  1. 対象のアプリを開く
  2. アプリの設定(歯車アイコン)をクリック
  3. 設定 タブの API トークン をクリック
  4. 生成する ボタンをクリック
  5. 必要なアクセス権にチェックを入れる
  6. 保存アプリを更新 をクリック
アプリの更新を忘れずに

API トークンを生成・変更した後は、必ずアプリを更新してください。保存しただけでは反映されません。

API トークンのアクセス権

API トークンには以下のアクセス権を設定できます:

アクセス権説明
レコード閲覧レコードの取得(GET)
レコード追加レコードの追加(POST)
レコード編集レコードの更新(PUT)
レコード削除レコードの削除(DELETE)
アプリ管理アプリ設定の取得・変更
チェック

最小権限の原則に従い、用途に必要な最小限のアクセス権のみを付与してください。例えば、データの読み取りだけが目的のトークンに「レコード削除」の権限を付与する必要はありません。

API トークンを使ったリクエスト

Node.js(fetch)の場合

api-token-nodejs.js
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 の場合

api-token-curl.sh
curl -X GET \
  "https://your-subdomain.cybozu.com/k/v1/records.json?app=1" \
  -H "X-Cybozu-API-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Python の場合

api-token-python.py
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 の場合

api-token-gas.js
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 トークンが必要になることがあります。その場合は、カンマ区切りで複数のトークンを指定します。

multiple-tokens.js
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 エンコードして送信する方式です。

password-auth.js
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)では、ログインユーザーのセッション情報が自動的に使用されます。これがセッション認証です。

session-auth.js
// 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 が通常のアプリとは異なります。

guest-space-api.js
// 通常のアプリ
// /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-management.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 トークンでのみアクセスを許可したいケースに有効です。

proxy-with-token.js
(() => {
  '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;
  });
})();
APIのバックドア
kintoneでAPIを使用する際、認証方法としてアカウントID、パスワードを使用するか、APIトークンを使用するかを選択することができます。を利用した場合、各アプリへのアクセス権限は、そのアカウントに対する設定に依存します。そのためAPI
kintone.proxyの使い方
kintone JavaScript カスタマイズから外部 API を呼び出す際に必要な kintone.proxy の使い方を解説します。GET/POST/PUT/DELETE の各メソッドの使い方、リクエストヘッダーの設定、レスポンスの

まとめ

  • kintone REST API の認証方法は API トークン認証パスワード認証セッション認証 の 3 種類
  • JavaScript カスタマイズ内では kintone.api を使えばセッション認証が自動的に適用される
  • 外部サービスからの連携には API トークン認証 を使用し、パスワード認証は避ける
  • API トークンはアプリ単位で発行し、最小権限の原則で権限を設定する
  • 複数アプリにまたがる操作では、カンマ区切りで複数の API トークンを同時指定できる
  • ゲストスペースの API 呼び出しは、エンドポイント URL に /guest/{スペースID}/ を含める
  • API トークンは環境変数で管理し、ソースコードにハードコーディングしない

関連記事

レコードの取得(1件)
kintone REST APIを使用して、レコードを1件取得する方法を紹介します。レコードIDを指定して、レコード情報を取得することができます。
bulkRequest
kintone REST API の bulkRequest を使って、複数のAPI操作を1回のリクエストでまとめて実行する方法を解説します。トランザクション的な一括処理、アプリ間のデータ同期、デリートインサートの安全な実装方法を紹介します
kintone.proxyの使い方
kintone JavaScript カスタマイズから外部 API を呼び出す際に必要な kintone.proxy の使い方を解説します。GET/POST/PUT/DELETE の各メソッドの使い方、リクエストヘッダーの設定、レスポンスの
APIのバックドア
kintoneでAPIを使用する際、認証方法としてアカウントID、パスワードを使用するか、APIトークンを使用するかを選択することができます。を利用した場合、各アプリへのアクセス権限は、そのアカウントに対する設定に依存します。そのためAPI
Google Apps Script 連携
Google Apps Script(GAS)から kintone REST API を呼び出してデータを取得・登録・更新する方法を解説します。Google スプレッドシートとの双方向同期、認証の設定、ページネーション対応まで紹介します。

kintone の JavaScript カスタマイズ内で kintone.api を使って REST API を呼び出す場合、認証はどのように行われますか?

bulkRequest で複数のアプリに対して操作する場合、API トークン認証をどのように設定しますか?

API トークンのセキュリティ管理として、最も不適切なものはどれですか?

#kintone #REST API #セキュリティ