users_account.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package users
  2. import (
  3. "context"
  4. "time"
  5. "github.com/gogf/gf/v2/errors/gerror"
  6. "github.com/gogf/gf/v2/frame/g"
  7. "github.com/golang-jwt/jwt/v5"
  8. "star/internal/consts"
  9. "star/internal/dao"
  10. "star/internal/model/entity"
  11. )
  12. type jwtClaims struct {
  13. Id uint
  14. Username string
  15. jwt.RegisteredClaims
  16. }
  17. func (u *Users) Login(ctx context.Context, username, password string) (tokenString string, err error) {
  18. var user entity.Users
  19. err = dao.Users.Ctx(ctx).Where("username", username).Scan(&user)
  20. if err != nil {
  21. return "", gerror.New("用户名或密码错误")
  22. }
  23. if user.Id == 0 {
  24. return "", gerror.New("用户不存在")
  25. }
  26. // 将密码加密后与数据库中的密码进行比对
  27. if user.Password != u.encryptPassword(password) {
  28. return "", gerror.New("用户名或密码错误")
  29. }
  30. // 生成token
  31. uc := &jwtClaims{
  32. Id: user.Id,
  33. Username: user.Username,
  34. RegisteredClaims: jwt.RegisteredClaims{
  35. ExpiresAt: jwt.NewNumericDate(time.Now().Add(6 * time.Hour)),
  36. },
  37. }
  38. token := jwt.NewWithClaims(jwt.SigningMethodHS256, uc)
  39. return token.SignedString([]byte(consts.JwtKey))
  40. }
  41. func (u *Users) Info(ctx context.Context) (user *entity.Users, err error) {
  42. tokenString := g.RequestFromCtx(ctx).Request.Header.Get("Authorization")
  43. tokenClaims, _ := jwt.ParseWithClaims(tokenString, &jwtClaims{}, func(token *jwt.Token) (interface{}, error) {
  44. return []byte(consts.JwtKey), nil
  45. })
  46. if claims, ok := tokenClaims.Claims.(*jwtClaims); ok && tokenClaims.Valid {
  47. err = dao.Users.Ctx(ctx).Where("id", claims.Id).Scan(&user)
  48. }
  49. return
  50. }
  51. func (u *Users) GetUid(ctx context.Context) (uint, error) {
  52. user, err := u.Info(ctx)
  53. if err != nil {
  54. return 0, err
  55. }
  56. return user.Id, nil
  57. }