WSO2 API 관리자 "필터" 조정이 입력되어야 하는 대로 입력되지 않습니다.

WSO2 API 관리자 "필터" 조정이 입력되어야 하는 대로 입력되지 않습니다.

로컬로 설치된 WSO2 API 관리자 뒤에 API를 배치하는 작업 중입니다. 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왜 이런 일이 발생하는지 알려 주실 수 있나요 ? 이를 수정하려면 어떤 조치를 취해야 합니까?

미리 감사드립니다.

답변1

설명된 중간 시퀀스가 ​​작동 중입니다. 제가 오해하는 점은 필터를 추가하기 전처럼 프로세스의 통화 조정 부분이 로그에 표시되지 않는다는 것입니다(디버그할 라인을 설정했습니다).

또한 연산 결과 token_generation_time에 대한 유형을 설정했을 때 이해가 되지 않았다는 사실도 발견했습니다 .LONGfn: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 결과가 왜 나오는지에 대해서는 여전히 관심이 있습니다. 또한 시퀀스를 개선하기 위한 몇 가지 제안을 듣고 싶습니다. 감사해요

관련 정보