HULFT Squareのリフレッシュトークンでアクセストークンを更新して実行してみた

## はじめに

こんにちは。すぎもんです:grinning:
HULFT Square にはURLを公開して外部から実行することが出来ます。(REST APIジョブ機能）
詳細は以前、[Web APIとして公開して、外部サーバから HTTPリクエストで実行してみた](https://qiita.com/sugimon/items/3d3e407381298ac18312)という記事を公開したので見て頂けたら幸いです。
今回は、実行する際に、リフレッシュトークンを使用してアクセストークンを更新してから実行してみようと思います。

:::note info
リフレッシュトークンは、アクセストークンの有効期限が切れた際に新しいアクセストークンを取得するために使用されるセキュリティトークンです。
これにより頻繁にログイン、更新をする必要がなくなります。
:::



## 今回やること

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1daf2a91-b949-c900-8faf-c672fc21fdd8.png)



**1 ) HULFT SquareでREST APIジョブを作成する**
　➀外部からのHTTPリクエストで実行するスクリプトの作成
　➁APIプロジェクト作成
　➂APIクライアント作成
　➃REST APIジョブ作成
　➄リフレッシュトークンの取得
  　
**2 ) オンプレミスから実行する**
　➀Windows PowerShell作成
　➁実行、確認


## 1 ) HULFT SquareでREST APIジョブを作成する
#### ➀外部からのHTTPリクエストで実行するスクリプトの作成

今回はBoxドライブにあるファイルをAmazonS3にアップロードするスクリプトを実行します。
・プロジェクト名　：`プロジェクト`
・スクリプト名　　：`Cloud`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/42cda0f2-ed12-48b0-a13a-a18d400713f4.png)


実際に扱うCSVファイルには、このようなデータが格納されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a4700501-8b5d-013a-d56a-5113cc316155.png)


#### ➁APIプロジェクト作成

ここでは、作成したプロジェクトを、Web APIとして公開するための設定をします。
HTTP RESTのエンドポイントとなるURLの基本パス(実行するパスの一部)を作成したり、実行スクリプトと紐づけするHTTPメソッドを管理したりします。

設定は、「ナビゲーションメニュー　<img width="18" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/482f2ecc-55f1-014d-8862-f21a6109e059.png">　> APIマネジメント > APIプロジェクト」から設定出来ます。

・名前　　　：　`API_Project`
・基本パス　：　`API_Project_Path`
作成出来たら「次へ」を押して「サマリー」ページがでましたら完了を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/64fb4a28-5352-7d88-9101-93b05d41d6eb.png)


APIプロジェクト全体のページがでましたら、リソース(※赤枠アイコン)を作成してHTTPメソッドを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/888045f0-7564-a778-03b6-b0f635370012.png)


リソースに「HTTPメソッドを追加 > GET」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ccf70194-2db1-7e37-ffeb-7852a064dc8c.png)

****HTTPリクエストで実行するスクリプトの設定****
ここでは、実行させるスクリプトを指定します。
今回は実行させるだけなので、***実行スクリプト***の設定をします。

＜実行スクリプト＞
***設定(1)***
・プロジェクト　：`プロジェクト`　➀で作成したプロジェクト
・バージョン　　：※最新バージョン　
・スクリプト　　：`Cloud`　➀で作成したスクリプト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b6561e79-3d83-8464-1212-ce753ca01440.png)



***設定(2)***
　「`依存関係`」ボタンをクリックし「`適用`」を押します。
 APIプロジェクトのリソースの設定画面に戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/07e305ed-cb17-ddb5-77ba-0ce19d316750.png)

:::note warn
***依存関係***とは
「依存関係」機能は最新版のHULFT Squareに備わった機能です。
これを使用することで、スクリプトで追加開発などをした際に自動で実行するスクリプトを最新版にバージョンアップさせることが出来ます。
:::

ここまで出来ましたら、APIプロジェクトのリソースの設定画面一番下の「`適用`」を押すことで設定を保存できます。

#### ➂APIクライアント作成

ここでは、作成したAPIにアクセスできるメンバーの設定や、実行可能なIPアドレス許可リストを設定します。

設定は、「ナビゲーションメニュー　<img width="18" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/482f2ecc-55f1-014d-8862-f21a6109e059.png">　> APIマネジメント > APIクライアント」から設定出来ます。

名前　：　`API_client`
メンバー　：　※自分のアカウント
IPアドレス許可リスト：※HTTP RESTリクエストをする外部サーバのIPアドレス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d6538774-5bd4-6257-33a8-2d1162d9ac7f.png)

:::note warn
「IPアドレス許可リスト」は何も指定しない場合はフルオープンになります。
:::

ここまで出来ましたら、APIクライアントの設定が完了しました。


#### ➃REST APIジョブ作成

ここでは、作成済みのAPIプロジェクトをウェブブラウザやツールなどからのHTTP RESTリクエストによって実行可能にするジョブを作成できます。

設定は、「ナビゲーションメニュー　<img width="18" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/482f2ecc-55f1-014d-8862-f21a6109e059.png">　> ジョブ > REST APIジョブ」から設定出来ます。

`新規追加`を押下したあと作成していきます。

ワークスペース　 ：　実行するワークスペース
APIプロジェクト　：　`API_Project_Path`　※「➁APIプロジェクト作成」の基本パス
APIプロジェクトバージョン　：最新バージョン ※更新ごとにバージョンが上がります
リソースを読み込むためのプロファイル　： ※実行するプロファイルを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/64302bee-ca2e-2720-7336-5dba89851aa2.png)

:::note info
依存関係を押すと、スクリプトやプロジェクトバージョンを確認することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/20d09e0f-df2e-8111-b210-63cc4b107216.png)
:::

APIクライアント　：　`API_client`　※「➂APIクライアント作成」で作成した名前

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/bec71235-c565-2272-d0cf-7b0d55744818.png)


「スクリプト実行のためのサービス」を設定し「次へ」を押下したあとに全体のサマリーが出ます。
設定内容を確認して、完了を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/dd34ddfa-1b25-2206-2499-a714c522fb2e.png)


**REST APIジョブ**が作成できました。
一覧から、作成した「API_Project_Path」が確認出来ます。

登録したAPIプロジェクトの右にある <img width="18" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a9df1010-5106-1ffc-3867-e208118025ab.png"> を選択すると、操作メニューが表示されます。
「情報」を押下してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/16d4ac99-8a5a-0131-3123-cddf788d33b2.png)

HTTPリクエストで使用するエンドポイントとなるURLが自動生成されているので確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a82e4f45-c630-ce84-37b1-c5d0876d122a.png)

これで、実行するためのエンドポイントとなるURLが取得出来ます。

#### ➄リフレッシュトークンの取得

ここでは、リフレッシュトークンを取得します。
「➂APIクライアント作成」の「メンバー」で、Web APIへアクセスできるユーザを設定しましたので、メンバーに設定したユーザで実行する為に期限が切れていない最新のアクセストークンが必要になります。
自動で更新した後のアクセストークンを取得するためのリフレッシュトークンを取得します。

:::note warn
リフレッシュトークンとは、HULFT SquareのWeb画面ではなく、お客様環境のプログラムでAPIからアクセストークンを更新する際に使用するものです。
:::

HULFT Square管理画面の右上にあるユーザ情報の「個人設定」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/eb3d13c9-7404-9079-e795-a1e37a3b3e76.png)



「個人設定＞アクセストークン」の「アクセストークンを生成」を押下したあと
「リフレッシュトークン」をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/96890143-3550-a6b7-e2d6-6ec19e3e532b.png)



これで実行する為の設定が完了しました。




## 2 ) オンプレミスから実行する

#### ➀Windows PowerShell作成

ここでは、Windows PowerShellで実行出来るようにファイルを作成します。
下記コマンドの(1)(2)(3)(4)を変更して`.ps1`といった拡張子のファイルとして保存します。

```ruby:PowerShell
# Step 1 : メールとパスワードを使ってログインAPIでアクセストークンを取得する
$email = "<(1)メールアドレス>"
$password = "<(2)パスワード>"
$response = Invoke-WebRequest -Uri "https://app.square.hulft.com/v1/users/login" -ContentType "application/json" -Method POST -Body "{""email"": ""$email"",""password"": ""$password""}"
$accessTokenEmailPassword = (ConvertFrom-Json $($response.Content)).accessToken

# Step 2 : リフレッシュトークンを使用して、Login APIでアクセストークンを取得する
$refreshToken = "<(3)リフレッシュトークン>"
$response = Invoke-WebRequest -Uri "https://app.square.hulft.com/v1/rest-api-token" -ContentType "application/json" -Headers @{"Authorization" = "Bearer $accessTokenEmailPassword"} -Method POST -Body "{""refreshToken"": ""$refreshToken""}"
$accessToken = (ConvertFrom-Json $($response.Content)).accessToken

# Step 3 : 取得したアクセストークンを使ってHTTPクライアントからREST API Job Endpointを実行する
$url = "https://<(4)REST APIジョブのURL>"
$response = Invoke-WebRequest -Uri $url -ContentType "application/json" -Headers @{"Authorization" = "Bearer $accessToken"} -Method GET

# Print the response
$response.Content
```
| 要素 | 説明 |
|:-|:-|
| (1)メールアドレス | HULFT Squareにログインする際に使用したメールアドレス |
| (2)パスワード | HULFT Squareにログインする際に使用したパスワード |
| (3)リフレッシュトークン | 「➄リフレッシュトークンの取得」で取得したもの |
| (4)REST APIジョブのURL | 「➃REST APIジョブ作成」で発行したURL |

今回は上記のコマンドを`run_steps.ps1`というファイル名にしてCドライブ直下に保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/e47b6548-ebf2-7a58-6171-733aac859bc9.png)


ここまでで、実行するファイルの作成は完了です。


#### ➁実行、確認
ここからは、実際にPSファイルを実行してみます。
実行には下記のコマンドを使います。

```ruby:実行コマンド
powershell -ExecutionPolicy Bypass -Command "& { C:\run_steps.ps1 }"
```

:::note info
今回はどこのファイルパスでも実行できるようにフルパスで指定しましたが、Cドライブから実行する場合は、`"& { .\run_steps.ps1 }"`に変えても大丈夫です。
:::


今回は、コマンドプロンプトで実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d0b83a9e-f762-16f7-0f7c-d4a24715b65e.png)



実行出来たかHULFT Squareのログを確認してみます。
「 <img width="18" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/95eb5273-dac3-ab61-0e13-186b6a7419c4.png"> > 監査 > REST APIジョブアクセスログ」を開くことで実行出来たか確認することが出来ます。
ステータスコードが200になっているのが確認出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/79218d3e-cbec-bba5-0868-558246fd0b07.png)



AmazonS3も確認してみます。
無事に格納されているのが確認出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/75d70fc6-789a-a905-79fc-5cb93ab46814.png)

データも無事に格納出来ていることが確認出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a4700501-8b5d-013a-d56a-5113cc316155.png)


## 最後に
いかがでしたでしょうか。外部のサーバーから実行させる際にアクセストークン毎度を更新する作業がコマンドで出来れば楽になるかと思います。
今回は、コマンドで実行してみましたが、バッチファイルにしたり、オンプレミスのシステムと連携させるのに長期的に任意のタイミングで実行させることが出来るので、使い方の幅が広がるのではないでしょうか。

このブログでは、今後も様々なTopics記事や接続検証等、皆さんの参考になるような記事を投稿していきたいと思います！
ここまで読んでいただきありがとうございました。それでは、また！:raised_hand: