G空間情報センターでCKAN APIをトークンで使う

# はじめに

G空間情報センターでデータセットの作成、編集、削除を行う場合、ブラウザから利用する場合はログインすることでユーザー認証が行われます。ログイン処理の無いプログラムなどからAPIを利用する際の認証は、従来APIキーが用いられてきました。APIを呼び出す時には、ヘッダーにX-CKAN-API-KEYフィールドを付加し、ユーザー毎に割り当てられた**APIキー**を値として渡してリクエストを送信する必要がありました。

CKANバージョン2.9からはAPIキーに代わって**APIトークン**が導入されました。さらにバージョン2.10以降は、APIキーおよびX-CKAN-API-KEYフィールドが廃止され、**APIトークン** と **Authorization**フィールドが使われるようになりました。

https://ckan.org/blog/upcoming-authentication-changes-in-ckan-210

https://docs.ckan.org/en/2.10/api/#authentication-and-api-tokens

# APIキーからAPIトークンへ

APIキーは、ユーザーを新規作成した時に自動的に一つの値が割り当てられていました。APIトークンに変わることで、ユーザー自身の操作で名前を付けてトークンを作成し、任意のタイミングで削除することが可能となりました。これにより安全性が向上しました。

また複数のトークンが使えるようになったことで、

- 作業によってトークンを使い分ける
- 不要になったトークンを削除して新しいトークンにローテーションする

といったことが可能となりました。

# トークンの生成、管理、削除

ブラウザのダッシュボード画面およびCKAN APIでトークンを管理する方法を説明します。

## ダッシュボート画面での管理

G空間情報センターにログインし、ユーザー画面 (https://www.geospatial.jp/ckan/user/{ユーザー名}/api-tokens) を開くと [**API Tokens**]のタブが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291613/8183e843-ffb7-4ac1-9112-e46889ab7bba.png)

初期状態ではトークンは存在していません。テキストフィールドにトークンの名前を入力し、(Create API Token)ボタンを押下すると新しいトークンが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291613/027c9943-f6fe-4534-8fd1-e690cb5f2a2c.png)

この時トークンの文字列は一回した表示されませんのでコピーして忘れずに保存してください。

生成したトークンはテーブルに表示されます。ここで真ん中の列にはトークンが無効化(expire)するタイミングが表示されます。「決して」と表示されているのは無期限で有効になっていることを意味します。

右側の列にあるXボタンでトークンの削除が行えます。ボタンを押下するとダイアログが表示されるので確認の上、実行してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291613/cf2b96f7-5a3f-43ff-86e4-ba735377ddd0.png)

## CKAN APIでトークンを管理

CKAN APIでは、次の3つの操作が可能です。

- トークン作成
  - api_token_create
- リスト取得
  - api_token_list
- トークン削除
  - api_token_revoke

### リスト取得

まずブラウザの管理画面で作成したトークンのリストを確認してみます。APIの呼び出しに認証が必要なので、**Authorization**フィールドに、これまでのAPIキーあるいはAPIトークンを付加します。userパラメータにはユーザー名またはユーザーIDを設定します。ブラウザで表示されたトークンが確認できます。

```
% curl -s -H "Authorization: {APIキー or APIトークン}" -d '{"user":"{ユーザー名}"}' "https://www.geospatial.jp/ckan/api/action/api_token_list" | jq .
{
  "help": "https://www.geospatial.jp/ckan/api/3/action/help_show?name=api_token_list",
  "success": true,
  "result": [
    {
      "id": "************",
      "name": "作業用トークン",
      "user_id": "****-**-**-**-****",
      "created_at": "2025-06-21T00:56:06.719210",
      "last_access": null
    },
    {
      "id": "************",
      "name": "管理用トークン",
      "user_id": "****-**-**-**-****",
      "created_at": "2025-06-21T01:06:06.257570",
      "last_access": null
    }
  ]
}

```

### トークン作成

次にAPIトークンを作成してみます。パラメータで*user*と*name*を設定します。返値のresultにトークンの文字列が含まれています。

```
% curl -s -H "Authorization: {APIキー or APIトークン}" -d '{"user":"{ユーザー名}", "name":"API作成トークン"}' "https://www.geospatial.jp/ckan/api/action/api_token_create" | jq .
{
  "help": "https://www.geospatial.jp/ckan/api/3/action/help_show?name=api_token_create",
  "success": true,
  "result": {
    "token": "*******************"
  }
}
```

### トークン削除

トークンを削除するときにはトークン文字列自体をパラメータとして渡します。

```
% curl -s -H "Authorization: {}" -d '{"token":"{トークン文字列}"}' "https://www.geospatial.jp/ckan/api/action/api_token_revoke" | jq .
{
  "help": "https://www.geospatial.jp/ckan/api/3/action/help_show?name=api_token_revoke",
  "success": true,
  "result": null
}
```

# まとめ

APIトークンの利用によってセキュリティが向上します。またAPIキーを利用されている場合は早めに移行しましょう。