From 15d8210bd436651ba33eb02e4ddc7043844a93df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=85=8E=E9=A5=BC=E6=9E=9C=E5=AD=90=E5=8D=B7=E9=B2=A8?= =?UTF-8?q?=E9=B1=BC=E8=BE=A3=E6=A4=92?= Date: Wed, 1 Jan 2025 18:07:40 +0800 Subject: [PATCH] feat: enhance GenerateMachineID to include auth0|user_ prefix - Updated the GenerateMachineID function to generate a machine ID with the prefix "auth0|user_". - The random part of the ID is now 25 bytes, producing a 50-character hexadecimal string. - This change improves the uniqueness and format of generated machine IDs, aligning with authentication standards. --- pkg/idgen/generator.go | 19 +++++++++++++-- pkg/idgen/generator_test.go | 47 +++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 pkg/idgen/generator_test.go diff --git a/pkg/idgen/generator.go b/pkg/idgen/generator.go index 4a69341..1b68d83 100644 --- a/pkg/idgen/generator.go +++ b/pkg/idgen/generator.go @@ -35,10 +35,25 @@ func (g *Generator) generateRandomHex(length int) (string, error) { // Public methods // ------------- -// GenerateMachineID generates a new 32-byte machine ID +// GenerateMachineID generates a new machine ID with auth0|user_ prefix func (g *Generator) GenerateMachineID() (string, error) { g.simulateWork() - return g.generateRandomHex(32) + + // 生成随机部分 (25字节,将产生50个十六进制字符) + randomPart, err := g.generateRandomHex(25) + if err != nil { + return "", err + } + + // 构建完整的ID: "auth0|user_" + random + prefix := "auth0|user_" + fullID := fmt.Sprintf("%x%x%s", + []byte(prefix), // 转换前缀为十六进制 + []byte("0"), // 添加一个字符 + randomPart, // 随机部分 + ) + + return fullID, nil } // GenerateMacMachineID generates a new 64-byte MAC machine ID diff --git a/pkg/idgen/generator_test.go b/pkg/idgen/generator_test.go new file mode 100644 index 0000000..6fbb373 --- /dev/null +++ b/pkg/idgen/generator_test.go @@ -0,0 +1,47 @@ +package idgen + +import ( + "fmt" + "strings" + "testing" +) + +func TestGenerateMachineID(t *testing.T) { + g := NewGenerator() + + fmt.Println("\n=== 开始测试 MachineID 生成 ===") + + // 运行多次测试以确保一致性 + for i := 0; i < 10; i++ { + id, err := g.GenerateMachineID() + if err != nil { + t.Fatalf("生成ID时发生错误: %v", err) + } + + fmt.Printf("\n第 %d 次测试:\n", i+1) + fmt.Printf("生成的 ID: %s\n", id) + fmt.Printf("ID 长度: %d\n", len(id)) + fmt.Printf("前缀部分: %s\n", id[:20]) + fmt.Printf("随机部分: %s\n", id[20:]) + + // 测试1: 验证总长度 + if len(id) != 74 { + t.Errorf("ID长度不正确. 期望: 74, 实际: %d", len(id)) + } + + // 测试2: 验证前缀 + expectedPrefix := "61757468307c757365725f" // "auth0|user_" 的十六进制 + if !strings.HasPrefix(id, expectedPrefix) { + t.Errorf("ID前缀不正确.\n期望前缀: %s\n实际ID: %s", expectedPrefix, id) + } + + // 测试3: 验证十六进制格式 + for _, c := range id { + if !strings.ContainsRune("0123456789abcdef", c) { + t.Errorf("ID包含非十六进制字符: %c", c) + } + } + } + + fmt.Println("\n=== 测试完成 ===") +}