package auth import ( "nixcn-cms/data" "nixcn-cms/internal/exception" "nixcn-cms/pkgs/authcode" "nixcn-cms/pkgs/authtoken" "nixcn-cms/utils" "github.com/gin-gonic/gin" "github.com/spf13/viper" ) type TokenRequest struct { Code string `json:"code"` } func Token(c *gin.Context) { var req TokenRequest err := c.ShouldBindJSON(&req) if err != nil { errorCode := new(exception.Builder). SetStatus(exception.StatusClient). SetService(exception.ServiceAuth). SetEndpoint(exception.EndpointAuthServiceToken). SetType(exception.TypeCommon). SetOriginal(exception.CommonErrorInvalidInput). SetError(err). Build() utils.HttpResponse(c, 400, errorCode) return } authCode, ok := authcode.VerifyAuthCode(req.Code) if !ok { errorCode := new(exception.Builder). SetStatus(exception.StatusClient). SetService(exception.ServiceAuth). SetEndpoint(exception.EndpointAuthServiceToken). SetType(exception.TypeSpecific). SetOriginal(exception.AuthTokenInvalidToken). Build() utils.HttpResponse(c, 403, errorCode) return } userData := new(data.User) user, err := userData.GetByEmail(authCode.Email) if err != nil { errorCode := new(exception.Builder). SetStatus(exception.StatusServer). SetService(exception.ServiceAuth). SetEndpoint(exception.EndpointAuthServiceToken). SetType(exception.TypeCommon). SetOriginal(exception.CommonErrorInternal). SetError(err). Build() utils.HttpResponse(c, 500, errorCode) return } // Generate jwt JwtTool := authtoken.Token{ Application: viper.GetString("server.application"), } accessToken, refreshToken, err := JwtTool.IssueTokens(authCode.ClientId, user.UserId) if err != nil { errorCode := new(exception.Builder). SetStatus(exception.StatusServer). SetService(exception.ServiceAuth). SetEndpoint(exception.EndpointAuthServiceToken). SetType(exception.TypeSpecific). SetOriginal(exception.AuthTokenGenFailed). SetError(err). Build() utils.HttpResponse(c, 500, errorCode) return } tokenResp := struct { AccessToken string `json:"access_token"` RefreshToken string `json:"refresh_token"` }{accessToken, refreshToken} utils.HttpResponse(c, 200, "", "success", tokenResp) }