Browse Source

chore: add type define for casdoor module

0xJacky 1 year ago
parent
commit
6dd0ec46a3
7 changed files with 336 additions and 333 deletions
  1. 46 111
      api/user/auth.go
  2. 72 0
      api/user/casdoor.go
  3. 207 214
      app/pnpm-lock.yaml
  4. 5 1
      app/src/api/auth.ts
  5. 1 1
      app/src/version.json
  6. 4 5
      app/src/views/other/Login.vue
  7. 1 1
      app/version.json

+ 46 - 111
api/user/auth.go

@@ -1,129 +1,64 @@
 package user
 
 import (
-    "github.com/0xJacky/Nginx-UI/api"
-    "github.com/0xJacky/Nginx-UI/model"
-    "github.com/0xJacky/Nginx-UI/settings"
-    "net/http"
+	"github.com/0xJacky/Nginx-UI/api"
+	"github.com/0xJacky/Nginx-UI/model"
+	"net/http"
 
-    "github.com/casdoor/casdoor-go-sdk/casdoorsdk"
-    "github.com/gin-gonic/gin"
-    "github.com/pkg/errors"
-    "golang.org/x/crypto/bcrypt"
-    "gorm.io/gorm"
+	"github.com/gin-gonic/gin"
+	"golang.org/x/crypto/bcrypt"
 )
 
 type LoginUser struct {
-    Name     string `json:"name" binding:"required,max=255"`
-    Password string `json:"password" binding:"required,max=255"`
+	Name     string `json:"name" binding:"required,max=255"`
+	Password string `json:"password" binding:"required,max=255"`
+}
+
+type LoginResponse struct {
+	Message string `json:"message"`
+	Token   string `json:"token"`
 }
 
 func Login(c *gin.Context) {
-    var user LoginUser
-    ok := api.BindAndValid(c, &user)
-    if !ok {
-        return
-    }
+	var user LoginUser
+	ok := api.BindAndValid(c, &user)
+	if !ok {
+		return
+	}
 
-    u, _ := model.GetUser(user.Name)
+	u, _ := model.GetUser(user.Name)
 
-    if err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(user.Password)); err != nil {
-        c.JSON(http.StatusForbidden, gin.H{
-            "message": "The username or password is incorrect",
-        })
-        return
-    }
+	if err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(user.Password)); err != nil {
+		c.JSON(http.StatusForbidden, gin.H{
+			"message": "The username or password is incorrect",
+		})
+		return
+	}
 
-    token, err := model.GenerateJWT(u.Name)
-    if err != nil {
-        c.JSON(http.StatusInternalServerError, gin.H{
-            "message": err.Error(),
-        })
-        return
-    }
+	token, err := model.GenerateJWT(u.Name)
+	if err != nil {
+		c.JSON(http.StatusInternalServerError, gin.H{
+			"message": err.Error(),
+		})
+		return
+	}
 
-    c.JSON(http.StatusOK, gin.H{
-        "message": "ok",
-        "token":   token,
-    })
+	c.JSON(http.StatusOK, LoginResponse{
+		Message: "ok",
+		Token:   token,
+	})
 }
 
 func Logout(c *gin.Context) {
-    token := c.GetHeader("Authorization")
-    if token != "" {
-        err := model.DeleteToken(token)
-        if err != nil {
-            c.JSON(http.StatusInternalServerError, gin.H{
-                "message": err.Error(),
-            })
-            return
-        }
-    }
-    c.JSON(http.StatusNoContent, nil)
-}
-
-type CasdoorLoginUser struct {
-    Code  string `json:"code" binding:"required,max=255"`
-    State string `json:"state" binding:"required,max=255"`
-}
-
-func CasdoorCallback(c *gin.Context) {
-    var loginUser CasdoorLoginUser
-    ok := api.BindAndValid(c, &loginUser)
-    if !ok {
-        return
-    }
-    endpoint := settings.CasdoorSettings.Endpoint
-    clientId := settings.CasdoorSettings.ClientId
-    clientSecret := settings.CasdoorSettings.ClientSecret
-    certificate := settings.CasdoorSettings.Certificate
-    organization := settings.CasdoorSettings.Organization
-    application := settings.CasdoorSettings.Application
-    if endpoint == "" || clientId == "" || clientSecret == "" || certificate == "" || organization == "" || application == "" {
-        c.JSON(http.StatusInternalServerError, gin.H{
-            "message": "Casdoor is not configured",
-        })
-        return
-    }
-    casdoorsdk.InitConfig(endpoint, clientId, clientSecret, certificate, organization, application)
-    token, err := casdoorsdk.GetOAuthToken(loginUser.Code, loginUser.State)
-    if err != nil {
-        c.JSON(http.StatusInternalServerError, gin.H{
-            "message": err.Error(),
-        })
-        return
-    }
-    claims, err := casdoorsdk.ParseJwtToken(token.AccessToken)
-    if err != nil {
-        c.JSON(http.StatusInternalServerError, gin.H{
-            "message": err.Error(),
-        })
-        return
-    }
-    u, err := model.GetUser(claims.Name)
-    if err != nil {
-        if errors.Is(err, gorm.ErrRecordNotFound) {
-            c.JSON(http.StatusForbidden, gin.H{
-                "message": "User not exist",
-            })
-        } else {
-            c.JSON(http.StatusInternalServerError, gin.H{
-                "message": err.Error(),
-            })
-        }
-        return
-    }
-
-    userToken, err := model.GenerateJWT(u.Name)
-    if err != nil {
-        c.JSON(http.StatusInternalServerError, gin.H{
-            "message": err.Error(),
-        })
-        return
-    }
-
-    c.JSON(http.StatusOK, gin.H{
-        "message": "ok",
-        "token":   userToken,
-    })
+	token := c.GetHeader("Authorization")
+	if token != "" {
+		err := model.DeleteToken(token)
+		if err != nil {
+			c.JSON(http.StatusInternalServerError, gin.H{
+				"message": err.Error(),
+			})
+			return
+		}
+	}
+	c.JSON(http.StatusNoContent, nil)
 }

+ 72 - 0
api/user/casdoor.go

@@ -2,24 +2,96 @@ package user
 
 import (
 	"fmt"
+	"github.com/0xJacky/Nginx-UI/api"
+	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/settings"
+	"github.com/casdoor/casdoor-go-sdk/casdoorsdk"
 	"github.com/gin-gonic/gin"
+	"github.com/pkg/errors"
+	"gorm.io/gorm"
 	"net/http"
 	"net/url"
 )
 
+type CasdoorLoginUser struct {
+	Code  string `json:"code" binding:"required,max=255"`
+	State string `json:"state" binding:"required,max=255"`
+}
+
+func CasdoorCallback(c *gin.Context) {
+	var loginUser CasdoorLoginUser
+
+	ok := api.BindAndValid(c, &loginUser)
+	if !ok {
+		return
+	}
+
+	endpoint := settings.CasdoorSettings.Endpoint
+	clientId := settings.CasdoorSettings.ClientId
+	clientSecret := settings.CasdoorSettings.ClientSecret
+	certificate := settings.CasdoorSettings.Certificate
+	organization := settings.CasdoorSettings.Organization
+	application := settings.CasdoorSettings.Application
+	if endpoint == "" || clientId == "" || clientSecret == "" || certificate == "" || organization == "" || application == "" {
+		c.JSON(http.StatusInternalServerError, gin.H{
+			"message": "Casdoor is not configured",
+		})
+		return
+	}
+
+	casdoorsdk.InitConfig(endpoint, clientId, clientSecret, certificate, organization, application)
+
+	token, err := casdoorsdk.GetOAuthToken(loginUser.Code, loginUser.State)
+	if err != nil {
+		api.ErrHandler(c, err)
+		return
+	}
+
+	claims, err := casdoorsdk.ParseJwtToken(token.AccessToken)
+	if err != nil {
+		api.ErrHandler(c, err)
+		return
+	}
+
+	u, err := model.GetUser(claims.Name)
+	if err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			c.JSON(http.StatusForbidden, gin.H{
+				"message": "User not exist",
+			})
+		} else {
+			api.ErrHandler(c, err)
+		}
+		return
+	}
+
+	userToken, err := model.GenerateJWT(u.Name)
+	if err != nil {
+		api.ErrHandler(c, err)
+		return
+	}
+
+	c.JSON(http.StatusOK, LoginResponse{
+		Message: "ok",
+		Token:   userToken,
+	})
+}
+
 func GetCasdoorUri(c *gin.Context) {
 	endpoint := settings.CasdoorSettings.Endpoint
 	clientId := settings.CasdoorSettings.ClientId
 	redirectUri := settings.CasdoorSettings.RedirectUri
 	state := settings.CasdoorSettings.Application
+
 	if endpoint == "" || clientId == "" || redirectUri == "" || state == "" {
 		c.JSON(http.StatusOK, gin.H{
 			"uri": "",
 		})
 		return
 	}
+
 	encodedRedirectUri := url.QueryEscape(redirectUri)
+
 	c.JSON(http.StatusOK, gin.H{
 		"uri": fmt.Sprintf("%s/login/oauth/authorize?client_id=%s&response_type=code&redirect_uri=%s&state=%s&scope=read", endpoint, clientId, encodedRedirectUri, state),
 	})

File diff suppressed because it is too large
+ 207 - 214
app/pnpm-lock.yaml


+ 5 - 1
app/src/api/auth.ts

@@ -4,6 +4,7 @@ import { useUserStore } from '@/pinia'
 const { login, logout } = useUserStore()
 
 export interface AuthResponse {
+  message: string
   token: string
 }
 
@@ -25,11 +26,14 @@ const auth = {
         login(r.token)
       })
   },
-  logout() {
+  async logout() {
     return http.delete('/logout').then(async () => {
       logout()
     })
   },
+  async get_casdoor_uri(): Promise<{ uri: string }> {
+    return http.get('/casdoor_uri')
+  },
 }
 
 export default auth

+ 1 - 1
app/src/version.json

@@ -1 +1 @@
-{"version":"2.0.0-beta.4","build_id":68,"total_build":272}
+{"version":"2.0.0-beta.4","build_id":72,"total_build":276}

+ 4 - 5
app/src/views/other/Login.vue

@@ -6,7 +6,6 @@ import { useUserStore } from '@/pinia'
 import auth from '@/api/auth'
 import install from '@/api/install'
 import SetLanguage from '@/components/SetLanguage/SetLanguage.vue'
-import http from '@/lib/http'
 import SwitchAppearance from '@/components/SwitchAppearance/SwitchAppearance.vue'
 
 const thisYear = new Date().getFullYear()
@@ -77,11 +76,11 @@ watch(() => gettext.current, () => {
 const has_casdoor = ref(false)
 const casdoor_uri = ref('')
 
-http.get('/casdoor_uri')
-  .then(response => {
-    if (response?.uri) {
+auth.get_casdoor_uri()
+  .then(r => {
+    if (r?.uri) {
       has_casdoor.value = true
-      casdoor_uri.value = response.uri
+      casdoor_uri.value = r.uri
     }
   })
   .catch(e => {

+ 1 - 1
app/version.json

@@ -1 +1 @@
-{"version":"2.0.0-beta.4","build_id":68,"total_build":272}
+{"version":"2.0.0-beta.4","build_id":72,"total_build":276}

Some files were not shown because too many files changed in this diff