From 8766cfc344d3635cd7e50a7c674cd5feb54d5a3d Mon Sep 17 00:00:00 2001 From: liriming <1343021927@qq.com> Date: 星期一, 02 十二月 2024 09:30:35 +0800 Subject: [PATCH] 预警mq监听并发送 --- shasteel-biz/src/main/java/com/iailab/module/shasteel/util/token/IailabClient.java | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 158 insertions(+), 0 deletions(-) diff --git a/shasteel-biz/src/main/java/com/iailab/module/shasteel/util/token/IailabClient.java b/shasteel-biz/src/main/java/com/iailab/module/shasteel/util/token/IailabClient.java new file mode 100644 index 0000000..fe3fcc5 --- /dev/null +++ b/shasteel-biz/src/main/java/com/iailab/module/shasteel/util/token/IailabClient.java @@ -0,0 +1,158 @@ +package com.iailab.module.shasteel.util.token; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.Assert; +import org.springframework.util.Base64Utils; +import org.springframework.util.ObjectUtils; +import org.springframework.web.client.RestTemplate; + +import java.nio.charset.StandardCharsets; +import java.util.Map; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年11月21日 + */ +@Slf4j +public class IailabClient { + + /** + * 平台地址 + */ + public static String BASE_URL; + + /** + * 租户编号 + */ + public static Long TENANT_ID; + + /** + * 客户端信息 + */ + private static String CLIENT_ID; + private static String CLIENT_SECRET; + private static String USERNAME; + private static String PASSWORD; + private static final String GRAND_TYPE = "password"; + private static final String SCOPE = "user.read user.write"; + + + private static final RestTemplate restTemplate = new RestTemplate(); + + // 鉴权token + public static String accessToken; + // 刷新token + public static String refreshToken; + // 鉴权token过期时间 + public static Long expireTime; + + private static final IailabClient iailabClient = new IailabClient(); + + private IailabClient() { +// BASE_URL = PlatApplicationContext.getProperty("iailab.baseUrl"); +// TENANT_ID = Long.parseLong(PlatApplicationContext.getProperty("iailab.tenantId")); +// CLIENT_ID = PlatApplicationContext.getProperty("iailab.clientId"); +// CLIENT_SECRET = PlatApplicationContext.getProperty("iailab.clientSecret"); +// USERNAME = PlatApplicationContext.getProperty("iailab.username"); +// PASSWORD = PlatApplicationContext.getProperty("iailab.password"); + + BASE_URL = "http://127.0.0.1:48080/admin-api/system"; + TENANT_ID = 172L; + CLIENT_ID = "shasteel"; + CLIENT_SECRET = "shasteel111111111111111"; + USERNAME = "shasteel"; + PASSWORD = "123456"; + } + + public static IailabClient getInstance() { + return iailabClient; + } + + /** + * 用户名密码方式获取平台token + */ + private static synchronized void authenticate() { + log.info("获取平台token"); + // 1.1 构建请求头 + HttpHeaders headers = new HttpHeaders(); + addClientHeader(headers); + // 1.2 构建authenticate请求URL + String authenticateUrl = BASE_URL + "/oauth2/token?" + // 密码模式的参数 + + "grant_type=" + GRAND_TYPE + + "&username=" + USERNAME + + "&password=" + PASSWORD + + "&scope=" + SCOPE; + // 2. 执行请求 + ResponseEntity<Map<String, Object>> exchange = restTemplate.exchange( + authenticateUrl, + HttpMethod.POST, + new org.springframework.http.HttpEntity<>(headers), + new ParameterizedTypeReference<Map<String, Object>>() { + }); + Assert.isTrue(exchange.getStatusCode().is2xxSuccessful(), "响应必须是 200 成功"); + log.info(exchange.toString()); + Map<String, Object> authMap = exchange.getBody(); + accessToken = authMap.get("access_token").toString(); + refreshToken = authMap.get("refresh_token").toString(); + expireTime = Long.valueOf(authMap.get("expires_time").toString()); + } + + private static synchronized void refreshToken() { + log.info("刷新token"); + // 1.1 构建请求头 + HttpHeaders headers = new HttpHeaders(); + addClientHeader(headers); + // 1.2 构建authenticate请求URL + String authenticateUrl = BASE_URL + "/system/auth/client-refresh-token?refreshToken=" + refreshToken + + "&clientId=" + CLIENT_ID; + // 2. 执行请求 + ResponseEntity<Map<String, Object>> exchange = restTemplate.exchange( + authenticateUrl, + HttpMethod.POST, + new org.springframework.http.HttpEntity<>(headers), + new ParameterizedTypeReference<Map<String, Object>>() { + }); + Assert.isTrue(exchange.getStatusCode().is2xxSuccessful(), "响应必须是 200 成功"); + Map<String, Object> authMap = exchange.getBody(); + //刷新token过期,重新获取token + if (!ObjectUtils.isEmpty(authMap.get("code"))) { + Integer code = Integer.valueOf(authMap.get("code").toString()); + if (code == 401) { + authenticate(); + } + } else { + accessToken = authMap.get("access_token").toString(); + expireTime = Long.valueOf(authMap.get("expires_time").toString()); + } + } + + private static void addClientHeader(HttpHeaders headers) { + // client 拼接,需要 BASE64 编码 + String client = CLIENT_ID + ":" + CLIENT_SECRET; + client = Base64Utils.encodeToString(client.getBytes(StandardCharsets.UTF_8)); + headers.add("Authorization", "Basic " + client); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + headers.set("tenant-id", TENANT_ID.toString()); + } + + public static String getToken() { + //第一次请求或者token过期,需要重新获取token + if(ObjectUtils.isEmpty(IailabClient.accessToken)) { + IailabClient.authenticate(); + } else if (IailabClient.expireTime < System.currentTimeMillis() / 1000) { + IailabClient.refreshToken(); + } + + return accessToken; + } + public static Long getTenantId() { + return TENANT_ID; + } +} \ No newline at end of file -- Gitblit v1.9.3