Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. package main
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "io"
  8. "net/http"
  9. "time"
  10. "git.x2erp.com/qdy/go-base/sdk/configure"
  11. )
  12. func main() {
  13. fmt.Println("=== 演示登录功能测试 ===")
  14. // 配置服务地址
  15. configureURL := "http://localhost:8080"
  16. svcCodeURL := "http://localhost:8020"
  17. fmt.Printf("配置中心地址: %s\n", configureURL)
  18. fmt.Printf("svc-code地址: %s\n", svcCodeURL)
  19. // 测试凭证
  20. userID := "test-user-001"
  21. password := "password123"
  22. fmt.Printf("\n使用测试用户: %s\n", userID)
  23. // 1. 直接使用SDK登录配置中心
  24. fmt.Println("\n--- 方法1: 直接使用SDK登录配置中心 ---")
  25. token1, err := loginWithSDK(configureURL, userID, password)
  26. if err != nil {
  27. fmt.Printf("SDK登录失败: %v\n", err)
  28. } else {
  29. fmt.Printf("✅ SDK登录成功!\n")
  30. fmt.Printf("Token (前100字符): %s...\n", token1[:min(100, len(token1))])
  31. fmt.Printf("Token长度: %d 字符\n", len(token1))
  32. // 验证token
  33. if err := validateTokenWithSDK(configureURL, token1); err != nil {
  34. fmt.Printf("Token验证失败: %v\n", err)
  35. } else {
  36. fmt.Printf("✅ Token验证通过\n")
  37. }
  38. }
  39. // 2. 通过svc-code API登录
  40. fmt.Println("\n--- 方法2: 通过svc-code API登录 ---")
  41. token2, err := loginWithAPI(svcCodeURL, userID, password)
  42. if err != nil {
  43. fmt.Printf("API登录失败: %v\n", err)
  44. } else {
  45. fmt.Printf("✅ API登录成功!\n")
  46. fmt.Printf("Token (前100字符): %s...\n", token2[:min(100, len(token2))])
  47. fmt.Printf("Token长度: %d 字符\n", len(token2))
  48. // 比较两个token是否相同
  49. if token1 != "" && token2 != "" {
  50. if token1 == token2 {
  51. fmt.Printf("✅ 两个方法返回的Token相同\n")
  52. } else {
  53. fmt.Printf("⚠️ 两个方法返回的Token不同(可能是不同的JWT有效期)\n")
  54. }
  55. }
  56. }
  57. // 3. 测试无效凭证
  58. fmt.Println("\n--- 测试无效凭证 ---")
  59. testInvalidCredentials(svcCodeURL)
  60. fmt.Println("\n=== 测试完成 ===")
  61. }
  62. // loginWithSDK 使用SDK直接登录配置中心
  63. func loginWithSDK(configureURL, userID, password string) (string, error) {
  64. // 创建SDK客户端
  65. client, err := configure.NewBasicAuthClient(configureURL, "test", "test")
  66. if err != nil {
  67. return "", fmt.Errorf("创建SDK客户端失败: %w", err)
  68. }
  69. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  70. defer cancel()
  71. req := &configure.UserLoginRequest{
  72. UserID: userID,
  73. Password: password,
  74. }
  75. startTime := time.Now()
  76. token, err := client.LoginUser(ctx, req)
  77. elapsed := time.Since(startTime)
  78. if err != nil {
  79. return "", fmt.Errorf("登录失败: %w (耗时: %v)", err, elapsed)
  80. }
  81. fmt.Printf("登录耗时: %v\n", elapsed)
  82. return token, nil
  83. }
  84. // validateTokenWithSDK 使用SDK验证token
  85. func validateTokenWithSDK(configureURL, token string) error {
  86. // 使用token创建配置中心客户端
  87. client, err := configure.NewTokenAuthClient(configureURL, token)
  88. if err != nil {
  89. return fmt.Errorf("创建Token客户端失败: %w", err)
  90. }
  91. fmt.Printf("Token客户端创建成功,BaseURL: %s\n", client.GetConfig().BaseURL)
  92. return nil
  93. }
  94. // loginWithAPI 通过svc-code API登录
  95. func loginWithAPI(svcCodeURL, userID, password string) (string, error) {
  96. client := &http.Client{
  97. Timeout: 30 * time.Second,
  98. }
  99. loginURL := fmt.Sprintf("%s/api/auth/login", svcCodeURL)
  100. loginData := map[string]string{
  101. "user_id": userID,
  102. "password": password,
  103. }
  104. loginJSON, err := json.Marshal(loginData)
  105. if err != nil {
  106. return "", fmt.Errorf("JSON序列化失败: %w", err)
  107. }
  108. startTime := time.Now()
  109. req, err := http.NewRequest("POST", loginURL, bytes.NewReader(loginJSON))
  110. if err != nil {
  111. return "", fmt.Errorf("创建HTTP请求失败: %w", err)
  112. }
  113. req.Header.Set("Content-Type", "application/json")
  114. resp, err := client.Do(req)
  115. if err != nil {
  116. return "", fmt.Errorf("发送登录请求失败: %w", err)
  117. }
  118. defer resp.Body.Close()
  119. elapsed := time.Since(startTime)
  120. fmt.Printf("API调用耗时: %v\n", elapsed)
  121. if resp.StatusCode != 200 {
  122. body, _ := io.ReadAll(resp.Body)
  123. return "", fmt.Errorf("API返回非200状态码: %d, 响应: %s", resp.StatusCode, string(body))
  124. }
  125. body, err := io.ReadAll(resp.Body)
  126. if err != nil {
  127. return "", fmt.Errorf("读取响应体失败: %w", err)
  128. }
  129. var result map[string]interface{}
  130. if err := json.Unmarshal(body, &result); err != nil {
  131. return "", fmt.Errorf("解析响应JSON失败: %w, 响应体: %s", err, string(body))
  132. }
  133. if !result["success"].(bool) {
  134. return "", fmt.Errorf("登录失败: %v", result)
  135. }
  136. token, ok := result["data"].(string)
  137. if !ok || token == "" {
  138. return "", fmt.Errorf("响应中未找到有效token: %v", result)
  139. }
  140. return token, nil
  141. }
  142. // testInvalidCredentials 测试无效凭证
  143. func testInvalidCredentials(svcCodeURL string) {
  144. client := &http.Client{
  145. Timeout: 10 * time.Second,
  146. }
  147. loginURL := fmt.Sprintf("%s/api/auth/login", svcCodeURL)
  148. invalidData := map[string]string{
  149. "user_id": "invalid-user",
  150. "password": "wrong-password",
  151. }
  152. invalidJSON, _ := json.Marshal(invalidData)
  153. resp, err := client.Post(loginURL, "application/json", bytes.NewReader(invalidJSON))
  154. if err != nil {
  155. fmt.Printf("无效凭证测试失败: %v\n", err)
  156. return
  157. }
  158. defer resp.Body.Close()
  159. body, _ := io.ReadAll(resp.Body)
  160. var result map[string]interface{}
  161. json.Unmarshal(body, &result)
  162. if !result["success"].(bool) {
  163. fmt.Printf("✅ 无效凭证登录失败(预期): %s\n", result["message"])
  164. } else {
  165. fmt.Printf("❌ 无效凭证登录不应该成功\n")
  166. }
  167. }
  168. // min 返回两个整数的最小值
  169. func min(a, b int) int {
  170. if a < b {
  171. return a
  172. }
  173. return b
  174. }