FileMaker CloudでData APIを利用する手順
はじめに
FileMaker ServerにはData APIという機能があり、これを用いるとHTTPでFileMakerのデータにアクセスできます。外部システムとの連携に便利なので、弊社でもかなり活用しています。
弊社のFileMaker Serverは社内にあるMac mini上で動く、いわゆるオンプレミス構成です。それとは別にFileMaker Cloudのライセンスもありますが、こちらは今のところ使いみちがなく、活用していませんでした。流石にもったいないので、Data API用のサーバーとして利用してはどうかという話になり、FileMaker Cloud上でData APIを利用する方法を調査することになりました。
調査した結果、FileMaker CloudでData APIを利用する方法は断片的な情報しかないことがわかりました。断片をつなぎ合わせてどうにか接続することはできましたが、かなり大変だったので、すべての情報がそろった記事を書いて公開することにしました。
この記事に書かれていること
- FileMaker CloudのIDとパスワードを用いてIDトークンと更新トークン(Refreshトークン)を取得する方法
- 二段階認証を設定したままIDトークンを取得する方法
- IDトークンを用いてData APIにアクセスする方法
- 更新トークンを用いてIDトークンを再取得する方法
この記事に書かれていないこと
- FileMaker Data APIの基本的な使い方
- 環境構築方法
想定している読者
- オンプレミス版のData APIを利用したことがある人
- FileMaker Cloud版でData APIの利用を検討している人
IDトークンと更新トークンの取得
最初にオンプレミス版のData APIのおさらいをしておきます。オンプレミス版のData APIでは、IDとパスワードをコロンでつないでBase64変換した文字列を用いて認証していました。たとえばIDがhoge
、パスワードがfuga
だったら、aG9nZTpmdWdh
が認証キーになります。これは下記のコマンドで取得できます。
echo -n "hoge:fuga" | base64
そして下記のcurlコマンドを実行すれば、Data APIにアクセスするためのトークンを取得できます。
curl -X POST -H 'Content-Type: application/json' -H 'Authorization: Basic aG9nZTpmdWdh' -d '{}' https://{ホストURL}/fmi/data/v2/databases/{データベース名}/sessions
一方、FileMaker Cloudでは上記の方法は通用しません。FileMaker CloudはAmazon Cognitoを認証に用いているため、まずCognitoで認証し、IDトークンを取得する必要があります。[1]
公式サイトに載っているコードの例は非常に不親切なので、もう少しわかりやすい手順を以下に示します。
Node.jsの準備
Amazon CognitoはWEBやモバイルアプリを主なターゲットとしていることから、サンプルコードはJavaScriptで書かれているものが多く、この記事でもJavaScriptを用います。ブラウザ上で動かすことも可能ですが、トークンを取得するためにわざわざWEBアプリを作るのも面倒なので、今回はNode.jsを用います。Node.jsのインストール方法は省略します。
CognitoにアクセスするためのSDKが必要なので、作業用フォルダーで事前に下記コマンドを実行しておいてください。
npm install --save amazon-cognito-identity-js
プログラムの準備
オンプレミス版ではコマンド一行で済んでいた処理ですが、FileMaker Cloudで同じことをするには下記のようにそこそこ長いプログラムを準備する必要があります。[2][3]
const awsCognito = require("amazon-cognito-identity-js");
// IDとパスワード
const ID = "hoge";
const PW = "fuga";
// ユーザープール設定
const userPool = new awsCognito.CognitoUserPool({
UserPoolId: "us-west-2_NqkuZcXQY",
ClientId: "4l9rvl4mv5es1eep1qe97cautn",
});
// ユーザー決定
const cognitoUser = new awsCognito.CognitoUser({
Username: ID,
Pool: userPool,
});
// パスワードの設定
const authenticationDetails = new awsCognito.AuthenticationDetails({
Password: PW,
});
// ユーザープール/ユーザー/パスワードを使って認証
cognitoUser.authenticateUser(authenticationDetails, {
// 成功時
onSuccess(result) {
// 認証完了トークンを取得。以降はこのトークンで認証済み確認
console.log(
"Cognito Access Token : " + result.getAccessToken().getJwtToken()
);
console.log("\nClaris ID Token : " + result.idToken.jwtToken);
console.log("\nClaris ID Refresh Token : " + result.refreshToken.token);
},
onFailure(err) {
console.error(err);
},
// 二段階認証
async mfaRequired(codeDeliveryDetails) {
const verificationCode = await readUserInput(
"Please input verification code : "
);
console.log("verification code = " + verificationCode);
await cognitoUser.sendMFACode(verificationCode, this);
},
});
// ユーザからのキーボード入力を取得する Promise を生成する
function readUserInput(question) {
const readline = require("readline").createInterface({
input: process.stdin,
output: process.stdout,
});
return new Promise((resolve, reject) => {
readline.question(question, (answer) => {
resolve(answer);
readline.close();
});
});
}
このソースコードをコピーして、IDとパスワードを書き換え、auth.jsという名前で保存してください。ユーザープール設定はClaris ID用の設定になっているので書き換える必要はありません。
保存したら下記コマンドを実行します。
node auth.js
二段階認証を設定していない場合、IDとパスワードが正しければCognitoの認証が通り、CognitoのアクセストークンとClaris IDトークン、および更新トークンが表示されます。
二段階認証に対応する
では二段階認証を設定していた場合はどうなるでしょうか?
今回の調査中にこちらの記事で下記の記述を見かけました。[4]
FileMaker Cloudを利用するにあたり、Claris IDを二段階認証(2ステップ検証)にしているため、CognitoからClaris IDを用いてアクセスしても、SMSでの認証が起動するのである。
しかし、SMSで認証コードが送られてきても、それを入力する画面がないため、当然、認証をクリアできない。
Clarisのサポートに問い合わせてみると、二段階認証をOFFにするしかないとのこと。うーん。
しかしこれはClarisのサポートが間違っていて、実際には二段階認証を有効にしたままでも大丈夫です。
上述のプログラムは二段階認証に対応しています。二段階認証が設定されている場合はIDとパスワードの検証の後で認証コードの入力待ちになります。SMSで送られてきた認証コードを入力すると各種トークンが表示されます。
IDトークンを用いてData APIにアクセスする
これでようやくIDトークンを取得することができました。次はData APIにアクセスするためのトークンを取得します。こちらはHTTPだけでできます。[5][6]
curl -X POST -H 'Content-Type: application/json' -H 'Authorization: FMID {IDトークンの値}' -d '{}' https://{ホストURL}/fmi/data/v2/databases/{データベース名}/sessions
Authorization
のところがFMID
に変わっただけで、それ以外はオンプレミス版と同じです。以降の処理はオンプレミス版のData APIと同じなので省略します。
更新トークンを用いてIDトークンを再取得する
IDトークンは1時間で失効します。もちろん再度認証すればIDトークンを再取得することはできますが、二段階認証を毎回行うのは面倒ですよね。かといって二段階認証を無効にするのは大変危険です。
更新トークンを利用すると、二段階認証を有効にしたまま自動的にIDトークンを再発行できます。
更新トークンを用いてIDトークンを再発行するプログラムはこちらです。公式ドキュメントにはどこにも載っていなかったので、がんばって調べました。
const awsCognito = require("amazon-cognito-identity-js");
// IDと更新トークン(Refresh Token)
const ID = "hoge";
const REFRESH_TOKEN = "xxxxxxxxxxxxxxxxxxx";
// ユーザープール設定
const userPool = new awsCognito.CognitoUserPool({
UserPoolId: "us-west-2_NqkuZcXQY",
ClientId: "4l9rvl4mv5es1eep1qe97cautn",
});
// ユーザー決定
const cognitoUser = new awsCognito.CognitoUser({
Username: ID,
Pool: userPool,
});
// Refresh Tokenの設定
const cognitoRefreshToken = new awsCognito.CognitoRefreshToken({
RefreshToken: REFRESH_TOKEN,
});
// ユーザープール/ユーザー/更新トークンを使ってIDトークンを再取得
cognitoUser.refreshSession(cognitoRefreshToken, (err, result) => {
if (err) throw err;
// 成功時
// 認証完了トークンを取得。以降はこのトークンで認証済み確認
console.log(
"Cognito Access Token : " + result.getAccessToken().getJwtToken()
);
console.log("\nClaris ID Token : " + result.idToken.jwtToken);
console.log("\nClaris ID Refresh Token : " + result.refreshToken.token);
});
ソースコードをコピーして、IDとREFRESH_TOKENを書き換え、refresh.jsという名前で保存してください。
node refresh.js
実行すると各種トークンが表示されるのはauth.js
と同じですが、二段階認証の認証コード入力は必要ありません。
更新トークン(リフレッシュトークン)は1年間有効です。失効したらauth.jsを実行して新しい更新トークンを取得しましょう。
まとめ
FileMaker CloudでData APIを利用するための一連の手順を記述しました。トークンを取得するだけのために結構ガッツリとプログラムを書かなければいけないので、ローコード開発をうたうFileMakerとはかなり相性が悪いです。公式ドキュメントのソースコードを理解できる人ならそもそもFileMakerを使っていないでしょうし。
本来ならClaris側で簡単にトークンを発行できるUIを用意すべきだと思いますが、公式ドキュメントの貧弱さを見る限り望み薄です。こんなQAも見かけたので、ClarisとしてはData APIではなくサブスクリプションのClaris Connectを利用してもらう方向に顧客を誘導したいのでしょうね。
Discussion