casdoor.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package user
  2. import (
  3. "fmt"
  4. "github.com/0xJacky/Nginx-UI/api"
  5. "github.com/0xJacky/Nginx-UI/internal/user"
  6. "github.com/0xJacky/Nginx-UI/settings"
  7. "github.com/casdoor/casdoor-go-sdk/casdoorsdk"
  8. "github.com/gin-gonic/gin"
  9. "github.com/pkg/errors"
  10. "gorm.io/gorm"
  11. "net/http"
  12. "net/url"
  13. "os"
  14. )
  15. type CasdoorLoginUser struct {
  16. Code string `json:"code" binding:"required,max=255"`
  17. State string `json:"state" binding:"required,max=255"`
  18. }
  19. func CasdoorCallback(c *gin.Context) {
  20. var loginUser CasdoorLoginUser
  21. ok := api.BindAndValid(c, &loginUser)
  22. if !ok {
  23. return
  24. }
  25. endpoint := settings.CasdoorSettings.Endpoint
  26. clientId := settings.CasdoorSettings.ClientId
  27. clientSecret := settings.CasdoorSettings.ClientSecret
  28. certificatePath := settings.CasdoorSettings.CertificatePath
  29. organization := settings.CasdoorSettings.Organization
  30. application := settings.CasdoorSettings.Application
  31. if endpoint == "" || clientId == "" || clientSecret == "" || certificatePath == "" ||
  32. organization == "" || application == "" {
  33. c.JSON(http.StatusInternalServerError, gin.H{
  34. "message": "Casdoor is not configured",
  35. })
  36. return
  37. }
  38. certBytes, err := os.ReadFile(certificatePath)
  39. if err != nil {
  40. api.ErrHandler(c, err)
  41. return
  42. }
  43. casdoorsdk.InitConfig(endpoint, clientId, clientSecret, string(certBytes), organization, application)
  44. token, err := casdoorsdk.GetOAuthToken(loginUser.Code, loginUser.State)
  45. if err != nil {
  46. api.ErrHandler(c, err)
  47. return
  48. }
  49. claims, err := casdoorsdk.ParseJwtToken(token.AccessToken)
  50. if err != nil {
  51. api.ErrHandler(c, err)
  52. return
  53. }
  54. u, err := user.GetUser(claims.Name)
  55. if err != nil {
  56. if errors.Is(err, gorm.ErrRecordNotFound) {
  57. c.JSON(http.StatusForbidden, gin.H{
  58. "message": "User not exist",
  59. })
  60. } else {
  61. api.ErrHandler(c, err)
  62. }
  63. return
  64. }
  65. userToken, err := user.GenerateJWT(u)
  66. if err != nil {
  67. api.ErrHandler(c, err)
  68. return
  69. }
  70. c.JSON(http.StatusOK, LoginResponse{
  71. Message: "ok",
  72. Token: userToken,
  73. })
  74. }
  75. func GetCasdoorUri(c *gin.Context) {
  76. endpoint := settings.CasdoorSettings.Endpoint
  77. clientId := settings.CasdoorSettings.ClientId
  78. redirectUri := settings.CasdoorSettings.RedirectUri
  79. state := settings.CasdoorSettings.Application
  80. if endpoint == "" || clientId == "" || redirectUri == "" || state == "" {
  81. c.JSON(http.StatusOK, gin.H{
  82. "uri": "",
  83. })
  84. return
  85. }
  86. encodedRedirectUri := url.QueryEscape(redirectUri)
  87. c.JSON(http.StatusOK, gin.H{
  88. "uri": fmt.Sprintf(
  89. "%s/login/oauth/authorize?client_id=%s&response_type=code&redirect_uri=%s&state=%s&scope=read",
  90. endpoint, clientId, encodedRedirectUri, state),
  91. })
  92. }