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实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、