[ODC]Consume REST APIのBasic認証

OutSystemsのConsume REST API（外部のREST APIをOutSystemsのActionのように扱えるようにする機能）はBasic Authenticationをプロパティ指定だけで設定できる。
ちょっと使い方がわかりにくいようなので、手順を確認しておく。

なお、テスト用のREST API（ConsumeするAPI）は、参考に示した過去の記事で作成した以下のExpose REST APIを使う。AuthenticationプロパティをBasicにするのがポイント。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/63c54a95-0daf-1400-8639-f086adb9baaf.png)

# 環境情報
ODC Studio(Version 1.4.24)

# 参考
Expose REST APIのBasic Authenticationについては以下を参照。

https://qiita.com/jyunji_watanabe/items/bc914236a201f2f5ccea

Consume REST APIの公式ドキュメント（2024/09/20時点では日本語訳が無いようす）：
[Consume REST APIs - ODC Documentation](https://success.outsystems.com/ja-jp/documentation/outsystems_developer_cloud/integration_with_external_systems/consume_rest_apis/)

# Consume REST APIを定義
テスト用のAPIはOutSystemsで作成したExpose REST APIなので、swaggerファイルが自動生成される。

よって、このswaggerの定義を使ってConsume REST APIを定義する。
作成手順：
1. ODC Studio上でREST APIを右クリック
1. Open Documentationメニューを選択してswaggerドキュメントのページを開く
1. ページ上にある「swagger json」リンクのアドレスをコピー
1. ODC Studioに戻り、RESTを右クリック
1. Consume REST API...を選択
1. Add multiple methodsを選択
1. コピーしておいたアドレスを貼り付けて「Add methods」ボタンをクリック

Consume REST APIが出来上がる。
Descriptionプロパティには、Basic認証が必要であることを示すコメントが入っているものの、Authenticationは「No authentication」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/d386a5e5-3525-d69a-8983-9af730aa6764.png)

認証が設定されていないので、このままREST API Methodを呼ぶと、当然認証エラーになる。

以下で、Basic認証を設定する方法を示す。

# 方法１：Basic authenticationプロパティを設定する（Stage毎に固定の認証情報）
こちらは設定のみで可能な方法。
まずは、REST APIを選択し、Authentication > TypeプロパティでBasic authenticationを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/fed9362e-7a4c-392a-52de-d261762e8f06.png)

認証情報はODC PortalでStage毎に設定。
1. ODC PortalでAppのページを開く
1. Configurationタブ > Consumed REST APIsを展開し、作成したConsume REST APIのリンクをクリックして開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/acadb700-4ce7-8c96-3d0e-5459cdbfdd89.png)
3. Consume REST APIの設定ページが開くので右上のEditボタンをクリック
3. Basic authenticationのエリアで、ラジオボタンをCustomに変更し、使いたいBaisc認証用アカウント情報を設定し、Saveボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/2f1ef16a-b6da-b131-5b73-e91d1cf7c94d.png)

ただし、この情報は上の設定手順からもわかるように設定できる認証情報がStage・REST API毎で固定になる。

# 方法２：On Before Request Callbackでリクエストヘッダに設定する（実行時に動的に設定可能）
Authentication > typeはNo authenticationに戻す。Advanced > On Before RequestプロパティでNew OnBeforeRequestを選択し、Consume REST API Method実行時の前処理を作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/390aaf87-85a9-e9df-e904-0b508a4ba0c2.png)

このOnBeforeRequst内でCustomizedRequestというOutput Parameterを編集することでHTTPリクエストを変更できる。
HTTPリクエストヘッダーにAuthorizationヘッダーを追加すれば良い。
Authorizationヘッダーの値のフォーマットは、
1. 認証に使うUsernameとPasswordを「:」（半角コロン）で結合
1. 1の結果をBASE64エンコーディングする
1. 値は「Basic <2の結果>」

実装例（SettingsにUsernameとPasswordを設定しておく）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/edaa130f-7c4e-e18a-e85d-d650c15a040b.png)

先頭のAssignは自動で設定されるものなのでそのまま触らずにおく。
実装内容は、Action FlowにつけたCommentの通り。
最後のListAppendは、以下のパラメータを設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/554b053c-178b-94d9-be91-8fb3787c2c5a.png)

用途の例としては、OnBeforeRequest内で、Request.URLPathなどを見て対象のMethodを特定し、Method毎に異なる認証情報を設定する、などが考えられる。