使用java代码调用超融合登录接口,跟着敲就完事,官方文档也没有的资源~

news2024/11/7 18:05:47

一、准备工作

接口地址:

获取公钥:/vapi/json/public_key
登录:/vapi/json/access/ticket

登陆接口和 API 调用说明:

这部分步骤均为官网文档,最后步骤则是本地测试用户列表接口

1、第一步:获取公钥

注意:发送 HTTPS 请求,因为没有合法证书,在浏览器访问也会弹出告警提
示,用程序访问时也要通过参数设置忽略 HTTPS 证书告警。
效果:

2、第二步:用公钥把管理员密码加密

文档虽然显示每种开发语言都有现成的算法,但和售后技术支撑沟通说目前只有node.js这一种加密方式。文档被我整合到了一个superfusion.js文件里,本文附件会有。

3、第三步:登录拿到 token ticker

4、第四步:设置请求头部的 cookie

5、第五步:调用 API 发送请求

6、第六步:解析输出结果

二、java代码实现

1、pom部分

<dependency>
    <groupId>org.mozilla</groupId>
    <artifactId>rhino</artifactId>
    <version>1.7.13</version> <!-- 推荐版本 -->
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

2、java代码创建Uint8Array部分

import org.mozilla.javascript.*;
import org.mozilla.javascript.annotations.JSFunction;


public class Uint8ArraySimulator extends ScriptableObject {
    private byte[] buffer;

    public Uint8ArraySimulator() {
        buffer = new byte[0];
    }

    @Override
    public String getClassName() {
        return "Uint8Array";
    }

    @JSFunction
    public static Scriptable createObject(Context cx, Scriptable scope, Object[] args, Function ctorObj) {
        if (args.length > 0 && args[0] instanceof Number) {
            int length = ((Number) args[0]).intValue();
            Uint8ArraySimulator arr = new Uint8ArraySimulator();
            arr.buffer = new byte[length];
            arr.setParentScope(scope);
            arr.setPrototype((Scriptable) ctorObj.get("prototype", ctorObj));
            return arr;
        } else {
            // 处理其他情况,或者返回一个默认的 Uint8ArraySimulator 对象
            return new Uint8ArraySimulator();
        }
    }


    @JSFunction
    public byte get(int index) {
        return buffer[index];
    }

    @JSFunction
    public void set(int index, byte value) {
        buffer[index] = value;
    }

    // Add other methods as needed
    public static void init(Context cx, Scriptable scope) throws NoSuchMethodException {
        Scriptable constructor = cx.newObject(scope);
        constructor.setPrototype(scope);
        constructor.setParentScope(null);
        // 在创建 Uint8Array 构造函数时
        FunctionObject ctor = new FunctionObject("Uint8Array", Uint8ArraySimulator.class.getDeclaredMethod("createObject", Context.class, Scriptable.class, Object[].class, Function.class), scope);
        // 将构造函数设置为全局变量
        scope.put("Uint8Array", scope, ctor);
        ctor.addAsConstructor(scope, constructor);
    }
}

 3、测试类主程序部分

 private static final String PUBLIC_KEY_URL = "https://1***/vapi/json/public_key";
    private static final String TICKET_URL = "https://1***/vapi/json/access/ticket";

    public static void main(String[] args) throws NoSuchAlgorithmException, KeyManagementException {
        long startTime = System.currentTimeMillis(); // 记录开始时间
        try {
            OkHttpClient client = disableSSLClient();
            // 第一步:获取public key
            Request request1 = new Request.Builder()
                    .url(PUBLIC_KEY_URL)
                    .get()
                    .build();
            Response response1 = client.newCall(request1).execute();

            long endTime1 = System.currentTimeMillis(); // 记录结束时间
            System.out.println("request1 执行时间: "+(endTime1 - startTime) + "ms");

            if (response1.isSuccessful()) {
                String public_key = JsonParser.parseString(response1.body().string()).getAsJsonObject().get("data").getAsString();
//                System.out.println("hcicloud-yf, public_key: " + public_key);

                // 第二步:加密passwd
                String passwd1 = "123456";  // 你的密码

                long endTime2 = System.currentTimeMillis(); // 记录结束时间
                System.out.println("request1逻辑 执行时间: "+(endTime2 - endTime1) + "ms");

                String encryptedPasswd = callEncode2(public_key, passwd1);
//                System.out.println("hcicloud-yf 加密后密码: " + encryptedPasswd);

                long endTime3 = System.currentTimeMillis(); // 记录结束时间
                System.out.println("callEncode2 执行时间: "+(endTime3 - endTime2) + "ms");

                // 第三步:获取ticket
                RequestBody requestBody2 = new FormBody.Builder()
                        .add("username", "admin")
                        .add("password", encryptedPasswd)
                        .build();

                Request request2 = new Request.Builder()
                        .url(TICKET_URL)
                        .post(requestBody2)
                        .build();
                Response response2 = client.newCall(request2).execute();

                if (response2.isSuccessful()) {
                    JsonObject responseJson2 = JsonParser.parseString(response2.body().string()).getAsJsonObject().getAsJsonObject("data");
                    String CSRFPreventionToken = responseJson2.get("CSRFPreventionToken").getAsString();
                    String ticket1 = responseJson2.get("ticket").getAsString();
                    System.out.println("CSRFPreventionToken: " + CSRFPreventionToken);
                    System.out.println("ticket1: " + "LoginAuthCookie=".concat(ticket1));
                }

                long endTime4 = System.currentTimeMillis(); // 记录结束时间
                System.out.println("request2执行时间: "+(endTime4 - endTime3) + "ms");

            } else {
//                System.out.println("HTTP GET request to get public key failed. Error code: " + response1.code());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis(); // 记录结束时间
        System.out.println("程序执行时间(毫秒): " + (endTime - startTime));
    }

    public static String callEncode2(String publicKey, String password) {
        String jsFilePath = "D:\\project\\superfusion_rsa.js"; // 指定你的JavaScript文件路径
        String result = null;
        try {
            Context context = Context.enter();
            context.setOptimizationLevel(-1); // 禁用优化以提高兼容性

            ScriptableObject scope = context.initStandardObjects();
            Uint8ArraySimulator.init(context, scope);

            // 添加全局变量
            ScriptableObject.putProperty(scope, "public_key", publicKey); // 替换为实际的公钥

            // 读取并执行JavaScript文件
            String script = readFile(jsFilePath);
            context.evaluateString(scope, script, jsFilePath, 1, null);

            // 获取JavaScript函数对象
            // 这里假设你的JavaScript文件中有一个名为"encode2"的函数
            Object encode2Function = scope.get("encode2", scope);

            // 调用JavaScript函数
            Object javaScriptResult = Context.call(null, (Function) encode2Function, scope, scope, new Object[]{publicKey, password}); // 替换为实际的密码
            result = Context.toString(javaScriptResult);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            Context.exit();
        }
        return result;
    }

    private static String readFile(String filePath) throws Exception {
        StringBuilder content = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line).append("\n");
            }
        }
        return content.toString();
    }

    private static OkHttpClient disableSSLClient() throws KeyManagementException, NoSuchAlgorithmException {
        TrustManager[] trustAllCertificates = new TrustManager[]{new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }

            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }

            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }};

        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustAllCertificates, new java.security.SecureRandom());
        OkHttpClient client = new OkHttpClient.Builder()
                .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCertificates[0])
                .hostnameVerifier((hostname, session) -> true)
                .build();
        return client;
    }

4、结果输出

com.vcom.pmfr.superfusion.RSAEncryptionExample
request1 执行时间: 1164ms
request1逻辑 执行时间: 21ms
callEncode2 执行时间: 737ms
CSRFPreventionToken: 6***62:COMo0***sMWbo+rkmVBU
ticket1: LoginAuthCookie=Login:YW***W4=:6****62::vAXN0CC1LEz*****m5WDAAwTR/BKfPit60dW00eaLzcPAcQ5Hz/zK7EgTzDutZuizdxsCy1mgevvpHjwr5Mim7xdEZKuE3cCBteBc22+kTWo3h7Vkfs2y7lwVz+UDuSfAfy2zJ6n1iYUhZx1txHad74nOOd36iN605sJNeYa4KkC7fAejLVD/oTIM2yjRR9vVfKPwC4SJDy7uZJ1Mxz/Qr5muTo4kvMDVdySH/VKf5ME6pe1bAMypdlSkl84NAuX6ghIkJk3O9rLUZG/a2At/qTL788ldsN/Sip/aNvyHMA9ueoF/R4pJUaIUdo4O1g0mRbmAb7nRr+orb8shnw==
request2执行时间: 1645ms
程序执行时间(毫秒): 3567

5、接口测试

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

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

相关文章

Echarts自定义柱状图

目录 效果图 echarts官网找相似图 将柱状图引入html页面中 自定义柱状图 将不需要的属性删除 ​编辑 修改图形大小 grid 不显示x轴 ​编辑 不显示y轴线和相关刻度 ​编辑 y轴文字的颜色设置为自己想要的颜色 修改第一组柱子相关样式&#xff08;条状&#xff09; …

Richard Stallman 正在与癌症作战

导读为了纪念 GNU 项目成立 40 周年&#xff0c;自由软件基金会&#xff08;FSF&#xff09;已计划在 10 月 1 日&#xff08;即GNU 40&#xff09;为家庭、学生以及美国的其他人群组织一场黑客马拉松活动。 活动之前&#xff0c;GNU 项目于 9 月 27 日迎来了 40 岁生日&#…

GraalVM入门教程

GraalVM入门教程 GraalVM是什么几个名词介绍native-imagegu 基础环境搭建linux下载GraalVM配置环境变量下载安装AOT编译器 native-image安装gcc、glibc-devel 与 zlib-devel下载maven并配置环境变量 windows下载GraalVM配置环境变量下载安装AOT编译器 native-image下载配置wind…

阿里云服务器的购买方式有哪些?哪些实例规格的云服务器价格相对便宜一点?

对于还没购买过阿里云服务器的用户来说&#xff0c;如何购买阿里云服务器以及现在购买哪些实例规格的云服务器价格比较便宜是用户比较关心的&#xff0c;购买阿里云服务器的方式主要有四种&#xff0c;而目前价格比较便宜的云服务器实例规格有轻量应用服务器和和经济型、通用算…

【ROS 2 基础-常用工具】-6 Rviz基础使用

所有内容请查看&#xff1a;博客学习目录_Howe_xixi的博客-CSDN博客

图形学--shading着色

概念&#xff1a;对不同物体应用不同材质 llumination shading着色 Blinn-Phong reflectance model Diffuse Reflection 漫反射 光打到了shading point上然后光线四面八方均匀散射 光源会根据光源传播的距离进行一定的能量衰减 按球的表面积来算&#xff0c;吸收的能量和光…

分类预测 | Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入分类预测

分类预测 | Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入分类预测 目录 分类预测 | Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-GRU鲸鱼算法优化门控循环单元的数据多输入…

Gradio的重要函数以及一些代码示例学习(一)

1 重要函数解析 1.1 Interface()类 参考&#xff1a; interface 最常用的基础模块构成。 应用界面&#xff1a;gr.Interface(简易场景), gr.Blocks(定制化场景)输入输出&#xff1a;gr.Image(图像), gr.Textbox(文本框), gr.DataFrame(数据框), gr.Dropdown(下拉选项), gr.…

AI-新人类电商人的AI课,用世界先进的AI帮助电商降本增效

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/88448518 比如用语言模型写短视频文案、脚本&#xff0c;用生图模型做场景、拍摄、换装&#xff0c;用数字人做直播短视频 AI电商课程目录 注意&#xff1a;由于AI发展太快&#xff0c;新内容可能不在…

如何提升多个微信个人号管理效率?

一、管理多个微信个人号 微信扫码即可登录到系统&#xff0c;支持登录多个账号&#xff0c;可以聚合聊天&#xff0c;设置快捷回复语&#xff0c;提高回复的效率&#xff0c;不用来回切换界面&#xff0c;减少封号的风险。 二、监管管理多个账号 微信登陆在系统&#xff0c;所…

ECharta雷达图 样式调整

预期效果&#xff1a; <template><div id"operationalRisk-radar-chart" class"h-290 w-385"></div> </template><script>export default {name: radarChart} </script> <script setup>import { onMounted, r…

机器学习(24)---AdaBoost(课堂笔记)

文章目录 一、知识记录二、题目2.1 题目12.2 题目22.3 答案书写 一、知识记录 二、题目 2.1 题目1 2.2 题目2 2.3 答案书写

网络编程开发及实战(上)

一、什么是互联网 一、什么是互联网 1、计算机网络的定义 2、计算机的分类 1&#xff09;按照作用范围分类 个人局域网&#xff1a;热点 2&#xff09;按照网络的使用者分类 公用网&#xff1a;缴费可以使用的网 专用网&#xff1a;军队 3、网络的网络 由节点和链组成 互…

(七)QVTKOpenGLNativeWidget中显示坐标轴

为了方便观察图像的方向&#xff0c;位置以及旋转情况&#xff0c;想在窗口中添加一个坐标轴显示&#xff0c;并且这个坐标轴是随着窗口的旋转变动的&#xff0c;在网上找了很多例子&#xff0c;但是最后就是不显示坐标轴。 在此记录一下。 一、坐标轴相关类简单介绍 1.vtkA…

LabVIEW生成和打印条形码

LabVIEW生成和打印条形码 想在LabVIEW中生成条形码然后打印条形码。但是&#xff0c;当尝试使用任何一个打印VI来从LabVIEW打印条形码字体时&#xff0c;打印机中的字体是扭曲的。该如何解决这个问题&#xff1f; 首先&#xff0c;需要条形码字体。如果没有&#xff0c;可以从…

水质分析仪MQTT应用案例

水质分析仪MQTT应用案例 一、公司介绍 某仪器股份有限公司&#xff0c;集研发&#xff0c;生产&#xff0c;销售于一体的水质分析仪器公司。产品主要包括PH/ORP分析仪&#xff0c;电导度分析仪&#xff0c;溶氧分析仪&#xff0c;离子浓度分析仪&#xff0c;浊度分析仪及重金…

靠做网络安全,工资是同龄人的5倍:赚钱真的不能靠拼命!

最近在知乎看到一个测试&#xff0c;特扎心&#xff1a; 以下三种情况&#xff0c;哪个最让你绝望&#xff1f; ❶ 每月工资去掉开销还存不到3千&#xff1b; ❷ 家人突然急病住院&#xff0c;医药费10万&#xff1b; ❸ 同班的家长都在争先恐后给孩子报名各种辅导班、兴趣…

【python】文件和异常

文件和异常 实际开发中常常会遇到对数据进行持久化操作的场景&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词&#xff0c;可能需要先科普一下关于文件系统的知识&#xff0c;但是这里我们并不浪费笔墨介绍这个概念&#xff0c;请大…

实用API管理平台推荐:Apipost

在数字化时代&#xff0c;API已成为企业和开发者实现数据互通、应用集成的重要桥梁。然而&#xff0c;随着API数量的不断增加&#xff0c;API设计、调试、文档和测试等工作也变得越来越复杂。为了解决这一痛点&#xff0c;一款名为Apipost的API协同研发工具应运而生&#xff0c…

凝聚生态合力|汉得智慧营销中台O2与燕千云深度集成,助力企业数智化发展!

数字化转型&#xff0c;引领未来。在这个科技快速发展的时代&#xff0c;数字化转型已经成为企业发展的必然选择&#xff0c;通过运用先进的技术和创新的思维&#xff0c;企业可以实现业务流程的优化和效率的提升。 数字化转型不仅仅是一种工具&#xff0c;更是一种战略&#x…