Files
crawlab/backend/services/user.go
yaziming 81f6cf021f Backend:
improve
     - AuthMiddleware 注入当前用户的信息
     - 增加Context服务支持快捷获取当前登录者信息
     - 重构Login/GetMe接口逻辑避免重复的数据库查询
     - 规范化error信息声明(向下兼容,旧代码可逐渐迁移规范化)
     - 修正部分不符合规范的代码
2019-08-31 21:26:56 +08:00

96 lines
2.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package services
import (
"crawlab/constants"
"crawlab/model"
"crawlab/utils"
"errors"
"github.com/dgrijalva/jwt-go"
"github.com/globalsign/mgo/bson"
"github.com/spf13/viper"
"time"
)
func InitUserService() error {
adminUser := model.User{
Username: "admin",
Password: utils.EncryptPassword("admin"),
Role: constants.RoleAdmin,
}
if err := adminUser.Add(); err != nil {
// pass
}
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
}