generate jwt

This commit is contained in:
yanghao05
2023-02-06 09:12:32 +08:00
parent afeffe2ed6
commit 0ddbeb3f7a
5 changed files with 89 additions and 16 deletions

View File

@@ -1,23 +1,48 @@
package controller
import (
"atom/modules/auth/dto"
"atom/modules/auth/service"
"atom/providers/config"
"atom/providers/jwt"
"github.com/gin-gonic/gin"
)
type UserController interface {
GetName(*gin.Context) (string, error)
Login(*gin.Context, dto.LoginRequestForm) (*dto.LoginResponse, error)
}
type userControllerImpl struct {
conf *config.Config
user service.UserService
jwt *jwt.JWT
}
func NewUserController(conf *config.Config) UserController {
return &userControllerImpl{conf: conf}
func NewUserController(
conf *config.Config,
user service.UserService,
jwt *jwt.JWT,
) UserController {
return &userControllerImpl{
conf: conf,
user: user,
jwt: jwt,
}
}
func (c *userControllerImpl) GetName(ctx *gin.Context) (string, error) {
return "User",nil
func (c *userControllerImpl) Login(ctx *gin.Context, req dto.LoginRequestForm) (*dto.LoginResponse, error) {
user, err := c.user.AuthMatchPassword(ctx, &req)
if err != nil {
return nil, err
}
token, err := c.user.GenerateJWTTokenFromUser(ctx, user)
if err != nil {
return nil, err
}
return &dto.LoginResponse{
Token: token,
}, nil
}

10
modules/auth/dto/user.go Normal file
View File

@@ -0,0 +1,10 @@
package dto
type LoginRequestForm struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
}
type LoginResponse struct {
Token string `json:"token,omitempty"`
}

View File

@@ -13,6 +13,7 @@ import (
type Route struct {
svc *http.Service
user controller.UserController
role controller.RoleController
permission controller.PermissionController
}
@@ -20,11 +21,13 @@ type Route struct {
func NewRoute(
svc *http.Service,
role controller.RoleController,
user controller.UserController,
permission controller.PermissionController,
) contracts.Route {
return &Route{
svc: svc,
role: role,
user: user,
permission: permission,
}
}
@@ -32,6 +35,12 @@ func NewRoute(
func (r *Route) Register() {
group := r.svc.Engine.Group("auth")
{
// common functions
group.GET("/login", gen.DataFunc1(
r.user.Login,
gen.BindBody(dto.LoginRequestForm{}, err.BindBodyFailed),
))
roleGroup := group.Group("roles")
{
roleGroup.GET("", gen.DataFunc2(

View File

@@ -1,26 +1,34 @@
package service
import (
"atom/database/models"
"atom/modules/auth/dao"
"atom/modules/auth/dto"
"atom/providers/jwt"
"context"
)
type UserService interface {
AttachRole(context.Context, int, int) error
AuthMatchPassword(context.Context, *dto.LoginRequestForm) (*models.User, error)
GenerateJWTTokenFromUser(context.Context, *models.User) (string, error)
}
type userService struct {
userRoleDao dao.UserRoleDao
userDao dao.UserDao
jwt *jwt.JWT
}
func NewUserService(
userRoleDao dao.UserRoleDao,
userDao dao.UserDao,
jwt *jwt.JWT,
) UserService {
return &userService{
userRoleDao: userRoleDao,
userDao: userDao,
jwt: jwt,
}
}
@@ -37,3 +45,24 @@ func (svc *userService) DetachRole(ctx context.Context, userID, roleID int) erro
}
return svc.userRoleDao.Delete(ctx, userID, roleID)
}
func (svc *userService) AuthMatchPassword(ctx context.Context, req *dto.LoginRequestForm) (*models.User, error) {
return &models.User{
ID: 10,
UUID: "1",
Username: "2",
Password: "3",
Nickname: "4",
Avatar: "5",
RoleID: 66,
}, nil
}
func (svc *userService) GenerateJWTTokenFromUser(ctx context.Context, user *models.User) (string, error) {
return svc.jwt.CreateToken(svc.jwt.CreateClaims(jwt.BaseClaims{
UUID: user.UUID,
UserID: user.ID,
Username: user.Username,
NickName: user.Nickname,
RoleID: user.RoleID,
}))
}