Files
cpzs-backend/src/main/java/com/xy/xyaicpzs/service/CozeAuthService.java
2025-08-01 19:09:57 +08:00

84 lines
3.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.xy.xyaicpzs.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
/**
* Coze认证服务
* 提供通过JWT获取访问令牌的功能
*/
@Service
public class CozeAuthService {
private static final Logger logger = LoggerFactory.getLogger(CozeAuthService.class);
private static final String COZE_TOKEN_URL = "https://api.coze.cn/api/permission/oauth2/token";
private static final String GRANT_TYPE = "urn:ietf:params:oauth:grant-type:jwt-bearer";
@Autowired
private RestTemplate restTemplate;
@Autowired
private ObjectMapper objectMapper;
/**
* 通过JWT获取访问令牌
*
* @param jwt JWT令牌
* @param durationSeconds 令牌有效期(秒)
* @return 包含访问令牌和过期时间的Map
*/
public Map<String, Object> getAccessToken(String jwt, Integer durationSeconds) {
try {
// 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer " + jwt);
// 设置请求体
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("grant_type", GRANT_TYPE);
if (durationSeconds != null && durationSeconds > 0) {
requestBody.put("duration_seconds", durationSeconds);
}
// 创建请求实体
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);
// 发送请求
ResponseEntity<String> response = restTemplate.postForEntity(COZE_TOKEN_URL, requestEntity, String.class);
// 解析响应
if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) {
JsonNode jsonNode = objectMapper.readTree(response.getBody());
Map<String, Object> result = new HashMap<>();
result.put("access_token", jsonNode.get("access_token").asText());
result.put("expires_in", jsonNode.get("expires_in").asLong());
return result;
} else {
throw new RuntimeException("获取访问令牌失败HTTP状态码" + response.getStatusCodeValue());
}
} catch (JsonProcessingException e) {
logger.error("解析响应JSON失败", e);
throw new RuntimeException("解析响应JSON失败: " + e.getMessage());
} catch (Exception e) {
logger.error("获取访问令牌失败", e);
throw new RuntimeException("获取访问令牌失败: " + e.getMessage());
}
}
}