Я работаю над тем, чтобы поместить API в WSO2 API Manager, установленный локально. Я разработал API, добавил конечную точку и добавил первую последовательность посредничества, которая добавляет заголовок авторизации во время выполнения. И это работает нормально.

Теперь я улучшаю эту последовательность посредничества в другом, чтобы получить токен, если он не существует, и обновить его по истечении срока его действия. Полученный токен сохраняется в реестре. Для этого я использую https://medium.com /@athiththan11/wso2-api-manager-oauth2-protected-endpoint-aa51c62f0ad7 и https://medium.com/@menakajayawardena/wso2-how-to-using-oauth2-protected-back-ends-with-api- сообщения manager-5d7e234c61c в качестве ссылки.

Моя последовательность следующая:

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="bapi_in_dev" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <property description="Retrieve stored token data" expression="get-property('registry','gov:/bapi/token_data')" name="stored_token_data" scope="default" type="STRING"/>
    <property description="Retrieve the time token_data was generated" expression="get-property('registry', 'gov:/bapi/token_generation_time')" name="token_generation_time" scope="default" type="STRING"/>
    <filter description="Renouveller le token tmoney si il est vieux de plus d'une heure" xpath="fn:number(get-property('SYSTEM_TIME')) - fn:number(get-property('token_generation_time')) > fn:number(360000)">
        <then>
            <property description="Sauvegarde du body de la requete" expression="json-eval($)" name="client_request_body" scope="default" type="STRING"/>
            <property description="Sauvegarde de la resource demandée" expression="get-property('axis2', 'REST_URL_POSTFIX')" name="client_request_resource" scope="default" type="STRING"/>
            <payloadFactory description="Body de la requete d'obtention de token" media-type="json">
                <format>{
    "nomUtilisateur": "username",
    "motDePasse": "password"
}</format>
                <args/>
            </payloadFactory>
            <header description="Header requis par bapi" name="Content-Type" scope="transport" value="application/json"/>
            <property description="Suppression  initialisation de la resource avant demande de token" name="REST_URL_POSTFIX" scope="axis2" type="STRING" value=""/>
            <call blocking="true" description="Demande de token">
                <endpoint>
                    <http method="post" statistics="enable" trace="enable" uri-template="https://bapi.domain.tld/login">
                        <suspendOnFailure>
                            <initialDuration>-1</initialDuration>
                            <progressionFactor>-1</progressionFactor>
                            <maximumDuration>0</maximumDuration>
                        </suspendOnFailure>
                        <markForSuspension>
                            <retriesBeforeSuspension>0</retriesBeforeSuspension>
                        </markForSuspension>
                    </http>
                </endpoint>
            </call>
            <property description="Extraction du token" expression="json-eval($.data.token)" name="tm_resp_data" scope="default" type="STRING"/>
            <property description="Enregistrement du token" expression="get-property('tm_resp_data')" name="gov:/bapi/token_data" scope="registry" type="STRING"/>
            <property description="Enregistrement heure a laquelle code a ete genere" expression="get-property('SYSTEM_TIME')" name="gov:/bapi/token_generation_time" scope="registry" type="LONG"/>
            <property description="Configuration de la resource pour effectuer la requete de l'user" expression="get-property('client_request_resource')" name="REST_URL_POSTFIX" scope="axis2" type="STRING"/>
            <header description="Ajout du token dans le header" expression="get-property('tm_resp_data')" name="Authorization" scope="transport"/>
            <payloadFactory description="Reconstruction du body de requete user" media-type="json">
                <format>$1</format>
                <args>
                    <arg evaluator="xml" expression="get-property('client_request_body')"/>
                </args>
            </payloadFactory>
        </then>
        <else>
            <header description="Ajout de Authorization header sauvegardé" expression="get-property('stored_token_data')" name="Authorization" scope="transport"/>
        </else>
    </filter>
</sequence>

Я добавляю это посредничество в поток API. Но когда я запрашиваю его, он не вводит часть then последовательности, а затем не обновляет токен.

Можете ли вы помочь мне понять, почему filter работает таким образом, и что я должен сделать, чтобы исправить это?

Заранее спасибо.

0
Atsou Jason 7 Окт 2020 в 13:59

1 ответ

Последовательность посредничества, как описано, работала. Меня вводит в заблуждение то, что часть процесса посредничества вызовов не отображалась в журнале (у меня настроен провод для отладки), как это было до того, как я добавил фильтр.

Я также обнаружил, что когда я устанавливаю тип token_generation_time в LONG, операция fn:number(get-property('SYSTEM_TIME')) - fn:number(get-property('token_generation_time')) приводит к NaN, которую я не понимаю.

<log level="custom">
        <property expression="fn:number(get-property('SYSTEM_TIME')) - fn:number(get-property('token_generation_time'))" name="FilterV"/>
    </log>

В журнале:

[2020-10-07 15:57:09,539]  INFO - LogMediator FilterV = NaN

Моя проблема решена. Спасибо всем, кто прочитал этот пост за его желание помочь мне.

Но мне все еще интересно, почему результат NaN выше. Я также хотел бы получить от вас несколько советов по улучшению последовательности. Спасибо

0
Atsou Jason 7 Окт 2020 в 19:08