OkHttp3 发送Digest Auth摘要认证

2024-04-18 18:44

本文主要是介绍OkHttp3 发送Digest Auth摘要认证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注意OkHttp3 自带的Digest Auth 认证存在循环请求:部分请求如下所示:

private static void digestAuth(ApiRequestVo apiRequestVo,Request.Builder requestBuilder,OkHttpClient.Builder okHttpClientBuilder){List<Map<String, Object>> authParams = apiRequestVo.getAuthParams();Map<String,String> map = new HashMap<>();for (Map<String, Object> authParam : authParams) {String value = String.valueOf(authParam.get(Params.VALUE)).trim();if (StringUtils.isNotEmpty(value)){map.put(String.valueOf(authParam.get(Params.NAME)).trim(),value);}}if (map.size() == 2){//这里需要来两次请求String username = map.get(Params.USERNAME);String password = map.get(Params.PASSWORD);okHttpClientBuilder.retryOnConnectionFailure(true).connectTimeout(15, TimeUnit.SECONDS).authenticator(new DigestAuthenticator(username,password)).followRedirects(false);}}

如果这么传入会出现 Too many follow-up requests: 21这个错误。根据Digest Auth自身请求规则,第一次是客户端传过来的认证key,第二次根据key继续请求。
详细数据如下:
第一次:
在这里插入图片描述

第二次:
在这里插入图片描述

那么根据两次发送原则我们进行分解,由我们自己操控:

    @Testpublic void digestAuth(){OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();Request.Builder requestBuilder = new Request.Builder();String URL = "http://127.0.0.1:8082/digestAuth/info";requestBuilder.url(URL);Request request = requestBuilder.build();OkHttpClient client = okHttpClientBuilder.build();ApiResult apiResult = null;try {Response response = client.newCall(request).execute();String header = response.header("WWW-Authenticate");System.out.println(response);DigestScheme mDigestScheme = new DigestScheme();UsernamePasswordCredentials mCredentials = new UsernamePasswordCredentials("admin", "admin");mDigestScheme.processChallenge(new BasicHeader("WWW-Authenticate", response.header("WWW-Authenticate")));org.apache.http.HttpRequest request111 = new BasicHttpRequest(response.request().method(),response.request().url().toString());String authHeader;authHeader = mDigestScheme.authenticate(mCredentials, request111).getValue();requestBuilder.header("Authorization",authHeader);Response response1 = client.newCall(requestBuilder.build()).execute();System.out.println(response1);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (MalformedChallengeException e) {throw new RuntimeException(e);} catch (AuthenticationException e) {throw new RuntimeException(e);}}

自己根据第一次请求里response里的WWW-Authenticate,反写回第二次请求的Request header中,那么就可以规避循环发送问题。

这篇关于OkHttp3 发送Digest Auth摘要认证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/915572

相关文章

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

一文详解kafka开启kerberos认证的完整步骤

《一文详解kafka开启kerberos认证的完整步骤》这篇文章主要为大家详细介绍了kafka开启kerberos认证的完整步骤,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、kerberos安装部署二、准备机器三、Kerberos Server 安装1、配置krb5.con

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win

使用Java发送邮件到QQ邮箱的完整指南

《使用Java发送邮件到QQ邮箱的完整指南》在现代软件开发中,邮件发送功能是一个常见的需求,无论是用户注册验证、密码重置,还是系统通知,邮件都是一种重要的通信方式,本文将详细介绍如何使用Java编写程... 目录引言1. 准备工作1.1 获取QQ邮箱的SMTP授权码1.2 添加JavaMail依赖2. 实现

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

java如何通过Kerberos认证方式连接hive

《java如何通过Kerberos认证方式连接hive》该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过... 目录Java实现Kerberos认证主要方法依赖示例续期连接hive遇到的问题分析解决方式扩展思考总

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Python手搓邮件发送客户端

《Python手搓邮件发送客户端》这篇文章主要为大家详细介绍了如何使用Python手搓邮件发送客户端,支持发送邮件,附件,定时发送以及个性化邮件正文,感兴趣的可以了解下... 目录1. 简介2.主要功能2.1.邮件发送功能2.2.个性签名功能2.3.定时发送功能2. 4.附件管理2.5.配置加载功能2.6.