Spring Cloud Gateway路由到Amazon S3签名失败处理

Spring Cloud Gateway路由到Amazon S3签名失败处理

背景

最近在预研统一存储网关,想到就是使用Spring Cloud Gateway作为网关的入口,再反向代理到S3对象存储服务器。

软件版本

网关:Spring Cloud Gateway 3.1.2

s3对象存储:minio

aws java sdk:1.12.429

问题现象

Spring Cloud Gateway的路由配置规则如下:

spring:cloud:gateway:routes:- id: s3-routeuri: s3-endpiontpredicates:- Path=/s3/**filters:- StripPrefix=1- PreserveHostHeader

我添加了两个过滤器,一个是StripPrefix这个过滤器,它有一个parts参数,它的作用是重新设置路由后的路径,比如我的请求是 gateway-host/s3/,parts参数设置为1的话,路由之后的路径会变成s3-endpiont,它会截取掉请求路径中的前缀,这个可以保证我们能够路由到准确的s3-endpoint地址。

还有一个过滤器是PreserveHostHeader,这个过滤器的作用是保留请求的Host头,如果不设置的话,请求经过网关路由之后Host头会变成uri对应的地址,这个也会导致S3签名校验失败,这边可以参考nginx转发到Amazon S3的配置,参考地址:https://stackoverflow.com/questions/53833505/nginx-confg-issue-couldnt-connect-to-s3-compatible-storage-from-nodejs-test-p

sdk调用如下,获取所有桶的接口:

public static void main(String[] args) {ClientConfiguration config = new ClientConfiguration().withProtocol(Protocol.HTTP);config.setSignerOverride("S3SignerType");AmazonS3 amazonS3 = AmazonS3ClientBuilder.standard().withClientConfiguration(config).withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("minioadmin", "minioadmin"))).withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://10.1.140.3:8777/s3", null)).build();final List<Bucket> buckets = amazonS3.listBuckets();System.out.println(buckets);
}

在客户端调用请求时,会抛出异常,然后带着问题去搜索了一下解决方案。
在这里插入图片描述

原因以及解决方案

先Google了一下,没有找到合适的解决方案,StackOverFlow上面有类似的问题,参考:https://stackoverflow.com/questions/75834957/spring-cloud-gateway-to-s3-signaturedoesnotmatch/76097374,但是没有人回答(下面那个答案是我后来加上的~)。

然后把问题现象和ChatGPT描述了一下,得到了一些答案:
在这里插入图片描述
想到可以是StripPrefix过滤器修改了’Host’请求头,所以将StripPrefix过滤器去掉,最后配置如下:

spring:cloud:gateway:routes:- id: s3-routeuri: s3-endpiontpredicates:- Path=/**filters:- PreserveHostHeader

sdk调用:

public static void main(String[] args) {ClientConfiguration config = new ClientConfiguration().withProtocol(Protocol.HTTP);config.setSignerOverride("S3SignerType");AmazonS3 amazonS3 = AmazonS3ClientBuilder.standard().withClientConfiguration(config).withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("minioadmin", "minioadmin"))).withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://10.1.140.3:8777", null)).build();final List<Bucket> buckets = amazonS3.listBuckets();System.out.println(buckets);
}

果然这次调用成功了:
在这里插入图片描述
但是按照上面的解决方案,不能够自定义访问的路径,其实还没有完全解决我的问题,再问一次ChatGPT:
在这里插入图片描述
回答中提到用自定义过滤器使用正确的’Host’头重新生成一份签名,我参考了GPT的回答还有查询了一些资料,写了生成签名的过滤器,代码参考如下(这边使用的签名算法是V2版本的,不同的版本应该需要不同的适配):

/*** 重新生成S3签名过滤器** @author yuanzhihao* @since 2023/5/5*/
@Component
@Slf4j
public class AWSSignGatewayFilterFactory extends AbstractGatewayFilterFactory<AWSSignGatewayFilterFactory.Config> {public AWSSignGatewayFilterFactory() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {DefaultRequest<Void> defaultRequest = regenerateAuthorization(config, exchange);ServerHttpRequest request = exchange.getRequest().mutate().headers(httpHeaders -> {httpHeaders.set("Authorization", defaultRequest.getHeaders().get("Authorization"));httpHeaders.set(Headers.DATE, defaultRequest.getHeaders().get(Headers.DATE));}).build();return chain.filter(exchange.mutate().request(request).build());};}// 重新计算并设置签名private DefaultRequest<Void> regenerateAuthorization(Config config, ServerWebExchange exchange) {AWSCredentials credentials = new BasicAWSCredentials(config.getAk(), config.getSk());DefaultRequest<Void> request = new DefaultRequest<>("Amazon S3");request.addHeader("Host", config.getEndpoint());// 这边把请求头全部带下去exchange.getRequest().getQueryParams().forEach((key, value) -> request.addParameter(key, value.get(0)));exchange.getRequest().getHeaders().forEach((key, value) -> request.addHeader(key, value.get(0)));String path = exchange.getRequest().getURI().getPath();String method = Objects.requireNonNull(exchange.getRequest().getMethod(), "Method is null").toString();request.setResourcePath(path);try {request.setEndpoint(new URI(config.getEndpoint()));} catch (URISyntaxException e) {log.error("URI error", e);throw new RuntimeException(e);}S3Signer signer = new S3Signer(method, path);signer.sign(request, credentials);return request;}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("endpoint", "ak", "sk");}@Data@AllArgsConstructor@NoArgsConstructorpublic static class Config {private String endpoint;private String ak;private String sk;}
}

配置文件中生效过滤器:

s3:endpoint: http://10.1.140.3:9000ak: minioadminsk: minioadminspring:cloud:gateway:routes:- id: s3-routeuri: ${s3.endpoint}predicates:- Path=/**filters:- PreserveHostHeader- StripPrefix=1- AWSSign=${s3.endpoint},${s3.ak},${s3.sk}

调用成功:
在这里插入图片描述
基于上面的验证,后续其实就可以实现标准的S3协议,同时也可以很方便的对S3进行扩展,比如限流限速,对S3用户权限进行扩展等等能力。

结语

ChatGPT真的很厉害,它确实可以帮助我们解决很多问题。

代码地址:https://github.com/yzh19961031/blogDemo/tree/master/s3-gateway

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5905.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于java(springboot)和go-cqhttp实现QQ机器人

目录 yh-qqrobot机器人简介go-cqhttp搭建1.下载应用2.生成bat文件3. 初始化项目4. 配置5. 运行项目 yh-qqrobot搭建搭建后端1. 导入sql文件2. 配置文件3. 导入到idea 搭建前端 yh-qqrobot机器人简介 yh-qqrobot是一个基于若依框和go-cqhttp集成的系统&#xff0c;一开始我只是揣…

【基于Flink的城市交通实时监控平台】需求一:卡口车辆超速情况检测

案例需求&#xff1a; 从kafka的topic-car中读取卡口数据&#xff0c;将超速车辆写入mysql的select * from t_speeding_info表&#xff0c;当通过卡口的车速超过60就认定为超速 卡口数据格式&#xff1a; action_time long --摄像头拍摄时间戳&#xff0c;精确到秒, monitor…

chatgpt赋能python:Python下载工具:提高工作效率的不二之选

Python下载工具&#xff1a;提高工作效率的不二之选 作为一名有10年Python编程经验的工程师&#xff0c;我深知一款好用的下载工具对于我们的工作效率有多么重要。因此&#xff0c;在众多Python工具中&#xff0c;我多次选用了一些好用的下载工具&#xff0c;并且对它们进行了…

将 ChatGLM2-6B 部署成 OpenAI API 服务

将 ChatGLM2-6B 部署成 OpenAI API 服务 0. 背景1. FastChat 部署使用 ChatGLM2-6B1-1. 创建虚拟环境1-2. 克隆代码1-3. 安装依赖库1-4. 使用 UI 进行推理1-5. 使用 OpenAI API 方式进行推理 0. 背景 最近一直在使用 OpenAI 的 API 做一些学习和调研。使用 OpenAI 的 API&…

chatgpt赋能Python-python_downloader

优秀Python下载器的重要性 在今天的数字化世界中&#xff0c;下载器是一个极其重要的工具。随着互联网速度的不断提升和存储设备的容量的增加&#xff0c;大量的数据和文件需要及时下载到本地计算机或存储设备中。许多编程语言都提供了相应的下载库&#xff0c;但Python是其中…

免费使用GPT-4的N种方法

很多朋友因为各种限制无法开通#ChatGPT Plus,而申请OpenAI的GPT-4 API也要慢慢排队(我的也还没下来)。于是在这里我搜集了X个可以免费使用的方法。 注:哪有什么真正免费,只不过有人在替你付钱。因此下述的方法都有限制,也有些可能会很快失效。新方法随时更新。 方法一: …

ChatGPT 拓展资料:ChatGPT插件系统上线 卷众生入局,燃天地斗气!

ChatGPT 拓展资料:ChatGPT插件系统上线 卷众生入局,燃天地斗气! ChatGPT 插件 我们已经在 ChatGPT 中实现了对插件的初步支持。插件是专门为以安全为核心原则的语言模型设计的工具,可帮助 ChatGPT 访问最新信息、运行计算或使用第三方服务。 根据我们的迭代部署理念,我们…

ChatGPT开始联网,最后的封印解除了

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年2月份热门报告合集 最新亲测国内可用ChatGPT使用教程&#xff08;3分钟搞定&#xff09; 文心一言、GPT3.5及GPT4应用测评对比报告 ChatGPT团队背景研究报告 ChatGPT的…

chatgpt最大的竞争对手-claude

介绍 Claude是Anthropic公司开发的AI聊天机器人&#xff0c;与ChatGPT类似&#xff0c;由OpenAI前副总裁创办。和虽然比不上GPT4&#xff0c;但在连续对话能力、写小说、编写代码、解释概念等方面表现出色。 Claude是Anthropic公司开发的大语言模型(LLM)&#xff0c;主要特点…

巧用 ChatGPT,让开发者的学习和工作更轻松

引言 随着人工智能技术的快速发展和广泛应用&#xff0c;ChatGPT 作为一种新兴的自然语言处理模型&#xff0c;近期备受瞩目&#xff0c;引发了广泛讨论。 ChatGPT 具有多种应用场景&#xff0c;既可以用作聊天机器人&#xff0c;实现智能问答和自然语言交互&#xff0c;也可…

【promptulate专栏】使用ChatGPT和XMind快速构建思维导图

本文节选自笔者博客&#xff1a;https://www.blog.zeeland.cn/archives/ao302950h3j &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;全栈领域优质创作者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 我的博客&#…

ChatGPT常用的指令(prompts)系列十——职业顾问、私人教练、心理健康顾问

系列文章目录 内容翻译自&#xff1a;https://github.com/f/awesome-chatgpt-prompts&#xff0c;并加入自己的实践内容 1、 ChatGPT常用的提示语&#xff08;prompts&#xff09;系列一 2、 ChatGPT常用的提示语&#xff08;prompts&#xff09;系列二 3、 ChatGPT常用的提示语…

ChatGPT为什么能够火出圈

最近ChatGPT可以说是火遍了全世界&#xff0c;作为由知名人工智能研究机构OpenAI于2022年11月30日发布的一个大型语言预训练模型&#xff0c;他的核心在于能够理解人类的自然语言&#xff0c;并使用贴近人类语言风格的方式来进行回复。模型开放使用以来&#xff0c;在人工智能领…

ChatGPT为什么会一本正经胡说八道?我们如何改进它?| 文内附有代码

ChatGPT为什么会一本正经胡说八道&#xff1f;我们如何改进它&#xff1f;| 文内附有代码 众所周知&#xff0c;在OpenAI平台上的ChatGPT模型目前有两大痛点&#xff1a;1. 它所学习的数据资料都是截止到2021年为止的&#xff0c;因此无法给出2022年之后的发生的事情。2. 有些时…

干货!150个chatgpt指令大全!chatGPT输出结果的质量高低,和你使用什么样质量的输入内容有关。

干货&#xff01;150个chatgpt指令大全 chatGPT输出结果的质量高低&#xff0c;和你使用什么样质量的输入内容有关。 在外网有大佬们已经整理出一些标准的问话模板&#xff0c;直接拿来使用后&#xff0c;效果极佳&#xff01; 把已经过验证的优质问法可以直接拿来用&#xf…

我用 ChatGPT 干的 18 件事!

&#x1f447;&#x1f447;关注后回复 “进群” &#xff0c;拉你进程序员交流群&#x1f447;&#x1f447; 来自&#xff1a;CSDN&#xff0c;作者&#xff1a;ㄣ知冷煖★ 原文链接&#xff1a; https://blog.csdn.net/weixin_42475060/article/details/129399125 版权声明…

[Golang实战]如何快速接入chatgpt/openai?[引入go-gpt3][新手开箱可用]

如何快速接入chatgpt?[引入go-gpt3] 上文介绍了如何在网页使用chatgpt?V1.介绍下在golang中使用chatgpt?1.查看官网推荐的chatgpt项目2.访问go-gpt33.使用并运行在自己的项目中...(是因为例子很难理解,所以一一对应了属性做了配置)3.1安装项目3.2换上自己的代码3.3换上自己的…

用ChatGPT操控机器人,微软开启居家机器人新纪元!

编&#xff5c;LRS 源&#xff5c;新智元 ChatGPT不止会动嘴&#xff0c;还能帮你操控无人机&#xff01; 虽然ChatGPT已经被调教为符合人类的偏好&#xff0c;但在各种反向操作下&#xff0c;还是能够逼问出一些「不道德的内容」&#xff0c;比如ChatGPT可以给你列一份详细的…

ChatGPT:微软人工智能Office和电邮即将登场...

PS&#xff1a;欢迎大家关注我的Twitter&#xff1a;Alphatu4 &#xff08;深夜写稿不易&#xff0c;会有很多独家内容&#xff09; 欢迎点击在看、转发~谢谢大家&#xff01;&#x1f407; *转载请扫码添加后台微信二维码&#xff0c;转载请注明来源&#xff0c;且附上本文的…

联网、多模态版ChatGPT?微软BingChat评测,New Bing竟然是个大美女?

微软开放了New Bing&#xff0c;大家都可以注册使用了&#xff0c;详细见我的文章 北方的郎&#xff1a;微软放大招&#xff0c;所有人都能用New Bing了 今天把它的功能简单评测一下&#xff0c;首先如果想要体验多模态&#xff0c;要选择更有创造力选项。 首先让它画一张小猫…