mirror of
https://github.com/crawlab-team/crawlab.git
synced 2026-01-22 17:31:03 +01:00
118 lines
2.6 KiB
Go
118 lines
2.6 KiB
Go
package services
|
||
|
||
import (
|
||
"crawlab/constants"
|
||
"crawlab/model"
|
||
"crawlab/utils"
|
||
"errors"
|
||
"github.com/dgrijalva/jwt-go"
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/globalsign/mgo/bson"
|
||
"github.com/spf13/viper"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
func InitUserService() error {
|
||
_ = CreateNewUser("admin", "admin", constants.RoleAdmin, "")
|
||
return nil
|
||
}
|
||
|
||
func MakeToken(user *model.User) (tokenStr string, err error) {
|
||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
|
||
"id": user.Id,
|
||
"username": user.Username,
|
||
"nbf": time.Now().Unix(),
|
||
})
|
||
|
||
return token.SignedString([]byte(viper.GetString("server.secret")))
|
||
|
||
}
|
||
|
||
//func GetToken(username string) (tokenStr string, err error) {
|
||
// user, err := model.GetUserByUsername(username)
|
||
// if err != nil {
|
||
// log.Errorf(err.Error())
|
||
// debug.PrintStack()
|
||
// return
|
||
// }
|
||
//
|
||
// token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
|
||
// "id": user.Id,
|
||
// "username": user.Username,
|
||
// "nbf": time.Now().Unix(),
|
||
// })
|
||
//
|
||
// tokenStr, err = token.SignedString([]byte(viper.GetString("server.secret")))
|
||
// if err != nil {
|
||
// return
|
||
// }
|
||
// return
|
||
//}
|
||
|
||
func SecretFunc() jwt.Keyfunc {
|
||
return func(token *jwt.Token) (interface{}, error) {
|
||
return []byte(viper.GetString("server.secret")), nil
|
||
}
|
||
}
|
||
|
||
func CheckToken(tokenStr string) (user model.User, err error) {
|
||
token, err := jwt.Parse(tokenStr, SecretFunc())
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
claim, ok := token.Claims.(jwt.MapClaims)
|
||
if !ok {
|
||
err = errors.New("cannot convert claim to mapclaim")
|
||
return
|
||
}
|
||
|
||
//验证token,如果token被修改过则为false
|
||
if !token.Valid {
|
||
err = errors.New("token is invalid")
|
||
return
|
||
}
|
||
|
||
id := bson.ObjectIdHex(claim["id"].(string))
|
||
username := claim["username"].(string)
|
||
user, err = model.GetUser(id)
|
||
if err != nil {
|
||
err = errors.New("cannot get user")
|
||
return
|
||
}
|
||
|
||
if username != user.Username {
|
||
err = errors.New("username does not match")
|
||
return
|
||
}
|
||
|
||
return
|
||
}
|
||
|
||
func CreateNewUser(username string, password string, role string, email string) error {
|
||
user := model.User{
|
||
Username: strings.ToLower(username),
|
||
Password: utils.EncryptPassword(password),
|
||
Role: role,
|
||
Email: email,
|
||
Setting: model.UserSetting{
|
||
NotificationTrigger: constants.NotificationTriggerNever,
|
||
EnabledNotifications: []string{
|
||
constants.NotificationTypeMail,
|
||
constants.NotificationTypeDingTalk,
|
||
constants.NotificationTypeWechat,
|
||
},
|
||
},
|
||
}
|
||
if err := user.Add(); err != nil {
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func GetCurrentUser(c *gin.Context) *model.User {
|
||
data, _ := c.Get("currentUser")
|
||
return data.(*model.User)
|
||
}
|