场景
我有一个OSS带鉴权的URL,现在需要下载. 浏览网页没问题,RestTemplate下载权限错误
异常
Exception in thread "Thread-18" org.springframework.web.client.HttpClientErrorException$Forbidden: 403 Forbidden: "<?xml version="1.0" encoding="UTF-8"?><EOL><Error><EOL> <Code>SignatureDoesNotMatch</Code><EOL> <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><EOL> <RequestId>62A423B3921C493036899B48</RequestId><EOL> <HostId>sh-full-process-picture.oss-cn-shanghai.aliyuncs.com</HostId><EOL> <OSSAccessKeyId>LTAI4FttyQ1rqyLDXPs2dnLG</OSSAccessKeyId><EOL> <SignatureProvided>CXgmkBZLtEzd4T3irAnroHuudAE=</SignatureProvided><EOL> <StringToSign>GET<EOL><EOL><EOL>1654925591<EOL>/sh-full-process-picture/073ce05e53cb4659ae4f980918febb75_26_1654860227?x-oss-process=image/resize,m_fixed,h_180,w_320</StringToSign><EOL> <StringToSignBytes>47 45 54 0A 0A 0A 31 36 35 34 39 32 35 35 39 31 0A 2F 73 68 2D 66 75 6C 6C 2D 70 72 6F 63 65 73 73 2D 70 69 63 74 75 72 65 2F 30 37 33 63 65 30 35 65 35 33 63 62 34 36 35 39 61 65 34 66 39 38 30 39 31 38 66 65 62 62 37 35 5F 32 36 5F 31 36 35 34 38 36 30 32 32 37 3F 78 2D 6F 73 73 2D 70 72 6F 63 65 73 73 3D 69 6D 61 67 65 25 32 46 72 65 73 69 7A 65 25 32 43 6D 5F 66 69 78 65 64 25 32 43 68 5F 31 38 30 25 32 43 77 5F 33 32 30 </StringToSignBytes><EOL></Error><EOL>"
解决
// 错误写法:这种写法会处理路径(特殊字符替换等)。)内部,使鉴权出现问题 restTemplate.exchange(imgUrl, HttpMethod.GET, httpEntity, byte[].class); // 正确的写法,使用URI包装 restTemplate.exchange(URI.create(imgUrl), HttpMethod.GET, httpEntity, byte[].class);