ScenarioのAPIをコールしたQmonusアカウントを特定する方法を教えてください



Qmonus SDKにおける、API呼び出しの認可は、APIGWがリクエスト拡張ヘッダのX-Xaas-Auth-Tokenに対してRBACを適用することで実現されています。
クレデンシャルの発行手順などは、Docs » API Gateway » 認証・認可を参照してください。

Scenarioの中でQmonusアカウントを特定するためには、APIGWで認可されたクレデンシャルをScenarioサーバ向けのリクエストに透過する必要があります。
APIGWのルーティングプラグインのデフォルトは、Qmonusの独自拡張ヘッダを後段に透過しない動作となっています。これは、外部サービスに向けたプロキシルーティングにおいてクレデンシャルの流出を防ぐための挙動です。拡張ヘッダの透過を有効化するには、Qmonus SDK内部のルーティングであることを宣言する必要があります。これはルーティングプラグインのinternalオプションをTrueにすることを意味します。


①クレデンシャルを透過する設定(ルーティング自動生成)

Qmonus SDKアカウントを取得するScenarioにおいてroutingを自動生成する場合、scopesecureに設定することでクレデンシャルが透過されるルーティングが生成されます。


②クレデンシャルを透過する設定(ルーティング手動作成)

routingを手動で作成する場合、qmonus認可を有効化してinternalTrueに設定することでクレデンシャルが透過されるルーティングとなります。


③クレデンシャルを透過しない設定

routingを手動で作成する場合、qmonus認可を有効化してinternalFalseに設定するとクレデンシャルが透過されないルーティングとなります。この場合はScenario側でQmonusアカウントを特定することはできません。



ScenarioでQmonusアカウントを取得する方法

前述した①もしくは②の設定環境でクレデンシャルがScenarioまで透過されてくるとカスタムスクリプトで以下のようにクレデンシャルを抽出できます。

# 書き方①
credential = context.request.headers.X_Xaas_Auth_Token

# 書き方②
credential = context.request.headers["X-Xaas-Auth-Token"]


クレデンシャルからQmonusアカウントを取得するには、QmonusAccount組込クラスのloadクラスメソッドを使用します。

account = await QmonusAccount.load(context.request.headers.X_Xaas_Auth_Token)



サンプルアプリケーション

以下のScenarioは、登録するとクレデンシャルを透過するルーティングを自動生成します。またAPIGWを経由して呼び出すとユーザ名を返却します。

- category: example
  name: getAccount
  uri: /getAccount
  method: GET
  request_timeout: 60
  connect_timeout: 60
  routing_auto_generation_mode: true
  routing_options:
    scope: secure
  commands:
    - command: script
      kwargs:
        code: |-
          account = await QmonusAccount.load(context.request.headers.X_Xaas_Auth_Token)
          context.session.finish({"you": "hello, %s" % account.username})


以下はREPLでの動作確認例です。

>>> r = await callout(path="/logon", method=POST, headers={"X-Xaas-Api-Key": <API鍵>}, body={"username": "example", "password": "example123!"})↵
... credential = MU(json.loads(r.body)).x_xaas_auth_token↵
... r = await callout(path="/getAccount", headers=HTTPHeaders({"X-Xaas-Auth-Token": credential}))↵
... print(r.body)↵
... ↵
↵
b'{"you":"hello, example"}'
>>>


Tip

QmonusAccountインスタンスは、kwargs属性にMU型でアカウント情報を保持しています。ドットアクセスで各属性を参照することができます。

>>> a = await QmonusAccount.load(credential)↵
... print(a.kwargs.yaml_format)↵
... ↵
↵
api_expire: null
api_key: CW9QWmTNsBhJnKdBfKuJB9gXyQcap7DbH4K4p7EsBhswUDhK8snxLfC68qWwPeeK
expire_days: null
image: null
metadata:
  userGroup: group1
password: example123!
role: admin
username: exampleUser
>>>