HTTP Digest接入方式鉴权认证流程

2023-05-16

HTTP Digest接入方式鉴权认证流程

一、摘要认证原理

  摘要认证与基础认证的工作原理很相似,用户先发出一个没有认证证书的请求,Web服务器回复一个带有WWW-Authenticate头的响应,指明访问所请求的资源需要证书。但是和基础认证发送以Base 64编码的用户名和密码不同,在摘要认证中服务器让客户选一个随机数(称作”nonce“),然后浏览器使用一个单向的加密函数生成一个消息摘要(message digest),该摘要是关于用户名、密码、给定的nonce值、HTTP方法,以及所请求的URL。

二、摘要认证流程

  客户端首次向服务器发送HTTP请求,服务器返回401(未授权)响应进行挑战。401消息的头里带有WWW-Authenticate消息头,其中包含挑战摘要的随机参数nonce。客户端收到401后,将用户名密码和挑战信息用MD5加密形成认证鉴权头,重新发送给服务器,服务器对认证鉴权头进行验证,如果认证成功则返回200 OK,并在响应的消息中返回下次认证的随机数nextnonce,客户端下次请求时,根据nextnonce生成鉴权头进行HTTP请求。
HTTP摘要认证流程图
服务器的401未授权挑战WWW-Authenticate消息头语法:

challenge =“Digest” digest-challenge
digest-challenge=1#( realm | [ domain ] | nonce |
[ opaque ] |[ stale ] | [ algorithm ] |
[ qop-options ] | [auth-param] )
domain =“domain" “=” <“> URI ( 1*SP URI ) <”>
URI =absoluteURI | abs_path
nonce =“nonce" “=” nonce-value
nonce-value =quoted-string
opaque =“opaque" “=” quoted-string
stale =“stale" “=” ( “true” | “false” )
algorithm =“algorithm" “=” ( “MD5” | “MD5-sess” |
token )
qop-options =“qop" “=” <“> 1#qop-value <”>
qop-value =“auth" | “auth-int” | token

参数说明:

  • realm:用户域。由服务端告知
  • qop:保护质量。auth:鉴权,不对消息体做完整性验证。auth-int:鉴权并需要对消息体做摘要,保证消息完整性。
  • nonce:摘要质询参数。401响应中唯一生成的字符串数据。采用十六进制数据。
  • opaque:会话标识。由服务器指定,客户端须在请求二中返回该数据。采用十六进制数据。

客户端的挑战响应消息Authorization头参数一下为String类型:

  • username:用户名。必填。
  • realm:用户域。由服务方告知
  • nonce:摘要质询参数。返回请求一响应中的参数nonce
  • uri:访问路径。请求的URI
  • qop:保护质量。auth:鉴权,不对消息体做完整性验证。auth-int:鉴权并需要对消息体做摘要,保证消息完整性。注册过程使用auth
  • nc:nonce计数参数。客户端请求的十六进制计数,以00000001开始,每次请求加1,目的是防止重放攻击。
  • cnonce:客户端nonce值。客户端用来鉴定服务器的摘要质询参数
  • response:响应值。对请求一中401响应的参数采用MD5算法做摘要计算的结果
  • opaque:会话标识。返回服务器原值

response参数的算法:

response=<“> < KD ( H(A1), unq(nonce-value) “:” nc-value “:”
unq(cnonce-value) “:” unq(qop-value) “:” H(A2) ) <”>
A1=unq(username-value) “:” unq(realm-value) “:” passwd
如果qop等于auth,A2=Method “:” digest-uri-value 如果qop等于auth-int,A2=Method
“:” digest-uri-value “:” H(entity-body) 其中: H(data)=MD5(data)。
KD(secret, data)=H(concat(secret, “:”, data))。 unq(X)代表去掉X前后的引号。
Method=GET或者POST。 entity-body代表HTTP请求的消息体。 passwd=key。

三、代码实现HTTP Digest接入方式鉴权认证

以下是初次接触摘要认证时的简要请求方法。
摘要认证过程也可用Springorg.springframework.web.client.RestTemplate实现,修改配置类中的RestTemplate生成方法。具体方法自行百度。

public static String sendPostRequest(String username,String password,String uri, String jsonParams){
        CloseableHttpClient httpClient = null;
        String result =null;
        String requestUrl=url+uri;
        try {
            CredentialsProvider credsProvider = new BasicCredentialsProvider();
            httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
            //第一次请求
            HttpPost post = new HttpPost(requestUrl);
            // 构造消息头
            post.addHeader("Content-type","application/json; charset=utf-8");
            post.setHeader("Accept", "application/json");
            HttpResponse firstResponse = httpClient.execute(post);
            org.apache.http.HttpEntity firstEntity = null;
            firstEntity = firstResponse.getEntity();
            result = EntityUtils.toString(firstEntity, "UTF-8");

            Map<String,String> map =new HashMap<String,String>();

            StringEntity stringEntity = new StringEntity(jsonParams);

            //解析头部
            Header[] h=firstResponse.getHeaders("WWW-Authenticate");
            StringBuffer auth=new StringBuffer(h[0].toString());
            String realm=auth.substring(auth.indexOf("realm=")+6,auth.indexOf("qop=")-1);
            String qop=auth.substring(auth.indexOf("qop=")+4,auth.indexOf("nonce=")-1);
            String nonce=auth.substring(auth.indexOf("nonce=")+6,auth.indexOf("opaque=")-1);
            String opaque=auth.substring(auth.indexOf("opaque=")+7);
            String cnonce="00000001";
            String nc="00000001";
            String algorithm="MD5";
            String responseString;
            String params1=username+":"+realm+":"+password;
            String params2="POST:"+uri;
            String params3= SecureUtil.md5(params1)+":"+nonce+":"+nc+":"+cnonce+":"+qop+":"+SecureUtil.md5(params2);
            responseString=SecureUtil.md5(params3);
            StringBuilder sb=new StringBuilder();
            String Authorization ="Digest username=" + username +",realm="+ realm +",nonce=" + nonce +",uri=" + uri +
                    ",response=" + responseString + ",cnonce=" +cnonce + ",qop=" +qop+ ",nc="+nc;

            //第二次请求
            // 构造消息头
            post.setHeader("Authorization",Authorization);
            post.setEntity(stringEntity);
            HttpResponse secondResponse = httpClient.execute(post);
            org.apache.http.HttpEntity secondEntity = null;
            secondEntity = secondResponse.getEntity();

            result = EntityUtils.toString(secondEntity, "UTF-8");
            httpClient.close();
        } catch (Exception e) {
            log.error(e.getMessage());
        } finally {
            if (httpClient != null) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    log.error(e.getMessage());
                }
            }
        }
        return result;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP Digest接入方式鉴权认证流程 的相关文章

随机推荐

  • 【论文阅读】Anchor3DLane: Learning to Regress 3D Anchors for Monocular 3D LaneDetection

    Anchor3DLane 针对单目的3D车道线检测去学习回归3D锚 摘要 xff1a 单目的3D车道线检测是一个非常具有挑战性的问题 xff0c 因为他缺少深度的信息 xff0c 3D车道线检测一个非常流行的方法是将前视图转换成鸟瞰图 xf
  • 【深度学习】训练模型结果同时显示,模型结果对比

    码字不易 xff0c 如果各位看官感觉该文章对你有所帮助 xff0c 麻烦点个关注 xff0c 如果有任何问题 xff0c 请留言交流 如需转载 xff0c 请注明出处 xff0c 谢谢 文章链接 xff1a 深度学习 训练模型结果同时显示
  • 【问题与方法】如何使用vscode配置远程git仓库

    码字不易 xff0c 如果各位看官感觉该文章对你有所帮助 xff0c 麻烦点个关注 xff0c 如果有任何问题 xff0c 请留言交流 如需转载 xff0c 请注明出处 xff0c 谢谢 配置git xff0c 看我这一篇其实就够了 问题与
  • 【车道线算法】GANet-车道线检测环境配置一文通关

    目录 GANet配置全纪录 下载代码 conda环境部署 安装torch和cudatoolkit 安装其他包 编译 总结 GANet配置全纪录 下载代码 GitHub Wolfwjs GANet A Keypoint based Globa
  • 【雷达】如何将三维点云映射到二维平面

    最近在做基于雷达点云的交通标识牌识别时 xff0c 需要按照HAD格式进行输出 xff0c 由于交通标识牌不一定会与坐标轴垂直 xff0c 那么如何找到矩形标识牌的四个顶点 xff0c 是待解决的问题 由于标识牌一定是平面的 xff0c 三
  • ceres 拟合曲线

    假设有一条满足以下方程的曲线 xff1a 其中a b c为曲线的参数 xff0c w为高斯噪声 这是一个非线性模型 假设我们有N个关于x y的观测数据点 xff0c 想根据这些数据点求出曲线的参数 那么 xff0c 可以求解下面的最小二乘问
  • 独家!了不起的UP系列产品,不一样的开发板—UP Board(一)

    AAEON自2016年推出第一代UP board问世以来 xff0c 其信用卡大小的苗条小身材 xff08 世界首创Intel平台信用卡大小开发板 xff09 xff0c 配备上Intel Atom x5 z8350 处理器 xff0c 兼
  • 追求技术之路 - 那些陪伴我的书籍

    如今已经在广州一家嵌入式公司实习 xff0c 分享大学里度过的一些书籍 xff0c 有些还没读完 xff0c 个人比较喜欢经典书籍 xff0c 研读起来就有种奇妙的感觉 xff0c 比起人与人之间的复杂的关系 xff0c 书籍带给我的感觉很
  • 编程之美 -- 中国象棋将帅问题

    下过中国象棋的朋友都知道 xff0c 双方的 将 和 帅 相隔遥远 xff0c 并且它们不能照面 在象棋残局中 xff0c 许多高手能利用这一规则走出精妙的杀招 假设棋盘上只有 将 和 帅 二子 xff08 为了下面叙述方便 xff0c 我
  • C++单元测试工具 -- CppUnit

    CppUnit 作为C 43 43 语言的一款测试工具 xff0c 其实也是一个开源项目 xff0c 与JUnit一样 xff0c 用来方便开发人员进行单元测试的工具 项目地址 xff1a http sourceforge net apps
  • 拒绝游戏!发愤图强!

    立帖为证 xff01 xff01 xff01
  • C++ STL — 第6章 STL容器(二)deque

    C 43 43 STL容器deque和vector很类似 xff0c 也是采用动态数组来管理元素 使用deque之前需包含头文件 xff1a include lt deque gt 它是定义在命名空间std内的一个class templat
  • C++ STL — 第6章 STL容器(三)list

    一 list基础 List使用一个双向链表来管理元素 图一显示了list的结构 图一 list的结构 任何型别只要具备赋值和可拷贝两种性质 xff0c 就可以作为list的元素 二 list的功能 list的内部结构和vector和dequ
  • STL list remove和sort函数

    include lt iostream gt include lt list gt include lt iterator gt using namespace std bool cmp int a int b return a gt b
  • 排序 -- 简单选择排序

    选择排序 思想 xff1a 每一趟 n i 43 1 xff08 i 61 1 2 3 n 1 xff09 个记录中选择关键字最小的记录作为有序序列的第i个记录 简单选择排序 xff1a 通过n i次关键字间的比较 xff0c 从n i 4
  • HDOJ 1106 排序

    题目地址 xff1a http acm hdu edu cn showproblem php pid 61 1106 Problem xff1a 输入一行数字 xff0c 如果我们把这行数字中的 5 都看成空格 xff0c 那么就得到一行用
  • Jetson Xavier、Jetson TX2、 1080(Ti)、2080显卡运行深度学习模型性能对比(英伟达开发平台VS常用显卡)

    前言 xff1a 英伟达的Jetson TX2使得很多人认为深度学习模型终于可以像嵌入式开发平台那样做到小型化了 xff0c 不用再跑在高配计算机或者服务器上面了 xff0c 但是实际上Jetson TX2开发板的性能和深度学习常用到的10
  • 独家!了不起的UP系列产品,不一样的开发板 — UP Squared Board(二)

    UP 系列家族的成员 xff0c 经过团队经年累月的精心研发 xff0c 产品已不断丰富起来 先后开发出了第二代产品UP Squared 与第一代产品UP Board相比 xff0c 拥有 高性能低功耗的 UP Squared 似乎更令人兴
  • STM32连接--OneNET,阿里云(MQTT协议)详细教程

    x1f495 对于物联网工程 xff0c 不可或缺的必然是连接上云 xff0c 今天本人总结了上云经验 xff0c 希望对大家起到帮助哦 有用的话记得点赞收藏哦 关于如何连接OneNET OneNET https open iot 1008
  • HTTP Digest接入方式鉴权认证流程

    HTTP Digest接入方式鉴权认证流程 一 摘要认证原理 摘要认证与基础认证的工作原理很相似 xff0c 用户先发出一个没有认证证书的请求 xff0c Web服务器回复一个带有WWW Authenticate头的响应 xff0c 指明访