fish2018/pansou · error

username cannot be empty

Error message

username cannot be empty

What it means

GenerateToken validates its inputs before signing a JWT: an empty username is rejected because the resulting token would carry no usable identity. It returns a plain sentinel error before any claims are built.

Solutions

  1. Validate the login request body before calling GenerateToken and return 400 for empty username
  2. Check LoginHandler binding: ensure the username field is required (binding:"required" on the struct)
  3. Log the incoming request to confirm the field name matches what the client sends

Example fix

// before
token, err := util.GenerateToken(req.Username, secret, expiry)
// after
if strings.TrimSpace(req.Username) == "" {
    c.JSON(400, gin.H{"error": "username is required"})
    return
}
token, err := util.GenerateToken(req.Username, secret, expiry)
Defensive patterns

Strategy: validation

Validate before calling

if strings.TrimSpace(username) == "" { return errors.New("username required") }

Try / catch

token, err := util.GenerateToken(username, secret, expiry)
if err != nil {
    http.Error(w, "invalid login input", 400)
    return
}

Prevention

When it happens

Trigger: Calling util.GenerateToken("", secret, expiry), typically from LoginHandler when the login request body had an empty/missing username field.

Common situations: Client POSTs login JSON without the username field; frontend sends empty string; request binding defaults zero value; DB lookup returned an empty username.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


AI-assisted analysis of fish2018/pansou@beaa561337 (2026-09-07). Data as JSON: /api/errors/ed4935d65985fba4. Report an issue: GitHub.

Appendix: source

Thrown at util/jwt.go:19

package util

import (
	"errors"
	"time"

	"github.com/golang-jwt/jwt/v5"
)

// Claims JWT载荷结构
type Claims struct {
	Username string `json:"username"`
	jwt.RegisteredClaims
}

// GenerateToken 生成JWT token
func GenerateToken(username string, secret string, expiry time.Duration) (string, error) {
	if username == "" {
		return "", errors.New("username cannot be empty")
	}
	if secret == "" {
		return "", errors.New("secret cannot be empty")
	}

	expirationTime := time.Now().Add(expiry)
	claims := &Claims{
		Username: username,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(expirationTime),
			IssuedAt:  jwt.NewNumericDate(time.Now()),
			Issuer:    "pansou",
		},
	}

	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	return token.SignedString([]byte(secret))
}

View on GitHub (pinned to beaa561337)