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

Questetra から HTTP リクエストを送付して、他サービスの REST API を呼び出して利用することができます。多くの API では認証(認可)方法として OAuth2 が利用されていますので、本記事では、Questetra を OAuth2 クライアントとして動作させる方法について記載します。

Questetra からは、次のモデリング要素のいずれかを利用して、HTTP リクエストを送付します。

OAuth2 にはいくつかの種類(認可フロー)があるのですが、Questetra の「OAuth2 設定」は、grant-type が Authorization code である認可フローに対応しています。

目次
1. 手順の概要
2. 呼び出される相手サービス側での準備
3. 呼び出す側(Questetra)の OAuth2 設定
4. OAuth2 接続するためのモデリング要素の設定
5. Authorization Code 以外の grant-type の例

1. 手順の概要

設定の手順は、次の通りです。

  1. 呼び出される相手サービス側での準備
    Questetra のコールバックURLを使って設定、クライアント ID とシークレットを取得
  2. 呼び出す側(Questetra)の設定
    相手サービスのエンドポイント URL と取得したクライアント ID とシークレットを使って設定、トークンを取得
  3. 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 と同様
%d人のブロガーが「いいね」をつけました。