加入API Token后端

This commit is contained in:
marvzhang
2020-04-20 11:43:58 +08:00
parent 13803cdb35
commit dc1b158afc
4 changed files with 156 additions and 8 deletions

View File

@@ -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) // 首页统计数据
// 文件

View File

@@ -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)
// 校验成功

80
backend/model/token.go Normal file
View File

@@ -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
}

68
backend/routes/token.go Normal file
View File

@@ -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",
})
}