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を自動生成する場合、scope
をsecure
に設定することでクレデンシャルが透過されるルーティングが生成されます。
②クレデンシャルを透過する設定(ルーティング手動作成)
routingを手動で作成する場合、qmonus
認可を有効化してinternal
をTrue
に設定することでクレデンシャルが透過されるルーティングとなります。
③クレデンシャルを透過しない設定
routingを手動で作成する場合、qmonus
認可を有効化してinternal
をFalse
に設定するとクレデンシャルが透過されないルーティングとなります。この場合は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
>>>