(Author : Fuji Business International Mamoru Fujinoki)
はじめに
共通管理メニュー内の[外部連携]で、 OAuth クライアントの作成ができるようになりました。
今回は、Ruby on Rails(以下、Rails)で作成した顧客お問い合わせサイトから入力したデータを、 OAuth 2.0 の承認を経て、kintone API でデータを追加するサンプルを紹介します。
事前に必要なもの
- kintone アカウント
- Ruby version 2.7 以上
こちらのページ からインストールしてください。
※ 2.7 より古いバージョンの Ruby がインストールされている場合、次のいずれかを行ってください。- 古いバージョンをアンインストールして、最新バージョンをインストールする
- バージョンマネージャーを使って最新バージョンをインストールする
- Rails 開発環境 version 6.0 以上
※ Rails を始めよう のチュートリアルを参考に Ruby on Rails 環境を設定してください。 - Git コマンドラインツール
- Heroku アカウント
- Heroku CLI
開発手順
1. kintone アプリの作成
kintoneアプリストアより、「お客様の声管理」で検索し、表示されたアプリを追加します。
※ このとき作成した kintone アプリのアプリ ID をメモしてください。>Rails アプリケーションの作成時に利用します。
アプリ ID は、kintone アプリを開いたときの URL で確認できます。
https://{subdomain}.cybozu.com/k/{アプリID}
下記のテーブルを参考にフィールドコードを設定します。
フィールドの種類 | フィールド名 | フィールドコード |
---|---|---|
ドロップダウン | 収集媒体 | received_via |
ドロップダウン | カテゴリ | category |
ドロップダウン | テナント名 | tenant_name |
文字列(複数行) | ご意見内容 | opinion |
kintoneアプリの設定は以上です。
2. OAuth Clientの設定
kintone アプリ の cybozu.com 共通管理ページより、外部連携設定画面にて、OAuthクライアントの追加をクリックします。
操作方法の詳細は、OAuthクライアントをcybozu.comに登録する を参照してください。
「クライアント名」と「リダイレクトエンドポイント」を入力します。
- 「リダイレクトエンドポイント」は、サイトを Heroku にデプロイした際に決定します。
今の段階では、次の値を仮設定しておき、後ほど変更します。
仮のリダイレクトエンドポイント: https://localhost:3000/authorize (必ずhttpsを指定してください。)
「保存」すると、以下の情報が自動生成されます。
※ 「クライアントID」と「クライアントシークレット」をメモしてください。Rails アプリケーションの作成時に利用します。
- クライアント ID
- クライアントシークレット
- 認可エンドポイント
- トークンエンドポイント
連携利用ユーザーの設定をクリックします。
API 利用を許可するユーザーを選択し、設定を保存します。
以上で OAuth クライアントの設定は終了です。
3. Rails クライアントアプリケーションの開発
Ruby on Rails でクライアントアプリケーションを開発していきます。
ステップ1
ターミナルを開き、次のコマンドを実行して、Railsのアプリケーションを作成します。
これにより、customer-feedback というプロジェクト名で Rails のアプリケーションのひな形が生成されます。
以下のコマンドでローカルサーバーを起動し、動作するか確認します。
サーバーが起動したら、ブラウザにて「http://localhost:3000 」を開き、以下のように表示されたら成功です。
注意事項
(Windows環境)
SQLite3 で dlopen の関数が存在しないというエラーがでた場合、以下コマンドを実施してください。
ステップ2
今回は、OAuth2.0 を使うので、以下のように Gemfile に2つの gem を追加してください。
oauth2 は、OAuth リクエストを実行するために使用し、activerecord-session_store はセッションの情報をデータベースに記録するために使用します。
ファイルを保存後、以下のコマンドを実行します。
次に以下のコマンドを実行し、セッションの保存用のデータベースを作成します。
ステップ3
続いて、以下のコマンドで、「home」、「auth」と「feedbacks」というコントローラーを作成します。
ステップ4
次に「app」- 「helpers」フォルダー内の「auth_helper.rb」を開き、以下を参考にコーディングします。
次の値は、利用環境に合わせて修正してください。
- 9行目 CLIENT_ID: 2. OAuth Clientの設定で作成した OAuth クライアントのクライアントID
- 11行目 CLIENT_SECRET:2. OAuth Clientの設定で作成した OAuth クライアントのクライアントシークレット
- 13行目 SITE:kintone 環境のドメイン
ステップ5
今度は、「app」> 「controllers」フォルダー内の「home_controller.rb」を以下のように編集します。
また、同フォルダー内の「auth_controller.rb」を以下を参考にコードを追加します。
最後に「feedbacks_controller.rb」を以下を参考に編集します。
次の値は、利用環境に合わせて修正してください。
- 12行目 APP_ID: 1. kintone アプリの作成 で作成した kintone アプリのアプリID
- 13行目 DOMAIN:kintone 環境のドメイン
ステップ6
「app」>「views」>「home」フォルダー内に「index.html.erb」ファイルを作成し、以下を参考にしてホームページを作成します。
「kinrtoneへ接続」するためのリンクを設置しています。
次のようなページが生成されます。
次に、「app」> 「views」> 「feedbacks」フォルダー内に「new.html.erb」ファイルを作成し、以下を参考にして、お客様の声フォームを作成します。
次のようなページが生成されます。
ステップ7
次に「config」フォルダー内の「routes.rb」ファイルを以下のように編集します。
HTTP動詞 | パス | フィールドコード | 目的 |
---|---|---|---|
GET | /authorize | auth#gettoken | OAuthでkintoneからのコールバック先 |
GET | /feedbacks | feedbacks#new | お客様の声を1つ作成するためのHTMLフォームを返す |
POST | /feedbacks | feedbacks#create | お客様の声を1つ作成する |
ステップ8
次に先程指定したresource名のモデルを生成します。
下記のコマンドを実行し、「feedback」モデルを生成します。ここでは「feedbacks」ではなく、単数形の「feedback」を指定します。
これにより以下のモデルが生成されます。
フィールド名 | フィールドタイプ |
---|---|
received_via | string |
category | string |
tenant_name | string |
opinion | text |
以下のコマンドでマイグレーションを実行して、データベースにテーブルを作成します。
これで feedbacks テーブルがデータベース上に作成されます。
テスト環境での動作確認
以下のコマンドでローカルの Rails サーバーを起動し、エラーがないか確認します。
以下の画像のようにホームページが表示されれば、成功です。
ただし、「kintone に接続」リンクをクリックしても kintone 側の OAuth クライアントのコールバック URL の設定が異なるためエラーになります。
これは、Heroku へのデプロイが終了後、修正します。)
以上で、Railsクライアントの開発は完了です。
4. Herokuへのデプロイ
今回は、テスト用のサーバーに Heroku を使用します。
Heroku では、データベースとして利用している SQLite3 はサポートされていません。
そのため、開発環境(ローカル)では SQLite3 を利用し、本番環境(Heroku)では PostgreSQL を利用するようにします。
Gemfile の SQLite3 に関する記述部分を以下のように書き換えます。
以下のコマンドで、変更をローカルの開発環境に一度反映させます。
以下のコマンドで、今までのプロジェクトファイルの変更を Git レポジトリに反映させます。
以下のコマンドで、Heroku アカウントにログインして、SSH キーを追加します。
以下のコマンドで Heroku のアプリケーションを作成します。
Heroku 内に空のアプリケーションが作成されるので、次のコマンドで、作成した OAuth クライアントのアプリケーションを Heroku にデプロイします。
次のコマンドで Heroku 上にデータベースを作成します。
以上で Heroku のデプロイは完了です。
5. 動作確認
デプロイが完了したら、以下のコマンドで、アプリケーションを開きます。
以下の画像のように表示されれば成功です。
※ 表示された Heroku のアプリケーションの URL をメモしてください。後述の OAuth クライアントの設定で利用します。
次に、kintone の OAuth クライアントの設定画面を開き、リダイレクトポイントの URL を Heroku のアプリケーションの URL に変更し、保存します。
「kintone OAuth 2.0 クライアントサンプル」フォームに戻り、「kintoneに接続」リンクをクリックします。
kintone にログインしていない場合は、ログイン画面が表示されます。
「Ruby OAuth クライアントから次の操作が実行されます」というメッセージが表示されるので、「許可」します。
「お客様の声」フォームが表示されるので、各項目を任意に入力し「送信」ボタンをクリックします。
エラー画面が表示されず、フォームの各項目が未入力の状態にリセットされれば、成功です。
kintone アプリにレコードが追加されているか確認します。
OAuth2.0 を使って、Ruby on Railsの外部アプリから kintone API を使ってレコードの追加に成功したことを確認できました。
コードの解説
auth_helper.rb
auth_helper.rb は、認証に関する処理をまとめた helper ファイルです。
2. OAuth Clientの設定で作成した OAuth クライアントアプリの値を元に各変数を設定します。
なお、設定したスコープの詳細は、OAuthクライアントの使用を参考にしてください。今回は、「read」、「write」権限を設定しています。
この関数では、ホームページの「承認」リンクに設定する URL を生成しています。
なお、authorize_url は、routes.rb で設定する authorize ページへのルートパスです。このリンクをクリックすると、kintone側から、認可コードが送信されます。
oauth2 のプラグインのコマンドの詳細は、A Ruby wrapper for the OAuth 2.0 protocol を参照してください。
こちらの関数では、上記で取得した認可コードからアクセストークンを取得しています。
この関数では、セッションに保存してあるアクセストークンのハッシュから、アクセストークンを取得します。
すでにアクセストークンが期限切れの場合にリフレッシュトークンより、新アクセストークンを取得します。
home_controller.rb
承認リンクへの URL を取得して、ホームページにリンクを表示します。
auth_controller.rb
kintone 側からコールバックされた後、返された認可コードから、アクセストークンを取得します。
feedback_controller.rb
一旦、お客様フォームのデータをサイト内のデータベースに保存し、アクセストークンが既に存在するかチェックします。
kintoneに送信するデータをハッシュ形式で設定します。
取得したアクセストークンで、kintoneへデータをポストします。
アクセストークンが存在しない場合、ホームページの承認リンクへリダイレクトします。
お客様の声フォームより、各データを取得します。
routes.rb
routes.rb は、Rails アプリケーションのルーティング設定を行うファイルです。
リソース名に「feedbacks」を指定します。
また、ホームページには、承認リンクを表示するページを設定します。
おわりに
今回は Ruby on Rails によって、OAuth2.0 を使った外部連携を行いました。
これを応用すれば、他の言語で開発したウェブアプリケーションから OAuth2.0 を使った kintone API の利用も可能です。
OAuth2.0 による外部連携をすることで、ユーザ毎に kintone API へのアクセス権限をコントロールすることが可能になります。
参照サイト
- Rails チュートリアル
- Ruby on Rails ガイド
- How to use Outlook REST API in a Ruby on Rails app
- A Ruby wrapper for the OAuth 2.0 protocol
- Heroku に Rails アプリケーションをデプロイする手順
このTipsは、2020年3月版 kintoneで確認したものになります。
記事に関するフィードバック
記事のコメント欄は記事に対するフィードバックをする場となっております。
右の記事フィードバックのためのガイドを参照してコメントしてください。
記事のリンク切れなど、気になる点がある場合も、こちらのフォームからフィードバックいただけますと幸いです。