diff --git a/pkg/model/user.go b/model/user.go similarity index 100% rename from pkg/model/user.go rename to model/user.go diff --git a/pkg/model/user_test.go b/model/user_test.go similarity index 100% rename from pkg/model/user_test.go rename to model/user_test.go diff --git a/pkg/common/token.go b/pkg/common/token.go index f40f3e7..118d0ba 100644 --- a/pkg/common/token.go +++ b/pkg/common/token.go @@ -3,6 +3,7 @@ package common import ( "drive-linked/config" "github.com/golang-jwt/jwt/v4" + "strings" "time" ) @@ -12,13 +13,28 @@ type JwtClaims struct { } //TODO:token解密验证 -func ValidateLogin(token string) error { - return nil +func ValidateLogin(authorization string) error { + // 取出Bearer后的内容 + var tokenString string + if auths := strings.Split(authorization, " "); len(auths) > 1 { + tokenString = auths[1] + } else { + return jwt.ErrInvalidKey + } + + token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { + return []byte(config.Cfg.Security.Jwt.Secret), nil + }) + + if token != nil && token.Valid { + return nil + } + return err } func NewToken(auds ...string) (string, error) { if len(auds) == 0 { - auds = []string{"nonAudience"} + auds = []string{"non-audience"} } // Create the claims claims := JwtClaims{ diff --git a/pkg/common/token_test.go b/pkg/common/token_test.go index c83e630..e26455a 100644 --- a/pkg/common/token_test.go +++ b/pkg/common/token_test.go @@ -14,3 +14,15 @@ func TestNewToken(t *testing.T) { } t.Log(token) } + +func TestValidateLogin(t *testing.T) { + config.SetupConfig() + + tokenString, _ := NewToken("eigeen") + err := ValidateLogin(tokenString) + if err == nil { + t.Log("验证通过") + } else { + t.Error(err) + } +} diff --git a/pkg/controller/usersController.go b/pkg/controller/usersController.go index 441ba1f..5aecee2 100644 --- a/pkg/controller/usersController.go +++ b/pkg/controller/usersController.go @@ -25,7 +25,7 @@ func UserProfile(ctx iris.Context) { return } - var req dto.QueryUser + var req dto.QueryUserParams err = json.Unmarshal(body, &req) if err != nil { return diff --git a/pkg/dto/response.go b/pkg/dto/response.go index efcd443..1623739 100644 --- a/pkg/dto/response.go +++ b/pkg/dto/response.go @@ -31,7 +31,7 @@ func (r *Response) Success(data interface{}) { } // 失败 统一处理 -func (r *Response) Error(code int32, msg string) { +func (r *Response) Error(code int, msg string) { res := serializer.Response{ Code: code, Msg: msg, @@ -45,15 +45,11 @@ func (r *Response) Error(code int32, msg string) { } // 参数类型错误 -func (r *Response) ErrInvalidParamType() (err error) { - res := serializer.Response{ - Code: http.StatusBadRequest, - Msg: "参数类型错误", - Data: nil, - } - _, err = r.Ctx.JSON(res) - if err != nil { - return err - } - return nil +func (r *Response) ErrBadRequest() { + r.Error(http.StatusBadRequest, "请求参数错误") +} + +// 未登录/未授权错误 +func (r *Response) ErrUnauthorized() { + r.Error(http.StatusUnauthorized, "未登录") } diff --git a/pkg/dto/user.go b/pkg/dto/user.go index b520686..3af2339 100644 --- a/pkg/dto/user.go +++ b/pkg/dto/user.go @@ -1,7 +1,7 @@ package dto import ( - "drive-linked/pkg/model" + "drive-linked/model" "github.com/jinzhu/copier" ) @@ -15,7 +15,7 @@ type UserProfile struct { Roles string `json:"roles"` } -type QueryUser struct { +type QueryUserParams struct { Method string `json:"method"` Value string `json:"value"` } diff --git a/pkg/middleware/auth.go b/pkg/middleware/auth.go index b6eda9f..ebd0312 100644 --- a/pkg/middleware/auth.go +++ b/pkg/middleware/auth.go @@ -2,15 +2,22 @@ package middleware import ( "drive-linked/pkg/common" + "drive-linked/pkg/dto" "github.com/kataras/iris/v12" ) func SignRequired(ctx iris.Context) { auth := ctx.GetHeader("Authorization") //TODO:更详细的判断,包括请求格式是否正确 + + // 验证token err := common.ValidateLogin(auth) if err == nil { ctx.Values().Set("logged_in", true) + ctx.Next() + } else { + ctx.Values().Set("logged_in", false) + resp := dto.NewResponse(ctx) + resp.ErrUnauthorized() } - ctx.Next() } diff --git a/pkg/serializer/response.go b/pkg/serializer/response.go index ff415a3..4574c5c 100644 --- a/pkg/serializer/response.go +++ b/pkg/serializer/response.go @@ -3,7 +3,7 @@ package serializer import "net/http" type Response struct { - Code int32 `json:"code"` + Code int `json:"code"` Msg string `json:"msg"` Data interface{} `json:"data"` } diff --git a/pkg/service/users.go b/pkg/service/users.go index 634a934..c59b756 100644 --- a/pkg/service/users.go +++ b/pkg/service/users.go @@ -2,8 +2,8 @@ package service import ( "database/sql" + "drive-linked/model" "drive-linked/pkg/dto" - "drive-linked/pkg/model" "drive-linked/pkg/serializer" "github.com/kataras/iris/v12" "net/http" diff --git a/router/router.go b/router/router.go index fd65718..c7dc997 100644 --- a/router/router.go +++ b/router/router.go @@ -17,6 +17,8 @@ func Router() *iris.Application { // v1 v1 := app.Party("/v1") v1.PartyFunc("/users", func(users iris.Party) { + // 需要登录 + users.Use(middleware.SignRequired) // 用户详细信息 users.Get("/profile/{name:string}", controller.UserProfile) users.Post("/profile", controller.UserProfile)