外部から kintone にアクセスするために必要な認証をまとめた


## この記事について

kintoneは、アクセス制限を設定することができます。
※正確には「〇〇.cybozu.com」という環境に対してですね。
アクセス制限の有無や、設定状況次第で、どのような認証をすることで、外部から kintone にアクセスできるか。
という部分をまとめた記事になります。

なんとなくわかっているはずだけど、きちんとまとめたことがなかった自分に対する
備忘録的な意味合いが強いかもしれません。


## 外部から kintone にアクセスするのってどんなとき？

概ね、以下に当てはまるんじゃないですかね。

- kintone 以外のシステムから、kintoneアプリのレコードを参照したい時
- kintone環境A から kintone環境B のアプリを参照したい時
（JSカスタマイズで kintone.proxy を使って外部のkintoneアプリを参照、みたいな）

※ kintone 連携サービス（krewDataやプリントクリエイター）などは1つ目に該当しそうですね。


## kintone の アクセス制限ってなに？

前述の通り、正確には「〇〇.cybozu.com」という環境に対してアクセス制限をかけます。
概要については、サイボウズさんのヘルプがわかりやすいと思います。

https://jp.cybozu.help/general/ja/admin/list_security/list_access/overview.html

上記ヘルプにも出てくる、**IPアドレス制限** が今回の記事のメインテーマになっていきます。


## IPアドレス制限とは

こちらについても、サイボウズさんのヘルプを見たほうがわかりやすいね！
（いつもお世話になっております。）

https://jp.cybozu.help/general/ja/admin/list_security/list_access/ip_restrictions.html


超ざっくりまとめると、
　会社からはアクセスできるが、自宅からは kintone にアクセスできない
みたいに、制限をかけれるってわけ。

逆に、IPアドレス制限をかけていない場合は、URLとアカウント情報があれば、どこからでもアクセスできます。

## IPアドレス制限の設定とBasic認証、セキュアアクセス

急に難しそうなワードが出てきましたけど、この記事で深くは語らないのでざっくり覚えればOKです。

### IPアドレス制限の設定

以下の3種類があります。

- すべて許可　→　制限してないってこと。
- すべて拒否　→　すべて拒否しているので、後述のBasic認証かセキュアアクセスが必須になる
- 一部許可　　→　設定したIPアドレス以外は、後述のBasic認証かセキュアアクセスが必要になる

### Basic認証

自分のユーザー名とパスワードを入力してログインする前に、その kintone 環境にアクセスするための
ユーザー名とパスワードを求められるって覚えてておｋ。
※許可されたIPアドレスの場合は不要

### セキュアアクセス

クライアント証明書による認証です。
深い部分まで理解したい場合は、Googleなどで検索すると、図解しているサイトがいっぱいあるのでそちらで学びましょう！
簡単な例えで言うと・・・パスポートみたいなもん？笑
cybozu.com 共通管理で発行したクライアント証明書が無いと、kintone環境にアクセスできません。
※許可されたIPアドレスの場合は不要


## 外部から kintone アプリのレコードにアクセスする

kintone アプリにアクセスするには、パスワード認証（ユーザー名／パスワード）か APIトークンによる認証が必要。

### APIトークン

パスワード認証は普段から馴染みがあると思いますが（kintoneにログインするときに使うやつ）
APIトークンとはなんぞ・・・という人も多いと思います。
サイボウズさんのヘルプもありますが、今までよりちょっとハードルの高い内容になっていると思います。

https://jp.cybozu.help/k/ja/user/app_settings/api_token.html

なので、要約すると・・
　特定アプリにアクセスするための鍵
という覚え方でいいんじゃないかと。

前述のパスワード認証で利用するアカウント情報は、kintone環境にログインするアカウント情報ですが
APIトークンは、kintone環境の特定のアプリに対する、認証情報になります。

外部から kintone アプリにアクセスするためには、
- パスワード認証（ユーザー名／パスワード）or APIトークン

と、必要に応じて（IPアドレス制限してて、許可されていない場合）

- Basic認証 or セキュアアクセス（クライアント証明書）

が必要になります。

### 図にしてみるとこんなかんじ

![kintone IPアドレス制限時の認証まとめ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851442/a351e95b-3855-4286-980d-b42c2e25cccb.png)

## 必要な認証のまとめ

IPアドレス制限を行っている kintone 環境に対して、外部からアクセスする際に
必要な認証を表でまとめてみました。
チートシートっていうほど、情報量は多くないですが、忘れてしまった時の参考になるとうれしいです。
（画像にしてあるので、ダウンロードしちゃってください）

IPアドレス制限に関わる、必要な認証のまとめ。
パターンとしては、6パターンあります。

![2022-04-21 105707.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851442/70130f34-aca5-37e2-22a3-246604972f4c.png)

取得先とは異なるkintone環境のJSカスタマイズなどで、kintone.proxy を利用すると、リクエストは “103.79.14.0/24” のIPアドレスからリクエストされます。
そのため、上記IPアドレスを取得先のkintone環境で許可しておくと、Basic認証とクライアント証明書が不要になります。
（一部許可に該当するIPアドレスとなる）

https://jp.cybozu.help/general/ja/admin/outbound_ipaddress.html



## 外部から kintone にアクセスするサンプルコード

@kintone/rest-api-client を利用しています。

https://github.com/kintone/js-sdk/tree/master/packages/rest-api-client

前述の表に記載の番号に合わせた、アクセスする際のサンプルコードになります。

rest-api-clientの設定の記述方法が異なるので、まずはそこにフォーカスして記載します。

### ①～② パスワード認証 or APIトークン認証

#### パスワード認証
```JavaScript
const { KintoneRestAPIClient } = require('@kintone/rest-api-client')

/** rest-api-clientの設定 */
const params = {
  baseUrl: 'https://xxxxxxx.cybozu.com',
  auth: {
    /** パスワード認証 */
    username: 't_numata', // ユーザー名
    password: 'pass',     // パスワード
  }
}

/** rest-api-client */
const client = new KintoneRestAPIClient(params)
```

#### APIトークン認証

```JavaScript
const { KintoneRestAPIClient } = require('@kintone/rest-api-client')

/** rest-api-clientの設定 */
const params = {
  baseUrl: 'https://xxxxxxx.cybozu.com',
  auth: {
    /** APIトークン認証 */
    apiToken: ['Kqcox51lqQVyWna51QJCpu4H1Lef2Tt4QrFU5aiD'], // APIトークン
  }
}

/** rest-api-client */
const client = new KintoneRestAPIClient(params)
```

### ④ パスワード認証 or APIトークン認証 ＋ Basic認証

```JavaScript
const { KintoneRestAPIClient } = require('@kintone/rest-api-client')

/** rest-api-clientの設定 */
const params = {
  baseUrl: 'https://xxxxxxx.cybozu.com',
  auth: {
    // パスワード認証かAPIトークン認証のどちらかでおｋ
    /** パスワード認証 */
    // username: 't_numata', // ユーザー名
    // password: 'pass',     // パスワード
    /** APIトークン認証 */
    apiToken: ['Kqcox51lqQVyWna51QJCpu4H1Lef2Tt4QrFU5aiD'], // APIトークン
  },

  /** Basic認証 */
  basicAuth: {
    username: 'basic', // ユーザー名
    password: 'ninsho', // パスワード
  }
}

/** rest-api-client */
const client = new KintoneRestAPIClient(params)
```


### ⑤ パスワード認証 or APIトークン認証 ＋ クライアント証明書

```JavaScript
const { KintoneRestAPIClient } = require('@kintone/rest-api-client')

/** rest-api-clientの設定 */
const params = {
  baseUrl: 'https://xxxxxxx.cybozu.com',
  auth: {
    // パスワード認証かAPIトークン認証のどちらかでおｋ
    /** パスワード認証 */
    // username: 't_numata', // ユーザー名
    // password: 'pass',     // パスワード
    /** APIトークン認証 */
    apiToken: ['Kqcox51lqQVyWna51QJCpu4H1Lef2Tt4QrFU5aiD'], // APIトークン
  },

  /** クライアント証明書 */
  clientCertAuth: {
    pfxFilePath: './t_numata.pfx',
    password: 'xxxxxxxx',
  }
}

/** rest-api-client */
const client = new KintoneRestAPIClient(params)
```

### ⑥ パスワード認証 or APIトークン認証 ＋ Basic認証 or クライアント証明書

④ か ⑤ のどちらかを利用すればおｋ。

### APIリクエストの実行方法

前述の変数「client」を使って、好きなようにリクエストしちゃってください。
以下のサンプルは、レコードを1件取得するリクエストです。


```JavaScript
/**
 * メイン処理
 */
const main = async () => {
  const resp = await client.record.getRecord({
    app: 1, // アプリID
    id: 1   // レコード番号
  });
  console.log(resp);
}
```

他にもさまざまなリクエストがありますので、使い方は以下を参照してください。

https://github.com/kintone/js-sdk/blob/master/packages/rest-api-client/docs/record.md

## あとがき

記事を投稿したきっかけは、kintone 連携サービスで認証方法の移行が必要になった際に
自分を含め、一緒に働いているメンバーと情報を共有するため。
記事を書くために検証したり、調べたりしたので、アウトプットをするとなると
改めて自分でも知識を付け直すいいきっかけになったような気がしました。
またそのうち、何か記事書きますー。