使用Rest-assured携带Azure SAS令牌请求始终返回403错误如何解决
根因分析
RestAssured默认开启URL自动编码逻辑,你传入的完整URL中已经包含了URL编码后的SAS参数(比如%2B对应加号、%3D对应等号),RestAssured会对这些已经编码的字符做二次转义,将%转义为%25,最终传递到Azure的签名参数和生成的SAS不一致,因此返回403签名错误。Chrome和Postman默认不会对已符合URL规范的参数二次编码,所以可以正常访问。
解决方案
方案1:关闭RestAssured自动URL编码
在请求前添加urlEncodingEnabled(false)配置即可,代码示例:
given() .urlEncodingEnabled(false) .get("https://myaccount.blob.core.windows.net/mycontainer/0.0.1/uk/787867898767/structure/calendar/a12calendar.json?se=2023-01-01T00%3A00%3A00Z&sp=r&sv=2020-02-10&sr=b&sig=u2VWd2i8cdYhkjA%2BZRBCYZbHwmZDCrjirs%2BYstwxmjI%3D") .then() .statusCode(200);
方案2:拆分参数交由RestAssured统一编码
先将SAS各参数解码为原始值,再通过queryParam逐个传递,RestAssured会自动完成编码,避免二次转义问题:
given() .queryParam("se", "2023-01-01T00:00:00Z") .queryParam("sp", "r") .queryParam("sv", "2020-02-10") .queryParam("sr", "b") .queryParam("sig", "u2VWd2i8cdYhkjA+ZRBCYZbHwmZDCrjirs+YstwxmjI=") .get("https://myaccount.blob.core.windows.net/mycontainer/0.0.1/uk/787867898767/structure/calendar/a12calendar.json") .then() .statusCode(200);
方案3:传入URI对象而非字符串URL
用java.net.URI构造完整访问地址后传入请求方法,RestAssured不会对URI对象做二次编码:
import java.net.URI; // 构造已编码的URI对象 URI blobUri = new URI("https://myaccount.blob.core.windows.net/mycontainer/0.0.1/uk/787867898767/structure/calendar/a12calendar.json?se=2023-01-01T00%3A00%3A00Z&sp=r&sv=2020-02-10&sr=b&sig=u2VWd2i8cdYhkjA%2BZRBCYZbHwmZDCrjirs%2BYstwxmjI%3D"); given() .get(blobUri) .then() .statusCode(200);
额外注意
你提供的测试代码中SAS的sig末尾多了一个额外的D字符(生成的SAS sig结尾是%3D,测试代码里是%3DD),复制SAS令牌时注意不要多拼接无关字符,否则也会导致签名校验失败。
内容的提问来源于stack exchange,提问作者Boon
相关产品推荐
相关产品推荐

