如何在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
相关产品推荐
相关产品推荐

