You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dashboard/handler/account/service.go

64 lines
1.7 KiB
Go

package account
import (
"time"
"github.com/dgrijalva/jwt-go"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/render"
"github.com/xpunch/go-micro-dashboard/config"
"github.com/xpunch/go-micro-dashboard/handler/route"
)
type service struct{}
func NewRouteRegistrar() route.Registrar {
return service{}
}
func (s service) RegisterRoute(router gin.IRoutes) {
router.POST("/api/login", s.Login)
}
type loginRequest struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
}
type loginResponse struct {
Token string `json:"token"`
}
// @Tags Account
// @ID account_login
// @Param input body loginRequest true "request"
// @Success 200 {object} loginResponse "success"
// @Failure 400 {object} string
// @Failure 401 {object} string
// @Failure 500 {object} string
// @Router /api/login [post]
func (s *service) Login(ctx *gin.Context) {
var req loginRequest
if err := ctx.ShouldBindJSON(&req); nil != err {
ctx.Render(400, render.String{Format: err.Error()})
return
}
if req.Username != config.GetServerConfig().Auth.Username ||
req.Password != config.GetServerConfig().Auth.Password {
ctx.Render(400, render.String{Format: "incorrect username or password"})
return
}
claims := jwt.StandardClaims{
Subject: req.Username,
IssuedAt: time.Now().Unix(),
ExpiresAt: time.Now().Add(config.GetAuthConfig().TokenExpiration).Unix(),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
signedToken, err := token.SignedString([]byte(config.GetAuthConfig().TokenSecret))
if err != nil {
ctx.Render(400, render.String{Format: err.Error()})
return
}
ctx.JSON(200, loginResponse{Token: signedToken})
}