はじめに
この記事では、BTP ABAP環境 (Trial)で作成したODataサービスをCPIから呼ぶ方法について説明します。一見簡単そうですが、認証の仕方がちょっと特殊なので、そこがこの記事のテーマとなります。
BTP ABAP環境での認証方法
BTP ABAP環境のODataサービスを呼ぶには、OAuth 2.0 Password Grant Typeを使い、ログインユーザとしてアクセスする必要があります。CPIのSecurity MaterialにはPassword Grantは用意されていないので、トークンを取得する処理を自分で実装する必要があります。
事前準備
トークンを取得するために、XSUAAのサービスインスタンスを作成しておきます。プランは"apiaccess"とします。
cf create-service xsuaa apiaccess <access_name> //サービスインスタンスの作成
cf create-service-key <access_name> <key_name> //サービスキーの作成
Postmanから呼んでみる
呼び出すODataサービスは何でもよいですが、今回は自分で作ったサービスを呼んでみます。URLは、abap-trialのサービスキーの中にあるurlと、
"Service URL"に表示されている以下の部分を結合したものになります。
例:https://e70506aa-ddc0-435c-aab6-7abc40008538.abap.eu10.hana.ondemand.com/sap/opu/odata/sap/ZUI_A_SALESORDER_O2
1. トークンを取得
以下のパラメータを設定し、トークンを取得します。
項目 | 設定値 | |
---|---|---|
URL | XSUAAのサービスキーに記載のurl + /oauth/token | |
ヘッダ | Content-Type | application/x-www-form-urlencoded |
パラメータ | grant_type | password |
username | BTPログイン用のメールアドレス | |
password | BTPログイン用のパスワード | |
client_id | XSUAAのサービスキーに記載のclient_id | |
client_secret | XSUAAのサービスキーに記載のclient_secret |
2. サービスを呼ぶ
続いて、ODataサービスのメタデータを取得してみます。
項目 | 設定値 | |
---|---|---|
URL | 上記で確認したURL + /$metadata | |
ヘッダ | Authorization | Bearer + 1.で取得したaccess_token |
フローの作成
Postmanで確認した通り、BTP ABAP環境のODataサービスを呼ぶステップは大まかには以下になります。
トークン取得用のフロー
1. ProcessDirect
ProcessDirect Adapterは外部のフローからこのフローを呼びだすためのアダプターです。設定内容はアドレスのみです。
2. Set Header & Body [Content Modifier]
トークン取得用のエンドポイントに渡すヘッダとボディを編集します。
ヘッダにはcontent-typeとしてapplication/x-www-form-urlencoded
を設定します。
ボディには固定値で以下を設定します。
username=<BTPログイン用のメールアドレス>&password=<BTPログイン用のパスワード>&client_id=<XSUAAのサービスキーに記載のclient_id>&client_secret=<XSUAAのサービスキーに記載のclient_secret>
※本来これらは直接フローに書かずにSecurity Materialから取得したほうがよいのですが、簡単にするためにベタ書きしています。
3. Get Token [HTTP Adapter]
4. JSON to XML Converter
取得したトークンを次のステップで取得しやすくするため、レスポンスをXML形式に変換します。以下の設定はデフォルトのままです。
5. Extract Token [Content Modifier]
このフローは、最終的にボディにトークンを設定して返します。このために、このステップでは以下のことを行います。
- トークンをプロパティに格納
- プロパティからトークンを取得し、ボディに設定
トークンをプロパティに格納
XMLに変換しておいたので、XPathを使ってトークンにアクセスできます。
アウトプット
最初のProcessDirectを一時的にHTTPアダプターに変えてテストしてみると、以下のレスポンスが返ってきます。
メインのフロー
1. HTTP Sender Adapter
HTTPリクエストでフローを呼ぶため、HTTP Sender Adapterを使用します。
2. Get Token [ProcessDirect]
3. Set Headers
取得したトークン(ボディに入っている)を、AuthorizationヘッダにBearer <token>
の形で設定します。
4. Call CAP OData [OData V2 Adapter]
RAPのODataサービスに対してGETリクエストを投げます。
Request Headersに前のステップで作成したAuthorization
を設定します。