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

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Android中如何实现adb向应用发送特定指令并接收返回

1 ADB发送命令给应用 1.1 发送自定义广播给系统或应用 adb shell am broadcast 是 Android Debug Bridge (ADB) 中用于向 Android 系统发送广播的命令。通过这个命令,开发者可以发送自定义广播给系统或应用,触发应用中的广播接收器(BroadcastReceiver)。广播机制是 Android 的一种组件通信方式,应用可以监听广播来执行

【Shiro】Shiro 的学习教程(二)之认证、授权源码分析

目录 1、背景2、相关类图3、解析3.1、加载、解析阶段3.2、认证阶段3.3、授权阶段 1、背景 继上节代码,通过 debug 进行 shiro 源码分析。 2、相关类图 debug 之前,先了解下一些类的结构图: ①:SecurityManager:安全管理器 DefaultSecurityManager: RememberMeManager:实现【记住我】功能

OpenStack离线Train版安装系列—3控制节点-Keystone认证服务组件

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack Victoria版——3.控制节点-Keystone认证服务组件

3.控制节点-Keystone认证服务组件 更多步骤:OpenStack Victoria版安装部署系列教程 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版 离线安装部署系列教程(全) OpenStack Train版 离线安装部署系列教程(全) 欢迎留言沟通,共同进步。 文章目录 创建key

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示; 代码如下: Demo07.jrxml <?xml version="1.0" encoding="UTF-8"?><!-- Created with Jaspersoft Studio version 6.6.

node.js实现阿里云短信发送

效果图 实现 一、准备工作 1、官网直达网址: 阿里云 - 短信服务 2、按照首页提示依次完成相应资质认证和短信模板审核; 3、获取你的accessKeySecret和accessKeyId; 方法如下: 获取AccessKey-阿里云帮助中心 4、获取SignName(签名名称)和 TemplateCode(模板code); 二、代码实现 1、项目结构 【/c

springboot项目编写发送异常日志到企微工具包

1.创建基础Bean public final class ThreadFactory implements java.util.concurrent.ThreadFactory {private static final AtomicInteger poolNumber = new AtomicInteger(1);private final ThreadGroup group;priva