OAuthClaudeCodeServiceImpl.java 4.4 KB

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