claude_oauth.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package controller
  2. import (
  3. "net/http"
  4. "one-api/common"
  5. "one-api/service"
  6. "github.com/gin-gonic/gin"
  7. )
  8. // ExchangeCodeRequest 授权码交换请求
  9. type ExchangeCodeRequest struct {
  10. AuthorizationCode string `json:"authorization_code" binding:"required"`
  11. CodeVerifier string `json:"code_verifier" binding:"required"`
  12. State string `json:"state" binding:"required"`
  13. }
  14. // GenerateClaudeOAuthURL 生成Claude OAuth授权URL
  15. func GenerateClaudeOAuthURL(c *gin.Context) {
  16. params, err := service.GenerateOAuthParams()
  17. if err != nil {
  18. c.JSON(http.StatusInternalServerError, gin.H{
  19. "success": false,
  20. "message": "生成OAuth授权URL失败: " + err.Error(),
  21. })
  22. return
  23. }
  24. c.JSON(http.StatusOK, gin.H{
  25. "success": true,
  26. "message": "生成OAuth授权URL成功",
  27. "data": params,
  28. })
  29. }
  30. // ExchangeClaudeOAuthCode 交换Claude OAuth授权码
  31. func ExchangeClaudeOAuthCode(c *gin.Context) {
  32. var req ExchangeCodeRequest
  33. if err := c.ShouldBindJSON(&req); err != nil {
  34. c.JSON(http.StatusBadRequest, gin.H{
  35. "success": false,
  36. "message": "请求参数错误: " + err.Error(),
  37. })
  38. return
  39. }
  40. // 解析授权码
  41. cleanedCode, err := service.ParseAuthorizationCode(req.AuthorizationCode)
  42. if err != nil {
  43. c.JSON(http.StatusBadRequest, gin.H{
  44. "success": false,
  45. "message": err.Error(),
  46. })
  47. return
  48. }
  49. // 交换token
  50. tokenResult, err := service.ExchangeCode(cleanedCode, req.CodeVerifier, req.State, nil)
  51. if err != nil {
  52. common.SysError("Claude OAuth token exchange failed: " + err.Error())
  53. c.JSON(http.StatusInternalServerError, gin.H{
  54. "success": false,
  55. "message": "授权码交换失败: " + err.Error(),
  56. })
  57. return
  58. }
  59. c.JSON(http.StatusOK, gin.H{
  60. "success": true,
  61. "message": "授权码交换成功",
  62. "data": tokenResult,
  63. })
  64. }