FileMaker CloudにREST APIでアクセスしたい！

# やりたいこと

ClarisのFileMaker Cloudサービスを利用して稼働しているFileMakerのデータベースに、外部からREST APIにて接続し、データを取得。整形して表示したい。

# 環境

* FileMaker Pro 19.1.2
* FileMaker Cloud 2.19.0.210

※バージョンが変わったら方法も違うかもしれませんのでご注意ください。

# 準備
## FMID Tokenの取得

まず、 [FileMaker Data API チュートリアル1・認証](https://risingsun-system.biz/filemaker-data-api-authentication/) を参考にして、Basic認証を試して見るが、サーバがFileMaker Cloudの場合はBasic認証はダメでした。

FileMakerのドキュメント [外部認証でのFileMaker IDの使用](https://fmhelp.filemaker.com/cloud2/edition/ja/customer-console-help/index.html#page/fcc-help/create-fmid-token.html) を見ると、

> FileMaker Cloud で Claris FileMaker Data API または OData API を使用する場合は、FileMaker ID を使用して認証する必要があります。FileMaker Cloud では外部認証に Amazon Cognito を使用します。

とあります。どうもAmazon Cognitoというものを利用する必要がありそうです。

## Amazon Cognito

Amazon Cognitoは、AWSサーバへの認証機能のようで、JavaScriptを使っての認証機能を提供してるようです。

 * [AWS SDK for JavaScriptを使ってブラウザーからCognito User Poolsへサインアップしてみた](https://dev.classmethod.jp/articles/singup-to-cognito-userpools-using-javascript/)
 * [Amazon Cognitoの認証情報を取得してみる～JavaScript編～](https://www.tdi.co.jp/miso/amazon-cognito-javascript)
 * [Amazon Cognito とは](https://qiita.com/fjisdahgaiuerua/items/d420a2137e8d67e0a190)

うーん。FileMaker ID(FMID) Tokenが欲しいだけなんですけど、FileMaker単体ではそれはできず、JavaScriptを使ってCognitoにアクセスする必要があります。(FileMaker CloudがAWS上で動いているため）

FileMakerには、WebView機能があり、そこにHTML,JavaScriptを流し込むことである程度のScriptを実行できるので、そこでなんとかならないか？と考えたのですが、Cognito関連のJavaScriptファイルが必要なため、FileMakerだけでは完結しませんでした。(Cognito関連のすべてのJavaScriptをCDNから利用できたらよかったのですが）

[Using the Data API on FileMaker Cloud
By Wim Decorte November 6, 2019](https://www.soliantconsulting.com/blog/data-api-filemaker-cloud/)

上記サイトと、[外部認証でのFileMaker IDの使用](https://fmhelp.filemaker.com/cloud2/edition/ja/customer-console-help/index.html#page/fcc-help/create-fmid-token.html) を参考して作ったスクリプトは、

## tokenの取得

```html:fmid.html
<html>
<head>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn2.js"></script>
<script src="https://**************/aws-sdk.js"></script>
<script src="https://**************/aws-cognito-sdk.min.js"></script>
<script src="https://**************/amazon-cognito-identity.min.js"></script>
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>

<script>
var authenticationData = {
    Username : 'Claris IDのアカウント',
    Password : 'Claris IDのパスワード',
};
var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
var poolData = { UserPoolId : 'us-west-2_NqkuZcXQY',
    ClientId : '4l9rvl4mv5es1eep1qe97cautn'
};
var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
var userData = {
    Username : 'Claris IDのアカウント',
    Pool : userPool
};
var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);

cognitoUser.authenticateUser(authenticationDetails, {
  onSuccess: function (result) {
      var Cognito_access_token = result.getAccessToken().getJwtToken();
      var FileMaker_ID_token = result.idToken.jwtToken;
      var FileMaker_ID_refresh_token = result.refreshToken.token;

      console.log(FileMaker_ID_token);
      console.log(FileMaker_ID_refresh_token);
  },
  onFailure: function(err) {
      alert(err);
  },
}):
</script>
</head>
<body>
hello!
</body>
</html>
```

aws-sdk.js , aws-cognito-sdk.min.js , amazon-cognito-identity.min.jsは、Amazon Cognitoの説明しているサイトから探して、上記HTMLと同じサイトに設置してください。

そのHTMLファイルにブラウザからアクセスし、Consoleを見ると、tokenが出力されている・・と思ったら、されてなく、替わりに携帯にSMSで認証コードが送られてきた。

FileMaker Cloudを利用するにあたり、Claris IDを二段階認証（2ステップ検証）にしているため、CognitoからClaris IDを用いてアクセスしても、SMSでの認証が起動するのである。

しかし、SMSで認証コードが送られてきても、それを入力する画面がないため、当然、認証をクリアできない。

Clarisのサポートに問い合わせてみると、二段階認証をOFFにするしかないとのこと。うーん。

検証のため、一旦二段階認証をOFFにして試して見ると、やっとConsoleに出力された。

Cognitoから返ってくる値としては、

* accessToken
* idToken
* refreshToken

があり、それぞれ、

> **The Access Token** grants access to authorized resources.
> According to the Amazon AWS documentation these tokens represent:
> **The ID Token** contains claims about the identity of the authenticated user such as name > and email.
> **The Refresh Token** contains the information necessary to obtain a new ID or access token.

とのこと。FileMaker Cloudでの認証には、id Tokenか、refresh Tokenを使えばいいということでした。

```javascript
      var FileMaker_ID_token = result.idToken.jwtToken;
      var FileMaker_ID_refresh_token = result.refreshToken.token;
```
この2つが取得できれば良さそうです。

しかし、RESTでアクセスするたびに、上記tokenが必要なの？？と思ったら、

https://fmhelp.filemaker.com/cloud2/edition/ja/customer-console-help/index.html#page/fcc-help/create-fmid-token.html

> FileMaker ID トークンは、FileMaker Data API または OData API を使用する際の認証に使用され、1 時間有効です。FileMaker ID 更新トークンを使用すると FileMaker ID トークンの期限が切れた後もスクリプトを継続して動作させることができます。更新トークンは 1 年間有効です。

とのこと。refresh tokenを使えば、しばらくはTokenの取得をしないでも良さそう。

# PostmanでRESTでの接続

先ほど取得したtokenを使い、Postmanを利用して、RESTでの接続を試します。

(作成中）


# まだ分からないところ

refresh tokenを用いてsessions エンドポイントにアクセスすると、

```javascript
{
    "messages": [
        {
            "code": "212",
            "message": "Invalid user account or password"
        }
    ],
    "response": {}
}
```

というレスポンスになる。id Tokenであれば、認証OKだった。refresh Tokenの使い方が間違ってるのだろうか？？

実際のデータ取得については、これから検証する。