【问题标题】:Unable to get http header无法获取 http 标头
【发布时间】:2014-11-19 05:33:44
【问题描述】:

您好,我从 APIM 获得了我的 api 的源视图,并对其进行了修改以获取 htttp 标头“授权”并将其记录到日志文件中,我在代码中添加了 2 个条目,一个用于非序列,一个用于外序列。在序列中,我添加了行

<property name="AuthHeader" expression="$trp:Authorization"/>

为了获取标题并将其分配给属性。在我添加的输出序列中

<log level="custom">
                    <property name="AuthHeader value" expression="get-property('AuthHeader')"/>
                </log>

确定 AuthHeader 属性是否会显示并获取标题,但是在日志文件中说

TID: [0] [AM] [2014-11-19 04:23:01,997]  INFO {org.apache.synapse.mediators.builtin.LogMediator} -  AuthHeader value = null {org.apache.synapse.mediators.builtin.LogMediator}
TID: [0] [AM] [2014-11-19 04:23:07,335]  INFO {org.apache.synapse.mediators.builtin.LogMediator} -  AuthHeader value = null {org.apache.synapse.mediators.builtin.LogMediator}
TID: [0] [AM] [2014-11-19 04:56:17,177]  INFO {org.apache.synapse.mediators.builtin.LogMediator} -  AuthHeader value = null {org.apache.synapse.mediators.builtin.LogMediator}

这意味着我没有得到正确的 http 标头值,代码有问题吗?请帮忙,完整的API代码如下。

谢谢, 画了

<api name="admin--fte" context="/fte">
        <resource methods="POST GET DELETE OPTIONS PUT" url-mapping="/*">
            <inSequence>
                <property name="AuthHeader" expression="$trp:Authorization"/>
                <property name="isDefault" expression="get-property('transport', 'WSO2_AM_API_DEFAULT_VERSION')"/>
                <filter source="get-property('isDefault')" regex="true">
                    <then>
                        <log level="custom">
                            <property name="STATUS" value="Faulty invoking through default API.Dropping message to avoid recursion.."/>
                        </log>
                        <payloadFactory media-type="xml">
                            <format>
                                <am:fault xmlns:am="http://wso2.org/apimanager">
                                    <am:code>500</am:code>
                                    <am:type>Status report</am:type>
                                    <am:message>Internal Server Error</am:message>
                                    <am:description>Faulty invoking through default API</am:description>
                                </am:fault>
                            </format>
                            <args/>
                        </payloadFactory>
                        <property name="HTTP_SC" value="500" scope="axis2"/>
                        <property name="RESPONSE" value="true"/>
                        <header name="To" action="remove"/>
                        <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
                        <property name="ContentType" scope="axis2" action="remove"/>
                        <property name="Authorization" scope="transport" action="remove"/>
                        <property name="Host" scope="transport" action="remove"/>
                        <property name="Accept" scope="transport" action="remove"/>
                        <send/>
                    </then>
                    <else>
                        <header name="WSO2_AM_API_DEFAULT_VERSION" scope="transport" value="true"/>
                        <property name="uri.var.portnum" expression="get-property('http.nio.port')"/>
                        <send>
                            <endpoint>
                                <http uri-template="http://localhost:{uri.var.portnum}/fte/1.0">
                                    <timeout>
                                        <duration>30000</duration>
                                        <responseAction>fault</responseAction>
                                    </timeout>
                                    <suspendOnFailure>
                                        <errorCodes>-1</errorCodes>
                                        <initialDuration>0</initialDuration>
                                        <progressionFactor>1.0</progressionFactor>
                                        <maximumDuration>0</maximumDuration>
                                    </suspendOnFailure>
                                    <markForSuspension>
                                        <errorCodes>-1</errorCodes>
                                    </markForSuspension>
                                </http>
                            </endpoint>
                        </send>
                    </else>
                </filter>
            </inSequence>
            <outSequence>
                <property name="messageType" value="application/json" scope="axis2" type="STRING"/>
                <log level="custom">
                    <property name="AuthHeader value" expression="get-property('AuthHeader')"/>
                </log>
                <send/>
            </outSequence>
        </resource>
        <handlers>
            <handler class="org.wso2.carbon.apimgt.gateway.handlers.common.SynapsePropertiesHandler"/>
        </handlers>
    </api>

【问题讨论】:

  • 在调用 API 时,您确定要发送 Authorization 标头吗?请在分配 AuthHeader 属性后立即添加日志并检查。
  • 是的,我用来发送标头的命令是这个 `curl -v \ -H "Authorization: Bearer a533cffb7d57895e377d4ab43bbe0c3" \ -X GET ` 所以授权标头存在?它是否正确? (对不起这个东西的初学者)在 AuthHeader 属性中分配它后将记录它。谢谢

标签: http wso2 wso2carbon wso2-am


【解决方案1】:

默认情况下,Authorization 标头会被 Authentication 处理程序删除。这就是为什么您似乎无法访问或记录它的原因。处理程序在中介 inSequence 之前采取行动。

可以通过编辑 /repository/conf 中的 api-manager.xml 配置文件来保留 Authentication 标头。只需取消注释以下节点并将值更改为 false:

<RemoveOAuthHeadersFromOutMessage>false</RemoveOAuthHeadersFromOutMessage>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-10
    • 2016-12-23
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2012-10-25
    相关资源
    最近更新 更多