OutSystems 11にはあった、サーバサイドでUsernameとPasswordを指定して(あるいはUserIdだけを指定して)ログインさせるActionが、ODCでは無くなった。
そのため、認証をかけたExpose REST APIで、各Methodで認証を通ったユーザー名などの情報を取ろうと思うと、リクエストヘッダからBasic認証情報を再取得する必要がある。この手順を確認しておく。
環境情報
ODC Studio(Version 1.4.21)
Basic認証付きExpose REST APIの作り方
作成したREST APIのプロパティから、Security > AuthenticationでBasicを選択。
自動的にOnAuthentication Callbackが作成され、Basic認証情報がそのInput Parameterとして渡される。
ODCでBasic認証する場合の問題点
サーバーサイドでUsernameとPassword (Users/User_Login Action) 、あるいはUserId ((System)/Login Action) を指定してログインさせるActionが、OutSystems 11にはあった。
しかし、ODCにはそういうActionが無い。
⇨ OnAuthenticationで、受け取ったUsernameとPasswordをEntityやSettingの値に対して検証することはできるが、「ODCにログインさせる」ことはできない
⇨ 後続のREST API Methodで「ログイン中のユーザーの情報を取り出す」ことができない
という問題がある。
この問題の解決策として、REST API Methodでも、Basic認証の認証情報を取り出す方法を確認しておく。
Basic認証情報のフォーマット
入力したBasic認証情報は、Authorizationというリクエストヘッダーに、「Basic Base64エンコードしたUsername:Password」という形式で入る。
以下は、Basic認証をかけたExpose REST APIにリクエストし、Username=testuser、Password=testpasswordを入力した場合のヘッダの例。
REST API Method中で、Basic認証情報を取り出す方法
リクエストヘッダに平文で入っているわけなので、標準APIの組み合わせで取得可能。
処理の流れは以下の通り。
- リクエストヘッダを取るにはHTTP/Request_GetHeader Actionを使う。NameパラメータにはAuthorizationを指定
- 取得したヘッダ値先頭にある「Basic 」(スペースがついていることに注意)を、Built-in FunctionのSubstrを使って切り捨て、Base64エンコードした部分を切り出す
- BinaryData/Base64ToBinary ActionでBase64エンコードした文字列をBinary Data型に変換(直接Text型にするActionが標準にはないので)
- BinaryData/BinaryDataToText ActionでBinary DataをText型に戻す
上記の流れを実装した例。コメントに各ステップでプロパティに設定する値を示している。BinaryDataToTextのOutput Parameterに「Username:Password」形式の文字列が入っている。