このコンテンツに関して新しい記事があります

Questetra から HTTP リクエストを送付して、他サービスの REST API を呼び出して利用することができます。多くの API では認証(認可)方法として OAuth2 が利用されていますので、本記事では、Questetra を OAuth2 クライアントとして動作させる方法について記載します。
Questetra からは、次のモデリング要素のいずれかを利用して、HTTP リクエストを送付します。
- 「メッセージ送信中間イベント(HTTP)」
- 「スクリプトタスク」
- 「サービスタスク定義(Addon-XML)」
- OAuth2 での HTTP リクエストが定義されているもの
OAuth2 にはいくつかの種類(認可フロー)があるのですが、Questetra の「OAuth2 設定」は、grant-type が Authorization code である認可フローに対応しています。
2. 呼び出される相手サービス側での準備
3. 呼び出す側(Questetra)の OAuth2 設定
4. OAuth2 接続するためのモデリング要素の設定
5. Authorization Code 以外の grant-type の例
1. 手順の概要
設定の手順は、次の通りです。
- 呼び出される相手サービス側での準備
Questetra のコールバックURLを使って設定、クライアント ID とシークレットを取得 - 呼び出す側(Questetra)の設定
相手サービスのエンドポイント URL と取得したクライアント ID とシークレットを使って設定、トークンを取得 - API を呼び出すための Questetra 側の設定
取得した OAuth トークンを使って設定
2. 呼び出される相手サービス側での準備
呼び出される相手サービス側(OAuth2 サーバ側)では、OAuth2 クライアントの事前登録が必要となります。(「アプリ登録」等と呼ばれることもあります)
- Basic / Advanced / Professional のワークフロー基盤
→ https://s.questetra.net/oauth2callback - 各エディションの Trial モード(無料お試し)のワークフロー基盤の場合
→ https://f.questetra.net/oauth2callback
登録が完了すると、「クライアントID」/「クライアントシークレット」(「コンシューマ鍵」「APP ID」等/「クライアント機密コード」「コンシューマの秘密」等と呼ばれることもあり)が表示されるのでメモしておきます。
3. 呼び出す側(Questetra)の設定
ワークフローアプリ詳細画面の、[▼アプリ] > [OAuth 2.0 設定]メニューから設定画面を表示します。

[追加]ボタンを押して、詳細設定画面を開きます。
(ご利用のワークフロー基盤の「コールバック URL」は、この画面の下部でも確認できます)
各設定項目を入力して、[保存]ボタンを押します。

名称 | 値 |
---|---|
名前 | (好きな設定名で OK、後で指定する際に使います) |
認可エンドポイントURL、トークンエンドポイントURL | 相手サービス側のマニュアルを参照して入力します。 |
スコープ | 相手サービスや呼び出す API によって変わります。指定なしの場合もある。複数指定の場合は半角スペースで区切ります。 |
クライアントID、クライアントシークレット | 前述の相手サービスでの登録時にメモしたものを入力します。 |
設定を保存後、[トークンの取得]ボタンを押すと、相手サービスへのログインが求められるので、ログインします(利用のブラウザにて既に相手サービスにログインしている場合は、ログイン画面は表示されません)。その後、リソースへのアクセスの認可を求める画面が表示されるので、許可します。処理が正常に完了すると、トークンを取得し、次のような表示となります。

トークン取得に失敗した場合は、設定に不備がないかをご確認ください。設定を十分に確認しても不備が見当たらない場合には、そもそも Questetra が対応していない認可フローである可能性がございます。改めて、相手サービスの OAuth 通信について、ドキュメントをご確認ください。
4. OAuth2 接続するためのモデリング要素の設定
取得した OAuth トークンを利用するには、各モデリング要素にて、次のように指定します。
4.1. メッセージ送信中間イベント(HTTP)
「ヘッダ」タブの「Authorization ヘッダ」で「OAuth2」を選択し、3. で設定した OAuth2 設定の名前を指定します。
OAuth トークンを利用した HTTP リクエストを送信できるようになります。

4.2. スクリプトタスク
次のようなコードで、「OAuth2 設定」で取得したトークンを取得し、HTTP リクエストを送信できます。
const token = httpClient.getOAuth2Token( XXX_OAuth設定名_XXX );
httpClient.begin().bearer(token);
4.3. サービスタスク定義(Addon-XML)
「OAuth2 通信許可設定名」等で指定します。
(設定項目名はサービスタスク定義(Addon-XML)の仕様によります。)

5. Authorization Code 以外の grant-type の例
相手サービスで利用できる OAuth2 の grant-type が password / client_credentials の場合、「スクリプトタスク」を利用して、トークンを取得することが可能です。相手サービスがどの grant-type に対応しているかは、利用サービスのドキュメントでご確認ください。
いずれの場合も、相手サービス側で、Questetra を OAuth2 クライアントとして登録しておく必要があります。(2. を参照)
5.1. grant-type: password の例
トークンを取得し、API へリクエストを送信するサンプルコードです。
{} は、相手サービスや設定に応じて変更ください。
const clientId = "{クライアントID}";
const secret = "{クライアントシークレット}";
let accessLog = "";
//トークンを取得
const uriToken = "{トークンエンドポイント URL}";
const response = httpClient.begin()
.formParam( "grant_type", "password" )
.formParam( "client_id", clientId )
.formParam( "client_secret", secret )
.formParam( "scope", "write read follow" )
.formParam( "username", "{ログインユーザ名}" )
.formParam( "password", "{ログインパスワード}" )
.post( uriToken );
accessLog += "---POST request--- " + response.getStatusCode() + "\n";
accessLog += response.getResponseAsString() + "\n";
const oauthTokenObj = JSON.parse( response.getResponseAsString() );
const oauthToken = oauthTokenObj.access_token;
accessLog += "oauthToken: " + oauthToken + "\n";
//API へリクエスト送信(POST リクエストの場合)
const uriExecute = "{APIのエンドポイント URL}";
const responseExecute = httpClient.begin()
.bearer( oauthToken )
.formParam() // API 仕様に合わせてセット
.post( uriExecute );
accessLog += "---POST request--- " + responseExecute.getStatusCode() + "\n";
accessLog += responseExecute.getResponseAsString() + "\n";
engine.setDataByVarName("q_accesslog", accessLog);
5.2. grant-type: client_credentials の例
トークンを取得する際のサンプルコードです。API へのリクエスト送信は、grant-type: password の場合と同様ですので割愛します。
{} は、相手サービスや設定に応じて変更ください。
const clientId = "{クライアントID}";
const secret = "{クライアントシークレット}";
let accessLog = "";
//トークンを取得
const uriToken = "{トークンエンドポイント URL}";
const response = httpClient.begin()
.formParam( "grant_type", "client_credentials" )
.formParam( "client_id", clientId )
.formParam( "client_secret", secret )
.post( uriToken );
accessLog += "---POST request--- " + response.getStatusCode() + "\n";
accessLog += response.getResponseAsString() + "\n";
const oauthTokenObj = JSON.parse( response.getResponseAsString() );
const oauthToken = oauthTokenObj.access_token;
accessLog += "oauthToken: " + oauthToken + "\n";
//API へリクエスト送信
//以下、grant-type: password と同様