| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- package com.cyksj.service.claude.impl;
- import cn.hutool.core.collection.CollectionUtil;
- import cn.hutool.core.date.DateField;
- import cn.hutool.core.date.DateTime;
- import cn.hutool.core.util.RandomUtil;
- import cn.hutool.json.JSONObject;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.cyksj.mapper.claudecode.OAuthClientMapper;
- import com.cyksj.mapper.claudecode.OAuthTokenMapper;
- import com.cyksj.model.entity.OAuthClient;
- import com.cyksj.model.entity.OAuthToken;
- import com.cyksj.model.request.ClaudeCodeApiKeysReq;
- import com.cyksj.model.response.claudecode.ClaudeCodeResp;
- import com.cyksj.model.views.ClaudeCodeUserApiKeysView;
- import com.cyksj.redis.RedisService;
- import com.cyksj.service.claude.ClaudeCodeService;
- import com.cyksj.service.claude.OAuthClaudeCodeService;
- import com.google.gson.JsonObject;
- import lombok.RequiredArgsConstructor;
- import org.apache.commons.lang3.StringUtils;
- import org.springframework.stereotype.Service;
- import java.time.LocalDateTime;
- import java.util.Date;
- import java.util.List;
- import java.util.UUID;
- /**
- * OAuth服务
- */
- @Service
- @RequiredArgsConstructor
- public class OAuthClaudeCodeServiceImpl implements OAuthClaudeCodeService {
- private final OAuthClientMapper oauthClientMapper;
- private final OAuthTokenMapper oauthTokenMapper;
- private final RedisService redisService;
- private final ClaudeCodeService claudeCodeService;
- /**
- * 验证客户端凭据
- */
- @Override
- public OAuthClient validateClient(String clientId, String clientSecret) {
- QueryWrapper<OAuthClient> wrapper = new QueryWrapper<>();
- wrapper.eq("id", clientId)
- .eq("client_secret", clientSecret)
- .eq("status", 1);
- return oauthClientMapper.selectOne(wrapper);
- }
- /**
- * 生成访问令牌
- */
- @Override
- public String generateAccessToken(Long userId, String clientId) throws Exception {
- if (claudeCodeService.checkClaudeCodeUser(userId)) {
- List<ClaudeCodeUserApiKeysView> userApiKeys = claudeCodeService.getUserApiKeys(userId);
- if (CollectionUtil.isEmpty(userApiKeys)) {
- ClaudeCodeApiKeysReq claudeCodeApiKeysReq = new ClaudeCodeApiKeysReq();
- claudeCodeApiKeysReq.setName("系统创建");
- claudeCodeApiKeysReq.setUserId(userId);
- claudeCodeApiKeysReq.setExpiresDays(30);
- ClaudeCodeResp apiKeys = claudeCodeService.createApiKeys(claudeCodeApiKeysReq);
- JSONObject jsonObject = new JSONObject(apiKeys.getData());
- String token = jsonObject.getStr("key_value");
- // 保存token
- OAuthToken oAuthToken = new OAuthToken();
- oAuthToken.setTokenValue(token);
- oAuthToken.setUserId(userId);
- oAuthToken.setClientId(clientId);
- oAuthToken.setStatus(1);
- oAuthToken.setCreatedTime(new Date());
- oauthTokenMapper.insert(oAuthToken);
- return token;
- }
- }
- return null;
- }
- /**
- * 验证访问令牌
- */
- @Override
- public OAuthToken validateToken(String code, String key) {
- if (StringUtils.isNotBlank(key)) {
- } else {
- QueryWrapper<OAuthToken> wrapper = new QueryWrapper<>();
- wrapper.eq("token", code)
- .eq("status", 1)
- .gt("expires_at", LocalDateTime.now());
- return oauthTokenMapper.selectOne(wrapper);
- }
- QueryWrapper<OAuthToken> wrapper = new QueryWrapper<>();
- wrapper.eq("keyValue", key)
- .eq("status", 1)
- .gt("expires_at", LocalDateTime.now());
- return oauthTokenMapper.selectOne(wrapper);
- }
- /**
- * 撤销令牌
- */
- @Override
- public void revokeToken(String tokenValue) {
- QueryWrapper<OAuthToken> wrapper = new QueryWrapper<>();
- wrapper.eq("token_value", tokenValue);
- OAuthToken token = new OAuthToken();
- token.setStatus(0);
- oauthTokenMapper.update(token, wrapper);
- }
- /**
- * 清理过期令牌
- */
- @Override
- public void cleanExpiredTokens() {
- QueryWrapper<OAuthToken> wrapper = new QueryWrapper<>();
- wrapper.lt("expires_at", LocalDateTime.now());
- oauthTokenMapper.delete(wrapper);
- }
- }
|