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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

豆包 MarsCode 不允许你还没有女朋友

在这个喧嚣的世界里,爱意需要被温柔地唤醒。为心爱的她制作每日一句小工具,就像是一场永不落幕的浪漫仪式,每天都在她的心田播撒爱的种子,让她的每一天都充满甜蜜与期待。 背景 在这个瞬息万变的时代,我们都在寻找那些能让我们慢下来,感受生活美好的瞬间。为了让这份浪漫持久而深刻,我们决定为女朋友定制一个每日一句小工具。这个工具会在她意想不到的时刻,为她呈现一句充满爱意的话语,让她的每一天都充满惊喜和感动

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取