使用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

相关文章

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap