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

本文主要是介绍使用java代码调用超融合登录接口,跟着敲就完事,官方文档也没有的资源~,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、准备工作

接口地址:

获取公钥:/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];}@Overridepublic String getClassName() {return "Uint8Array";}@JSFunctionpublic 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();}}@JSFunctionpublic byte get(int index) {return buffer[index];}@JSFunctionpublic void set(int index, byte value) {buffer[index] = value;}// Add other methods as neededpublic 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 keyRequest 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);// 第二步:加密passwdString 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");// 第三步:获取ticketRequestBody 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、接口测试

这篇关于使用java代码调用超融合登录接口,跟着敲就完事,官方文档也没有的资源~的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/248953

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在