(Author : Fuji Business International Mamoru Fujinoki)
はじめに
共通管理メニュー内の外部連携で新たにOAuthクライアントの設定ができるようになりました。
今回は、Google Apps Script(以下GAS)のチュートリアルを参考に、OAuth 2.0の承認を経て、kintone APIでデータを取得するサンプルコードを作成します。
機能としては、kintone APIより取得したメッセージをGoogle Docに書き込み、GmailでGoogle Docへのリンクを送信するサンプルを作成します。
尚、コードを簡素化するため、OAuth 2.0認証にGASのライブラリを利用します。
cybozu.comのOAuthクライアントについてのドキュメントはこちらです。
開発手順
1. kintoneアプリの開発
画面を参考にGoogle Docに送信するメッセージを入力するフィールドを設定します。
フィールドの種類 | フィールド名 | フィールドコード |
---|---|---|
文字列(1行) | メッセージ | message |
「フォームを保存」し、「アプリを更新」します。
kintoneアプリの設定は以上です。
2. OAuth2ライブラリの設定
-
https://script.google.com/にて、Google Workspace Developer Hubにお持ちのGoogle アカウントでログインします。
-
「新規スクリプト」をクリックして、GASのエディターを表示します。
-
プロジェクト名を適当に入力し、「リソース」メニューから、「ライブラリ」を選択します。
-
ライブラリのスクリプトID:
1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
を入力し、「追加」ボタンでライブラリを追加します。
最新のバージョンを選択して、設定を保存します。(詳細はこちらを参照してください。)
3. OAuthクライアントの設定
kintoneアプリのcybozu.com共通管理ページより、外部連携設定画面にて、OAuthクライアントの追加をクリックします。
リダイレクトエンドポイントは次の形式で設定します。
https://script.google.com/macros/d/{スクリプトID}/usercallback
今回作成したスクリプトIDは、GASエディターのファイルメニューの「プロジェクトのプロパティ」より、取得します。
クライアント名とリダイレクトエンドポイントを入力し、「保存」すると以下の情報が、自動生成されます。
- クライアントID
- クライアントシークレット
- 認可エンドポイント
- トークンエンドポイント
連携利用ユーザーの設定をクリックし、API利用を許可するユーザーを選択し、設定を保存します。
以上でOAuthクライアントの設定は終了です。
4. GASアプリの開発
GASのアプリは、こちらのチュートリアルを参考に開発します。
アプリの機能:
- OAuth 2.0 でkintone APIへのアクセスを認証する。
- kintone APIより、メッセージを取得する。
- 「Hello, World!」という名前で、Google Docを作成する。
- Google Docのボディーにkintoneからのメーセージを書き込む。
- GmailでGoogle Docへのリンクを送信する。
OAuth 2.0 の認証に関しましては、上記で設定したOAuth2 for Apps ScriptというGASのライブラリを利用します。
4.1. GASのコーディング
以下を参考にコーディングします。
4.3. コードの解説
doGet関数は、GASコードを後ほどウェブアプリケーションとして実行した際に最初に自動的に呼び出される関数です。
OAuth2.0 認証サービスを生成し、すでに承認されていれば、アクセストークンを引き渡し、kintone APIよりデータを取得する関数を呼び出します。
まだ、認証されていない場合には、承認リンクをブラウザに表示します。
OAuth2.0ライブラリを使って、OAuth2.0承認サービスの生成を行います。上記で設定したOAuthクライアントの各種情報を設定しています。
PropertiesService.getScriptProperties()にて、承認トークンの設定を保存するサービスの指定をしています。
スコープの値は、こちらの記事で確認してください。
コールバック関数は、authCallbackを指定します。
ブラウザから承認リンクをクリックした場合にkintoneへ認可リクエストを送信した際に処理されるコールバック関数です。ライブラリ内で認可コードを取得して、アクセストークンを要求・取得する処理が実行されます。
承認されるとkintone APIを実行する関数を呼び出し、ブラウザに「Success」と表示されます。
また、承認が拒否された場合には「Denied」が表示されます。
取得したアクセストークンをヘッダーに設定して、kintone APIでアプリのデータを取得します。URLには、アクセスしたいアプリのIDとレコード番号を含めて指定します。
取得したデータをJSON形式に変換します。
Googleドキュメントを新規作成し、ボディーにkintoneから取得したデータを書き込みます。
その後、新規作成したGoogleドキュメントのURLを取得します。
ログインしているユーザーのEメールアドレスを取得し、Eメールの題目として、ドキュメント名を指定します。
取得したドキュメントのURLをリンクとして、Eメールのボディーに追加します。
Gmailにて、ログインユーザーへドキュメントへのリンクをメール送信します。
5. GASアプリのOAuthスコープの設定
GASからGmailやGoogle Docsを利用するため、マニフェストファイルにOAuth Scopeを設定します。
参考:OAuth 2.0 Scopes for Google APIs
- GASエディターの「表示」メニューから、「マニフェスト ファイルの表示」を選択します。
- 表示されたappsscript.jsonに次の値を追加します。
- 「ファイル」メニューから、「保存」を選択して保存します。
6. 動作確認
GASのスクリプトエディターの「公開」メニューより、「ウェブアプリケーションとして導入」を選択します。
プロジェクトバージョンにNewを選択し、「導入」ボタンをクリックします。
Googleアカウントのデータへのアクセス承認の許可を確認します。
下記のような警告が表示される場合、(安全でないページ)に移動をクリックし、続けます。
GASを作成したGoogleアカウントを選択します。
GASのGoogleアカウントへのアクセスを許可します。
現在のウェブアプリケーションのURLが表示されますので、コピーして、ブラウザのアドレス欄に貼り付け、ウェブアプリケーションを実行します。
ブラウザに表示された承認リンクをクリックする。
kintoneのログイン画面が表示されるので、ユーザー名とパスワードを入力してログインします。
OAuthクライアントのアクセスを許可します。
「Success!」が表示されたら、OAuthクライアントの承認が成功し、スクリプトが実行されたことになります。
しばらくするとGmailが送信され、Googleドキュメントへのリンクをクリックしてkintoneアプリで設定したメッセージが表示されていれば、成功です。
まとめ
新たに導入された外部連携の機能で、外部アプリケーションからOAuth 2.0を使って、kintone APIへのアクセスができるようになりました。
これにより、OAuth2.0で安全にユーザー認証を行い、外部アプリケーションから、kintone APIを通じて、アプリのデータを取得できるようになりました。
関連ページ
このTipsは、2019年02月版 kintoneで確認したものになります。
こちらは、KintoneアプリにIP制限の設定をしていても可能でしょうか。
ご教授のほど、よろしくお願いいたします。
鍋倉 由樹 様
お世話になっております。cybozu developer network 運営事務局でございます。
下記リンク先に記載通り、IP アドレス制限を行っている場合、OAuthクライアント の IP アドレスを登録する必要があります。
https://developer.cybozu.io/hc/ja/articles/360015955171#step4
本記事では GAS が OAuth クライアントとなっていますので、
GAS の IP アドレスを登録いただく必要がございます。
GAS の IP アドレスについては、GAS 側のヘルプにてご確認お願い致します。
以上、よろしくお願いします。
サンプルを試しましたがAuthorize のリンクをクリックした後で認証が出来ません。Google Apps Script から「Authorization is required to perform that action.」と表示されます。
現在SSO(SAML) を使用しており、ますがそれが問題かと思っておりますが如何でしょうか。よろしくお願い申し上げます。
Naoto Kurihara 様
お世話になっております。cybozu developer network 運営局です。
1点確認したいのですが、「Authorization is required to perform that action.」が表示されるのは、
「Authorize」のリンクをクリックしたあと、(cybozu.com のログイン画面に遷移し)、OAuthクライアントのアクセスを許可する画面が表示されたときの「許可」ボタンを押したときでしょうか?
その場合、以下の作業を行ったのち、もう一度、動作を確認いただけないでしょうか。
Google Apps Script の仕様変更で、Google Apps Script 側で厳密に利用するサービスのスコープ設定が必要になったようです。
1. スコープの追加
appsscript.json が表示される
2. ウェブアプリケーションのバージョンアップ
※「更新」ボタンをクリックしたあと、GASのGoogleアカウントへのアクセスを許可のダイアログが表示されたら、許可する
なお、上記の設定を行ったあと、SAML 環境下でもメールを送信できたことを確認しています。
お返事ありがとうございました。結果から先ですが、解決出来ました。ありがとうございました。
問題はご指摘の通りアクセスを許可する画面が表示され、その「許可」ボタンを押した後に表示されたものでした。只、当方は米国の Kintone.com のサブドメインを使用し SMAL のSSOもあり、何か制限があるか気になっておりましたが、問題なくサンプルの結果のようにKintoneのレコードの所定のデータがGoogle Doc に記され、リンク付きのEメールも受信出来ました。本当にありがとうございました!