package auth import ( "errors" "testing" "hfb_sys/backend/internal/database" "hfb_sys/backend/internal/model" ) func TestUserTokenVersionRevokesAccessAndRefreshTokens(t *testing.T) { db := database.NewTestDB() user := model.User{Phone: "13900000001", Status: "active", TokenVersion: 1} if err := db.Create(&user).Error; err != nil { t.Fatalf("创建用户失败:%v", err) } repo := NewUserRepository(db) manager := NewJWTManager("test-secret") pair, err := manager.GenerateSubjectPairWithVersion(user.ID, user.Phone, "user", 1) if err != nil { t.Fatalf("生成令牌失败:%v", err) } _, err = repo.FindActiveForToken(t.Context(), user.ID, 1) if err != nil { t.Fatalf("有效令牌校验失败:%v", err) } if err := db.Model(&model.User{}).Where("id = ?", user.ID).Updates(map[string]any{ "status": "frozen", "token_version": 1, }).Error; err != nil { t.Fatalf("冻结用户失败:%v", err) } _, err = repo.FindActiveForToken(t.Context(), user.ID, 0) if !errors.Is(err, ErrUserDisabled) { t.Fatalf("冻结用户校验错误 = %v, want %v", err, ErrUserDisabled) } service := NewService(repo, nil, manager, nil, nil) _, err = service.RefreshToken(t.Context(), pair.RefreshToken) if !errors.Is(err, ErrUserDisabled) { t.Fatalf("冻结用户刷新错误 = %v, want %v", err, ErrUserDisabled) } // 解冻后版本仍然不同,冻结前签发的 token 不能恢复使用。 if err := db.Model(&model.User{}).Where("id = ?", user.ID).Updates(map[string]any{ "status": "active", "token_version": 2, }).Error; err != nil { t.Fatalf("解冻用户失败:%v", err) } _, err = repo.FindActiveForToken(t.Context(), user.ID, 0) if !errors.Is(err, ErrTokenVersionMismatch) { t.Fatalf("旧令牌版本校验错误 = %v, want %v", err, ErrTokenVersionMismatch) } _, err = repo.FindActiveForToken(t.Context(), user.ID, 2) if err != nil { t.Fatalf("新令牌版本校验失败:%v", err) } }