получение токена от Cognito и кеширование в wso2 Enterprise Intigrator - PullRequest
0 голосов
/ 05 марта 2020

Мне нужно получить токен от Cognito, но я не знаю, как получить его через корпоративного интегратора. У меня есть client_id и client_secet и конечная точка также. Но я не могу получить токен, кажется, я неправильно вызываю конечную точку с правильным параметром.

После получения токена мне нужно его кешировать до истечения срока действия токена, чтобы мне не приходилось снова и снова вызывать

вот код, который я пытаюсь

<cache id="cache-sample" scope="per-host" collector="false" hashGenerator="org.wso2.carbon.mediator.cache.digest.DOMHASHGenerator" timeout="5000">
    <implementation type="memory" maxSize="1000"/>
</cache>
<header name="client_id" scope="transport" value="XXXXXXXXXXXXXXXXX"/>
<header name="client_secret" scope="transport" value="XXXXXXXXXXXXXXXXXXX"/>
<header name="Content-Type" scope="transport" value="application/json"/>
<property name="DISABLE_CHUNKING" scope="axis2" type="STRING" value="true"/>
<call>
    <endpoint>
       <address uri="https://xcxxxxxxxxxx.auth.us-east-1.amazoncognito.com/oauth2/token"/>
    </endpoint>
</call>
<property name="RESPONSE" value="true" scope="default" type="STRING"/>
<cache scope="per-host" collector="true"/>
<respond/>

1 Ответ

0 голосов
/ 13 марта 2020
<?xml version="1.0" encoding="UTF-8"?>
<api context="/api/myService" name="myService-api" xmlns="http://ws.apache.org/ns/synapse">
    <resource methods="POST" uri-template="/getToken">
        <inSequence>
            <script language="js"><![CDATA[var payload = mc.getPayloadXML();
                var log = mc.getServiceLog();
                var client_id = payload..*::client_id.toString();
                var client_secret = payload..*::client_secret.toString();
                mc.setProperty("client_id", client_id);
                mc.setProperty("client_secret", client_secret);]]>
            </script>
            <payloadFactory media-type="json">
                <format/>
                <args/>
            </payloadFactory>
            <property name="ContentType" scope="axis2" type="STRING" value="application/x-www-form-urlencoded"/>
            <property expression="fn:concat($ctx:client_id,':',$ctx:client_secret)" name="credentials" scope="default" type="STRING"/>
            <property expression="fn:concat('Basic ', base64Encode($ctx:credentials))" name="Authorization" scope="transport" type="STRING" xmlns:ns="http://org.apache.synapse/xsd"/>
            <property name="FORCE_POST_PUT_NOBODY" scope="axis2" type="BOOLEAN" value="true"/>
            <property name="DISABLE_CHUNKING" scope="axis2" type="STRING" value="true"/>
            <cache 
                collector="false" 
                hashGenerator="org.wso2.carbon.mediator.cache.digest.DOMHASHGenerator" 
                id="cognito-token" 
                scope="per-host" 
                timeout="3600">
                <onCacheHit>
                    <log level="custom">
                        <property expression="/" name="[usage-service-api]:: CHACHE HIT"/>
                    </log>
                    <respond/>
                </onCacheHit>
                <implementation maxSize="50" type="memory"/>
            </cache>
            <call>
                <endpoint>
                    <http method="post" uri-template="https://xxxxxxxxxxx.amazoncognito.com/oauth2/token?grant_type=client_credentials"/>
                </endpoint>
            </call>
            <property name="RESPONSE" scope="default" type="STRING" value="true"/>
            <cache collector="true" id="cognito-token" scope="per-host"/>
            <respond/>
        </inSequence>
        <outSequence/>
        <faultSequence/>
    </resource>
</api>

Для первого пропуска кеша вызовов в этом случае произойдет вызов конечной точки и ее сохранение в кеше для второго вызова и далее, пока не истечет время для того же самого вызова, то он попадет в кэш, т.е. попадание в кеш , тогда он будет отвечать от onCacheHit mediator

<onCacheHit>
    <respond/>
</onCacheHit>

и

Но после попадания в кеш он пропустит любое выполнение любого заявление написано после cache Посредник. Так что Так что держите это в какой-то другой последовательности, если вы пишете в какой-то последовательности Вы можете иметь более одного resources в API.

Если вы хотите знать, как вызвать этот API, то посмотрите, как это получает cognito acces_token с wso2 esb

<log level="custom">
    <property expression="/" name="[usage-service-api]:: CHACHE HIT"/>
</log>

Приведенный выше блок кода регистрирует содержимое кеша на CACHE HIT

...