#dynamic #wso2 #token #wso2ei #mediator
Вопрос:
В моем случае я хочу добавить динамическое значение («Носитель» {токен доступа}) к посреднику заголовка . Поэтому перед посредником заголовка я хочу вызвать API get-token и извлечь элемент {access-token} из его ответа. Как я могу это получить ? Огромное спасибо.
Ответ №1:
Вы можете выполнить такие требования с помощью последовательностей посредничества. Вы можете обратиться к этому блогу для получения более подробных инструкций о том, как разработать последовательность для ваших требований. Блог написан для продукта API Manager, но, тем не менее, вы можете сделать то же самое, чтобы сделать это в EI.
Пример последовательности посредничества будет выглядеть следующим образом
<?xml version="1.0" encoding="UTF-8"?>
<sequence name="oauth2-sequence" xmlns="http://ws.apache.org/ns/synapse">
<!-- token generation to the oauth server's token endpoint -->
<!-- add the base64 encoded credentials -->
<property name="client-authorization-header" scope="default" type="STRING" value="MDZsZ3BTMnh0enRhOXBsaXZGUzliMnk4aEZFYTpmdE4yWTdLcnE2SWRsenBmZ1RuTVU1bkxjUFFh" />
<property name="request-body" expression="json-eval($)" scope="default" type="STRING" />
<property name="resource" expression="get-property('axis2', 'REST_URL_POSTFIX')" scope="default" type="STRING" />
<!-- creating a request payload for client_credentials -->
<payloadFactory media-type="xml">
<format>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<root xmlns="">
<grant_type>client_credentials</grant_type>
</root>
</soapenv:Body>
</soapenv:Envelope>
</format>
<args></args>
</payloadFactory>
<!-- set related headers to call the token endpoint -->
<header name="Authorization" expression="fn:concat('Basic ', get-property('client-authorization-header'))" scope="transport" />
<header name="Content-Type" value="application/x-www-form-urlencoded" scope="transport" />
<property name="messageType" value="application/x-www-form-urlencoded" scope="axis2" type="STRING" />
<property name="REST_URL_POSTFIX" value="" scope="axis2" type="STRING" />
<!-- change the token endpoint -->
<call blocking="true">
<endpoint>
<http method="POST" uri-template="https://localhost:9443/oauth2/token" />
</endpoint>
</call>
<!-- append the acquired access token and make the call to the backend service -->
<property name="bearer-token" expression="json-eval($.access_token)" scope="default" type="STRING" />
<property name="REST_URL_POSTFIX" expression="get-property('resource')" scope="axis2" type="STRING" />
<header name="Authorization" expression="fn:concat('Bearer ', get-property('bearer-token'))" scope="transport" />
<payloadFactory media-type="json">
<format>$1</format>
<args>
<arg evaluator="xml" expression="get-property('request-body')" />
</args>
</payloadFactory>
<!-- perform a send or call to complete the execution of the backend service call in EI -->
</sequence>
Надеюсь, это поможет вам начать с внедрения.
Комментарии:
1. Ткс так много. Можете ли вы объяснить часть «REST_URL_POSTFIX»? Мне это не совсем ясно
2.
REST_URL_POSTFIX
Содержит оставшийся URL-адрес ресурса API (например:/api/v1/operation
-> >operation
будет сохранен какREST_URL_POSTFIX
). Если вы вызываете API/api/v1/operation
и в последовательности , если вы пытаетесь вызвать конечную точку какhttps://some-host/token
, URL-адрес будет выглядеть следующим образом:https://some-host/token/operation
. Поэтому мы должны удалить это и снова добавить его при вызове реальной службы. Вы можете узнать об этом объекте недвижимости в [здесь ]( docs.wso2.com/display/ESB470/HTTP Транспорт Недвижимость )3. Можете ли вы объяснить, для чего в конечном итоге используется посредник <payloadFactory>? Я так благодарна вам за помощь!
4. В середине последовательности мы используем a
PayloadFactory
для создания полезной нагрузки для генерации токена. Таким образом, если вы вызываете запрос POST (который является фактическим вызовом REST), то отправленной вами полезной нагрузки запроса не будет в EI, так как мы изменили полезную нагрузку с помощьюPayloadFactory
. Поэтому в конце мы добавляем ещеPayloadFactory
один, чтобы снова создать фактическую полезную нагрузку, чтобы отправить ее на серверную часть.5. Вы можете захватить полезную нагрузку запроса с помощью
$body
(без использованияjson-eval($)
) и обновитьPayloadFactory
данные посредникаmedia-type
какxml