“浙里办”统一用户组件-接入 基于单点登录票据换取请求 token

news2024/11/30 0:27:19

基于单点登录票据换取请求 token

1. 请求地址

政务外网地址:
https://bcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220329000007/
uc/sso/access_token
互联网地址:
https://ibcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220329000007
/uc/sso/access_token

2. 入参

3. 出参

直接上代码
package com.central.utils;


import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import javafx.util.Pair;
import lombok.extern.slf4j.Slf4j;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URL;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;


@Slf4j
public class HmacAuthUtil {

    public static void main(String[] args) {
        String urlStr = "https://ibcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220329000007\n" +
                "/uc/sso/access_token";
        String requestMethod = "POST";
        String accessKey = "你的accessKey ";
        String secretKey = "你的secretKey ";

        Map<String, String> headers = generateHeader(urlStr, requestMethod, accessKey, secretKey);

        // 使用headers来发起HTTP请求
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("ticketId", "你的ticketId");
        parameters.put("appId", "你的appId");
        // 发起请求
        HttpResponse response = HttpRequest.post(urlStr)
                .headerMap(headers, true) // 设置请求头
                .body(JSON.toJSONString(parameters), "application/json") // 设置表单参数
                .execute();

        // 打印响应状态码
        System.out.println("Status Code: " + response.getStatus());
        String body = response.body();
        // 打印响应体
        System.out.println("Response Body: " + body);
        JSONObject jo = JSONObject.parseObject(body);
        JSONObject data = jo.getJSONObject("data");
        System.err.println("data:" + data);
    }


    /**
     * 构造请求 header * @param urlStr 请求 url,全路径格式,比如:
     * https://bcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220905000004/uc/auth/verify/sendMessage * @param requestMethod 请求方法,大写格式,如:GET, POST * @param accessKey 应用的 AK
     *
     * @param secretKey 应用的 SK
     * @return
     */
    public static Map<String, String> generateHeader(String urlStr, String requestMethod, String accessKey, String secretKey) {
        log.info("params,urlStr={},requestMethod={},accessKey={},secretKey={}", urlStr, requestMethod, accessKey, secretKey);
        Map<String, String> header = new HashMap<>();
        try {
            DateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
            dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
            String date = dateFormat.format(new Date());
            URL url = new URL(urlStr);
            URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), null);
            String canonicalQueryString = getCanonicalQueryString(uri.getQuery());
            String message = requestMethod.toUpperCase() + "\n" + uri.getPath() + "\n" +
                    canonicalQueryString + "\n" + accessKey + "\n" + date + "\n";
            Mac hasher = Mac.getInstance("HmacSHA256");
            hasher.init(new SecretKeySpec(secretKey.getBytes(), "HmacSHA256"));
            byte[] hash = hasher.doFinal(message.getBytes());
            // to lowercase hexits
            DatatypeConverter.printHexBinary(hash);
            // to base64
            String sign = DatatypeConverter.printBase64Binary(hash);
            header.put("X-BG-HMAC-SIGNATURE", sign);
            header.put("X-BG-HMAC-ALGORITHM", "hmac-sha256");
            header.put("X-BG-HMAC-ACCESS-KEY", accessKey);
            header.put("X-BG-DATE-TIME", date);
        } catch (Exception e) {
            log.error("generate error", e);
            throw new RuntimeException("generate header error");
        }
        log.info("header info,{}", header);
        return header;
    }

    private static String getCanonicalQueryString(String query) {
        if (query == null || query.trim().length() == 0) {
            return "";
        }
        List<Pair<String, String>> queryParamList = new ArrayList<>();
        String[] params = query.split("&");
        for (String param : params) {
            int eqIndex = param.indexOf("=");
            String key = param.substring(0, eqIndex);
            String value = param.substring(eqIndex + 1);
            Pair<String, String> pair = new Pair<String, String>(key, value);
            queryParamList.add(pair);
        }
        List<Pair<String, String>> sortedParamList = queryParamList.stream().sorted(Comparator.comparing(param -> param.getKey() + "=" +
                Optional.ofNullable(param.getValue()).orElse(""))).collect(Collectors.toList());
        List<Pair<String, String>> encodeParamList = new ArrayList<>();
        sortedParamList.stream().

                forEach(param ->

                {
                    try {
                        String key = URLEncoder.encode(param.getKey(), "utf-8");
                        String value = URLEncoder.encode(Optional.ofNullable(param.getValue()).orElse(""), "utf-8")
                                .replaceAll("\\%2B", "%20")
                                .replaceAll("\\+", "%20")
                                .replaceAll("\\%21", "!")
                                .replaceAll("\\%27", "'")
                                .replaceAll("\\%28", "(")
                                .replaceAll("\\%29", ")")
                                .replaceAll("\\%7E", "~")
                                .replaceAll("\\%25", "%");
                        encodeParamList.add(new Pair<>(key, value));
                    } catch (UnsupportedEncodingException e) {
                        throw new RuntimeException("encoding error");
                    }
                });
        StringBuilder queryParamString = new StringBuilder(64);
        for (Pair<String, String> encodeParam : encodeParamList) {
            queryParamString.append(encodeParam.getKey()).append("=").append(Optional.ofNullable(encodeParam.getValue()).orElse(""));
            queryParamString.append("&");
        }
        return queryParamString.substring(0, queryParamString.length() - 1);
    }

}

4 . 返回结果

{
    "data": {
        "accessToken": "debug_at_6666666666666666666666666666"
    },
    "resp_code": 0,
    "resp_msg": "",
    "success": true,
    "showType": 4,
    "traceId": "traceId111",
    "host": "host2222",
    "total": "0"
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AFSim 仿真系统----集成指南

引言 本文档描述了将新功能扩展和集成到 AFSIM 中的有限方法。允许并描述多种方法&#xff0c;以及在 AFSIM 社区标准和指南中引入集成作为可共享资源的要求。 概述 核心可执行文件 基于 AFSIM 的可执行文件通常由单个 AFSIM “应用程序” 组成。该应用程序维护脚本类型、扩…

Linux rocky 9.2 安装mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz

数据库官方下载&#xff1a;MySQL :: Download MySQL Community Server 本文也绑定该资源包&#xff0c;免费提供下载学习。 1.系统版本 2.新建目录&#xff0c;存放数据库安装包&#xff0c;并且上传 需要用到的工具&#xff1a;yum -y install vim lrzsz tar 上传解压&…

SAP EWM 包装

目录 1 简介 2 业务流程 3 主数据 4 后台配置 1 简介 SAP S4 HANA 里 EWM 包装功能使用 PS&#xff08;packaging specification&#xff09;代替原有的包装功能 PM&#xff08;packaging management&#xff09;, PI&#xff08;packaging instruction&#xff09;。PS 生…

UNiapp之微信小程序导出Excel

效果如下 参考小程序&#xff1a;日常记一记 ---账单页面 主要功能是根据筛选条件导出账单明细列表&#xff0c;实现该功能主要借助一个工具(excel.js)&#xff0c;可在文章顶部下载或者一下网盘下载 https://pan.baidu.com/s/1RLisuG4_7FGD0Cnwewyabg?pwdpd2a 提取码: pd2a…

C# 判断

|判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;| | |-------------------------------------------------------------|–| | | | 下面是…

HormonyOS踩坑JSON.stringfy

前两天发现一个问题 就是一个值 用as string就可以打印出来 用JSON.stringfy()就不行 百思不得其解 想破了脑袋&#xff01;&#xff01;&#xff01;终于被我发现了 原因就在于上边那个包&#xff01;&#xff01;&#xff01;&#xff01;把那个包删除了就好了&#xff…

勇闯机器学习(第二关-数据集使用)

以下内容&#xff0c;皆为原创&#xff0c;重在无私分享高质量知识&#xff0c;制作实属不易&#xff0c;请点点关注。 好戏开场了~~~(这关涉及到了加载数据集的代码&#xff0c;下一关&#xff0c;教你们安装机器学习库) 一.数据集 这一关的目标 知道数据集被分为训练集和测…

一款搭载远翔FP5207芯片的大功率音箱,蓝牙音箱的组成和拆解展示

一款搭载远翔FP5207芯片的大功率音箱&#xff0c;蓝牙音箱的组成和拆解展示&#xff1a; 它主要以电池、功放、蓝牙、外壳结构组成。音箱放电需内置升压芯片FP5207或5217进行电池升压给功放供电。 为同时满足便携性需求并提供足够的功率&#xff0c;音箱通常配备了12V铅酸电池…

MySQL中的DML操作()

一、添加数据(INSERT) 1.1 选择插入 INSERT INTO 表名(列名 1 &#xff0c;列名 2 &#xff0c;列名 3.....) VALUES(值 1 &#xff0c;值 2 &#xff0c;值 3......); 1.2 默认值处理(DEFAULT) 在 MySQL 中可以使用 DEFAULT 为列设定一个默认值。如果在插入数据时并未指定该…

【C++】OJ习题(初阶)

&#x1f680;个人主页&#xff1a;奋斗的小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 &#x1f4a5;1、字符串&#x1f4a5;1.1 字符串相加&#x1f4a5;1.2 验证回文字符串&#x1f4a5;1.3 反转…

单例模式 详解

单例模式 简介: 让类只初始化一次, 然后不同的地方都能获取到同一个实例 这是非常常用的一种模式, 系统稍微大一点基本上都会用到. 在系统中, 不同模块的总管理类都已单例模式居多 这里我们不仅使用c实现单例模式, 也会用python2实现一遍 python代码 想要看更详细的python单…

【Python机器学习】NLP——一个简陋的聊天机器人

目录 正则表达式 一个简答的聊天机器人 另一种方法 正则表达式就是一种FSM&#xff0c;同时它也给出了一种可能的NLP方法&#xff0c;即基于模式的方法。 正则表达式 现实生活中&#xff0c;密码锁其实就是一台简单的语言处理机。密码锁不能阅读和理解课本&#xff0c;但是…

高性能web服务器nginx

目录 nginx简介 服务端 I/O 流程 Nginx 进程结构 Nginx启动流程 nginx的源码编译下载 nginx命令常见参数 nginx的配置文件详解 全局配置优化 nginx的平滑升级和回滚 nginx目录匹配优先级测试&#xff08;因为只支持访问文件&#xff0c;所有不比对匹配目录优先级&…

STM32GPIO引脚八种工作模式

1. GPIO简述 GPIO&#xff08;General-purpose input/output&#xff09;&#xff0c;通用型输入输出。简单理解就是我们可以控制输入输出的STM32引脚&#xff0c;统称为GPIO。 GPIO存在的意义就是用程序控制或读取它们的输出或输入。 2. 功能描述 每个GPI/O端口有两个32位配…

代码随想录算法训练营day50:图论01:图论理论基础;深度优先搜索理论基础;98. 所有可达路径;广度优先搜索理论基础

图论理论基础 分类&#xff1a;有向图&#xff0c;无向图&#xff0c;有无权重 度&#xff1a;【无向图】&#xff1a;有几条边连接该节点&#xff0c;该节点就有几度。 【有向图】&#xff1a;每个节点有出度和入度。出度&#xff1a;从该节点出发的边的个数。入度&#xf…

.net maui安卓开发中适用明文传输(一)

背景:最近在做一个pad上的项目,目的是执行每日点检功能(就是检查设备的各项保养指标);前期用HBuilder做了一个,但是现场的触摸屏选用的是TouchPie 安卓版本是6.0版本,上次开发的软件可以在安卓7.0上完美兼容,但由于触摸屏安卓版本太低不能兼容;询问厂商才知道这款触摸…

前端性能优化的指标

性能优化指标的出现,谷歌在2020年提出的Core Web Vitals 和 Web Vitals 了解谷歌浏览器自带的性能调试工具DCL、L、FP、FCP、LCP,图层(有layout布局就是回流,painting绘制就是重绘) 回流和重绘的理解 页面第一次打开一定回流和重绘,回流一定重绘,回流出现一般是位置改变…

BEV世界:通过统一的BEV潜在空间实现自动驾驶的多模态世界模型

BEVWorld: A Multimodal World Model for Autonomous Driving via Unified BEV Latent Space BEV世界&#xff1a;通过统一的BEV潜在空间实现自动驾驶的多模态世界模型 Abstract World models are receiving increasing attention in autonomous driving for their ability t…

【数据结构】PTA 求链表的倒数第m个元素 C语言

请设计时间和空间上都尽可能高效的算法&#xff0c;在不改变链表的前提下&#xff0c;求链式存储的线性表的倒数第m&#xff08;>0&#xff09;个元素。 函数接口定义&#xff1a; ElementType Find( List L, int m ); 其中List结构定义如下&#xff1a; typedef struct…

什么是机器人快换盘?

机器人快换盘&#xff0c;行业内也称作工具快换盘、换枪盘、快换工具盘、快速更换器、快换器、 快换夹具、治具快换等。是末端执行器快速更换装置&#xff08;End-Of-Arm Tooling&#xff0c;简称EOAT&#xff09;&#xff0c;是工业自动化领域中用于机器人手臂上的一种重要设备…