From a365eb1d7213c5f28c6d2fc2b8f87099d71d17d4 Mon Sep 17 00:00:00 2001 From: 潘志宝 <979469083@qq.com> Date: 星期一, 03 三月 2025 16:09:21 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- sdk/src/main/java/com/iailab/sdk/auth/client/IailabAuthClient.java | 122 +++++++++++++++++++++++++--------------- 1 files changed, 77 insertions(+), 45 deletions(-) diff --git a/sdk/src/main/java/com/iailab/sdk/auth/client/IailabAuthClient.java b/sdk/src/main/java/com/iailab/sdk/auth/client/IailabAuthClient.java index 4ba282b..e8d4772 100644 --- a/sdk/src/main/java/com/iailab/sdk/auth/client/IailabAuthClient.java +++ b/sdk/src/main/java/com/iailab/sdk/auth/client/IailabAuthClient.java @@ -1,16 +1,23 @@ package com.iailab.sdk.auth.client; import com.fasterxml.jackson.databind.ObjectMapper; -import com.iailab.sdk.auth.client.dto.TokenDTO; import com.iailab.sdk.auth.client.vo.AuthLoginReqVO; +import com.iailab.sdk.auth.config.AuthProperties; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.*; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; 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.*; + +import static com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; +import static com.iailab.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.iailab.sdk.auth.enums.ErrorCodeConstants.*; /** * @author Houzhongjian @@ -21,48 +28,42 @@ @Service public class IailabAuthClient { - /** - * 平台地址 - */ - public static String BASE_URL = "http://172.16.8.100:48080/admin-api"; - - /** - * 租户编号 - */ - public static String TENANT_ID = "1"; - private static final RestTemplate restTemplate = new RestTemplate(); + + private static AuthProperties authProperties; + + public static void setAuthProperties(AuthProperties properties) { + authProperties = properties; + } + + private static final String GRAND_TYPE = "password"; + + private static final String SCOPE = "user.read user.write"; + + // 鉴权token + public static String accessToken; + // 刷新token + public static String refreshToken; + // 鉴权token过期时间 + public static Long expireTime; /** * 用户名密码方式获取平台token */ - public static synchronized TokenDTO login(AuthLoginReqVO loginReqVO) throws Exception { + public static synchronized void authenticate() throws Exception { System.out.println("登录获取平台token"); - ObjectMapper objectMapper = new ObjectMapper(); - String paramString = objectMapper.writeValueAsString(loginReqVO); // 1.1 构建请求头 HttpHeaders headers = new HttpHeaders(); addClientHeader(headers); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); // 1.2 构建authenticate请求URL - String authenticateUrl = BASE_URL + "/system/auth/login"; - // 2. 执行请求 - ResponseEntity<Map<String, Object>> exchange = restTemplate.exchange( - authenticateUrl, - HttpMethod.POST, - new HttpEntity<>(paramString, headers), - new ParameterizedTypeReference<Map<String, Object>>() { - }); - return handleResponse(exchange); - } - - public static synchronized TokenDTO refreshToken(String refreshToken) { - System.out.println("刷新token"); - // 1.1 构建请求头 - HttpHeaders headers = new HttpHeaders(); - addClientHeader(headers); // 1.2 构建authenticate请求URL - String authenticateUrl = BASE_URL + "/system/auth/refresh-token?refreshToken=" + refreshToken; + String authenticateUrl = authProperties.getBaseUrl() + "/system/oauth2/token?" + // 密码模式的参数 + + "&grant_type=" + GRAND_TYPE + + "&username=" + authProperties.getUsername() + + "&password=" + authProperties.getPassword() + + "&scope=" + SCOPE; // 2. 执行请求 ResponseEntity<Map<String, Object>> exchange = restTemplate.exchange( authenticateUrl, @@ -70,24 +71,55 @@ new HttpEntity<>(headers), new ParameterizedTypeReference<Map<String, Object>>() { }); - return handleResponse(exchange); + Map<String, Object> authMap = exchange.getBody(); + if(AUTH_BAD_CREDENTIALS.getCode().equals(authMap.get("code"))) { + throw exception(AUTH_BAD_CREDENTIALS); + } else if(AUTH_LOGIN_BAD_CREDENTIALS.getCode().equals(authMap.get("code"))) { + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } + Assert.isTrue(exchange.getStatusCode().is2xxSuccessful(), "响应必须是 200 成功"); + accessToken = authMap.get("access_token").toString(); + refreshToken = authMap.get("refresh_token").toString(); + expireTime = Long.valueOf(authMap.get("expires_time").toString()); + } + + public static synchronized void refreshToken() throws Exception { + System.out.println("刷新token"); + // 1.1 构建请求头 + HttpHeaders headers = new HttpHeaders(); + addClientHeader(headers); + // 1.2 构建authenticate请求URL + String authenticateUrl = authProperties.getBaseUrl() + "/system/auth/client-refresh-token?refreshToken=" + refreshToken+ "&clientId=" + authProperties.getClientId(); + // 2. 执行请求 + ResponseEntity<Map<String, Object>> exchange = restTemplate.exchange( + authenticateUrl, + HttpMethod.POST, + new 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 { + throw exception(AUTH_REFRESH_TOKEN_ERROR); + } + } 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 = authProperties.getClientId() + ":" + authProperties.getClientSecret(); + 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); + headers.set("tenant-id", authProperties.getTenantId()); } - // 统一处理响应 - private static <T> TokenDTO handleResponse(ResponseEntity<T> response) { - Assert.isTrue(response.getStatusCode().is2xxSuccessful(), "响应必须是 200 成功"); - System.out.println(response); - TokenDTO authTokenDTO = new TokenDTO(); - Map<String, Object> authMap = (Map<String, Object>)response.getBody(); - Map<String, Object> tokenData = (Map<String, Object>)authMap.get("data"); - authTokenDTO.setAccessToken(tokenData.get("accessToken").toString()); - authTokenDTO.setRefreshToken(tokenData.get("refreshToken").toString()); - authTokenDTO.setExpiresTime(Long.valueOf(tokenData.get("expiresTime").toString())); - return authTokenDTO; - } } \ No newline at end of file -- Gitblit v1.9.3