You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure APIM中复用入站Token值并传递至出站响应

Azure APIM 配置策略返回客户端传入的Token值

要实现将客户端传入的Token参数返回至响应中,你需要先获取客户端传入的Token并存储为变量,再在响应阶段将该变量值添加到响应头或响应体中。以下是针对不同传参方式的具体配置方案:


前提说明

你当前的策略配置存在问题:@(token)是未定义的表达式,无法获取到客户端传入的Token值,需要先在inbound阶段完成Token的提取与存储。


方案1:Token通过Query参数传入(如?token=abc123)

<policies>
    <inbound>
        <base />
        <!-- 从Query参数中提取Token,存储到变量clientToken -->
        <set-variable name="clientToken" value="@(context.Request.Url.Query.GetValueOrDefault("token", ""))" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
        <!-- 方式A:将Token添加到响应头 -->
        <set-header name="X-Client-Token" exists-action="override">
            <value>@(context.Variables.GetValueOrDefault<string>("clientToken"))</value>
        </set-header>
        
        <!-- 方式B:如果需要修改响应体返回Token(以JSON响应为例) -->
        <!-- <set-body>@{
            var originalBody = context.Response.Body.As<string>();
            var responseObj = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(originalBody);
            responseObj.clientToken = context.Variables.GetValueOrDefault<string>("clientToken");
            return Newtonsoft.Json.JsonConvert.SerializeObject(responseObj);
        }</set-body> -->
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

方案2:Token通过请求头传入(如自定义头X-Token或标准Authorization头)

如果是自定义头X-Token:

<policies>
    <inbound>
        <base />
        <!-- 从请求头提取Token -->
        <set-variable name="clientToken" value="@(context.Request.Headers.GetValueOrDefault("X-Token", ""))" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
        <!-- 添加到响应头 -->
        <set-header name="X-Client-Token" exists-action="override">
            <value>@(context.Variables.GetValueOrDefault<string>("clientToken"))</value>
        </set-header>
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

如果是Authorization: Bearer xxx格式的头,需要提取Bearer后的内容:

<set-variable name="clientToken" value="@(context.Request.Headers.GetValueOrDefault("Authorization", "").Replace("Bearer ", ""))" />

方案3:Token通过请求体传入(如JSON格式{"token":"abc123"})

<policies>
    <inbound>
        <base />
        <!-- 读取请求体并提取Token -->
        <set-variable name="clientToken" value="@(
            {
                var body = context.Request.Body.As<string>();
                var requestObj = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(body);
                return requestObj?.token ?? "";
            }
        )" />
        <!-- 重置请求体,避免后端无法读取 -->
        <set-body>@(context.Request.Body.As<string>())</set-body>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
        <!-- 添加到响应头 -->
        <set-header name="X-Client-Token" exists-action="override">
            <value>@(context.Variables.GetValueOrDefault<string>("clientToken"))</value>
        </set-header>
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

关键说明

  • context.Request用于访问客户端的请求信息,根据Token的位置选择对应的属性(Url.Query、Headers、Body)
  • set-variable将提取到的Token存储到APIM变量中,供后续阶段调用
  • set-header或set-body用于将Token添加到响应的指定位置,根据业务需求选择即可

内容的提问来源于stack exchange,提问作者Sulaiman Sadoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:43:18