OAuthClaudeCodeServiceImpl.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package com.cyksj.service.claude.impl;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import cn.hutool.core.date.DateField;
  4. import cn.hutool.core.date.DateTime;
  5. import cn.hutool.core.util.RandomUtil;
  6. import cn.hutool.json.JSONObject;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import com.cyksj.mapper.claudecode.OAuthClientMapper;
  9. import com.cyksj.mapper.claudecode.OAuthTokenMapper;
  10. import com.cyksj.model.entity.OAuthClient;
  11. import com.cyksj.model.entity.OAuthToken;
  12. import com.cyksj.model.request.ClaudeCodeApiKeysReq;
  13. import com.cyksj.model.response.claudecode.ClaudeCodeResp;
  14. import com.cyksj.model.views.ClaudeCodeUserApiKeysView;
  15. import com.cyksj.redis.RedisService;
  16. import com.cyksj.service.claude.ClaudeCodeService;
  17. import com.cyksj.service.claude.OAuthClaudeCodeService;
  18. import com.google.gson.JsonObject;
  19. import lombok.RequiredArgsConstructor;
  20. import org.apache.commons.lang3.StringUtils;
  21. import org.springframework.stereotype.Service;
  22. import java.time.LocalDateTime;
  23. import java.util.Date;
  24. import java.util.List;
  25. import java.util.UUID;
  26. /**
  27. * OAuth服务
  28. */
  29. @Service
  30. @RequiredArgsConstructor
  31. public class OAuthClaudeCodeServiceImpl implements OAuthClaudeCodeService {
  32. private final OAuthClientMapper oauthClientMapper;
  33. private final OAuthTokenMapper oauthTokenMapper;
  34. private final RedisService redisService;
  35. private final ClaudeCodeService claudeCodeService;
  36. /**
  37. * 验证客户端凭据
  38. */
  39. @Override
  40. public OAuthClient validateClient(String clientId, String clientSecret) {
  41. QueryWrapper<OAuthClient> wrapper = new QueryWrapper<>();
  42. wrapper.eq("id", clientId)
  43. .eq("client_secret", clientSecret)
  44. .eq("status", 1);
  45. return oauthClientMapper.selectOne(wrapper);
  46. }
  47. /**
  48. * 生成访问令牌
  49. */
  50. @Override
  51. public String generateAccessToken(Long userId, String clientId) throws Exception {
  52. if (claudeCodeService.checkClaudeCodeUser(userId)) {
  53. List<ClaudeCodeUserApiKeysView> userApiKeys = claudeCodeService.getUserApiKeys(userId);
  54. if (CollectionUtil.isEmpty(userApiKeys)) {
  55. ClaudeCodeApiKeysReq claudeCodeApiKeysReq = new ClaudeCodeApiKeysReq();
  56. claudeCodeApiKeysReq.setName("系统创建");
  57. claudeCodeApiKeysReq.setUserId(userId);
  58. claudeCodeApiKeysReq.setExpiresDays(30);
  59. ClaudeCodeResp apiKeys = claudeCodeService.createApiKeys(claudeCodeApiKeysReq);
  60. JSONObject jsonObject = new JSONObject(apiKeys.getData());
  61. String token = jsonObject.getStr("key_value");
  62. // 保存token
  63. OAuthToken oAuthToken = new OAuthToken();
  64. oAuthToken.setTokenValue(token);
  65. oAuthToken.setUserId(userId);
  66. oAuthToken.setClientId(clientId);
  67. oAuthToken.setStatus(1);
  68. oAuthToken.setCreatedTime(new Date());
  69. oauthTokenMapper.insert(oAuthToken);
  70. return token;
  71. }
  72. }
  73. return null;
  74. }
  75. /**
  76. * 验证访问令牌
  77. */
  78. @Override
  79. public OAuthToken validateToken(String code, String key) {
  80. if (StringUtils.isNotBlank(key)) {
  81. } else {
  82. QueryWrapper<OAuthToken> wrapper = new QueryWrapper<>();
  83. wrapper.eq("token", code)
  84. .eq("status", 1)
  85. .gt("expires_at", LocalDateTime.now());
  86. return oauthTokenMapper.selectOne(wrapper);
  87. }
  88. QueryWrapper<OAuthToken> wrapper = new QueryWrapper<>();
  89. wrapper.eq("keyValue", key)
  90. .eq("status", 1)
  91. .gt("expires_at", LocalDateTime.now());
  92. return oauthTokenMapper.selectOne(wrapper);
  93. }
  94. /**
  95. * 撤销令牌
  96. */
  97. @Override
  98. public void revokeToken(String tokenValue) {
  99. QueryWrapper<OAuthToken> wrapper = new QueryWrapper<>();
  100. wrapper.eq("token_value", tokenValue);
  101. OAuthToken token = new OAuthToken();
  102. token.setStatus(0);
  103. oauthTokenMapper.update(token, wrapper);
  104. }
  105. /**
  106. * 清理过期令牌
  107. */
  108. @Override
  109. public void cleanExpiredTokens() {
  110. QueryWrapper<OAuthToken> wrapper = new QueryWrapper<>();
  111. wrapper.lt("expires_at", LocalDateTime.now());
  112. oauthTokenMapper.delete(wrapper);
  113. }
  114. }