From dc1b158afc1eccc388c3e58dc972ca9cb823ef1d Mon Sep 17 00:00:00 2001 From: marvzhang Date: Mon, 20 Apr 2020 11:43:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5API=20Token=E5=90=8E=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/main.go | 6 +++ backend/middlewares/auth.go | 10 +---- backend/model/token.go | 80 +++++++++++++++++++++++++++++++++++++ backend/routes/token.go | 68 +++++++++++++++++++++++++++++++ 4 files changed, 156 insertions(+), 8 deletions(-) create mode 100644 backend/model/token.go create mode 100644 backend/routes/token.go diff --git a/backend/main.go b/backend/main.go index ee53165a..6ab022f4 100644 --- a/backend/main.go +++ b/backend/main.go @@ -275,6 +275,12 @@ func main() { authGroup.PUT("/actions", routes.PutAction) // 新增操作 //authGroup.POST("/actions/:id", routes.PostAction) // 修改操作 } + // API Token + { + authGroup.GET("/tokens", routes.GetTokens) // 获取 Tokens + authGroup.PUT("/tokens", routes.PutToken) // 添加 Token + authGroup.DELETE("/tokens/:id", routes.DeleteToken) // 删除 Token + } // 统计数据 authGroup.GET("/stats/home", routes.GetHomeStats) // 首页统计数据 // 文件 diff --git a/backend/middlewares/auth.go b/backend/middlewares/auth.go index 07249e82..8ab27728 100644 --- a/backend/middlewares/auth.go +++ b/backend/middlewares/auth.go @@ -11,14 +11,6 @@ import ( func AuthorizationMiddleware() gin.HandlerFunc { return func(c *gin.Context) { - // 如果为登录或注册,不用校验 - //if c.Request.URL.Path == "/login" || - // (c.Request.URL.Path == "/users" && c.Request.Method == "PUT") || - // strings.HasSuffix(c.Request.URL.Path, "download") { - // c.Next() - // return - //} - // 获取token string tokenStr := c.GetHeader("Authorization") @@ -46,6 +38,8 @@ func AuthorizationMiddleware() gin.HandlerFunc { return } } + + // 设置用户 c.Set(constants.ContextUser, &user) // 校验成功 diff --git a/backend/model/token.go b/backend/model/token.go new file mode 100644 index 00000000..b5763866 --- /dev/null +++ b/backend/model/token.go @@ -0,0 +1,80 @@ +package model + +import ( + "crawlab/database" + "github.com/apex/log" + "github.com/globalsign/mgo/bson" + "runtime/debug" + "time" +) + +type Token struct { + Id bson.ObjectId `json:"_id" bson:"_id"` + Token string `json:"token" bson:"token"` + UserId bson.ObjectId `json:"user_id" bson:"user_id"` + CreateTs time.Time `json:"create_ts" bson:"create_ts"` + UpdateTs time.Time `json:"update_ts" bson:"update_ts"` +} + +func (t *Token) Add() error { + s, c := database.GetCol("tokens") + defer s.Close() + + if err := c.Insert(t); err != nil { + log.Errorf("insert token error: " + err.Error()) + debug.PrintStack() + return err + } + + return nil +} + +func (t *Token) Delete() error { + s, c := database.GetCol("tokens") + defer s.Close() + + if err := c.RemoveId(t.Id); err != nil { + log.Errorf("insert token error: " + err.Error()) + debug.PrintStack() + return err + } + + return nil +} + +func GetTokenById(id bson.ObjectId) (t Token, err error) { + s, c := database.GetCol("tokens") + defer s.Close() + + if err = c.FindId(id).One(&t); err != nil { + return t, err + } + + return t, nil +} + +func GetTokensByUserId(uid bson.ObjectId) (tokens []Token, err error) { + s, c := database.GetCol("tokens") + defer s.Close() + + if err = c.Find(bson.M{"user_id": uid}).All(&tokens); err != nil { + log.Errorf("find tokens error: " + err.Error()) + debug.PrintStack() + return tokens, err + } + + return tokens, nil +} + +func DeleteTokenById(id bson.ObjectId) error { + t, err := GetTokenById(id) + if err != nil { + return err + } + + if err := t.Delete(); err != nil { + return err + } + + return nil +} diff --git a/backend/routes/token.go b/backend/routes/token.go new file mode 100644 index 00000000..57ad5990 --- /dev/null +++ b/backend/routes/token.go @@ -0,0 +1,68 @@ +package routes + +import ( + "crawlab/model" + "crawlab/services" + "github.com/gin-gonic/gin" + "github.com/globalsign/mgo/bson" + "net/http" + "time" +) + +func GetTokens(c *gin.Context) { + u := services.GetCurrentUser(c) + + tokens, err := model.GetTokensByUserId(u.Id) + if err != nil { + HandleError(http.StatusInternalServerError, c, err) + return + } + + c.JSON(http.StatusOK, Response{ + Status: "ok", + Message: "success", + Data: tokens, + }) +} + +func PutToken(c *gin.Context) { + u := services.GetCurrentUser(c) + + tokenStr, err := services.MakeToken(u) + if err != nil { + HandleError(http.StatusInternalServerError, c, err) + return + } + + t := model.Token{ + Id: bson.NewObjectId(), + Token: tokenStr, + UserId: u.Id, + CreateTs: time.Now(), + UpdateTs: time.Now(), + } + + if err := t.Add(); err != nil { + HandleError(http.StatusInternalServerError, c, err) + return + } + + c.JSON(http.StatusOK, Response{ + Status: "ok", + Message: "success", + }) +} + +func DeleteToken(c *gin.Context) { + id := c.Param("id") + + if err := model.DeleteTokenById(bson.ObjectIdHex(id)); err != nil { + HandleError(http.StatusInternalServerError, c, err) + return + } + + c.JSON(http.StatusOK, Response{ + Status: "ok", + Message: "success", + }) +}