Açıklama Yok
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

token_auth_middleware.go 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package authbase
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strings"
  6. "time"
  7. "git.x2erp.com/qdy/go-base/config"
  8. "git.x2erp.com/qdy/go-base/ctx"
  9. "git.x2erp.com/qdy/go-base/util/jwt"
  10. )
  11. // TokenAuth 简化的Bearer认证中间件
  12. func TokenAuth(next http.Handler) http.Handler {
  13. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  14. // 1. 检查认证头
  15. authHeader := r.Header.Get("Authorization")
  16. if authHeader == "" {
  17. unauthorized(w, "缺少认证信息")
  18. return
  19. }
  20. // 2. 检查Basic格式
  21. if !strings.HasPrefix(authHeader, "Bearer ") {
  22. unauthorized(w, "认证格式错误,请使用Bearer认证")
  23. return
  24. }
  25. // 3. 解码凭证
  26. token := strings.TrimPrefix(authHeader, "Bearer ")
  27. // 验证JWT令牌
  28. claims, err := validToken(token)
  29. if err != nil {
  30. unauthorized(w, fmt.Sprintf("Invalid token: %v", err))
  31. }
  32. // 6. 创建请求上下文
  33. traceID := r.Header.Get("X-Trace-ID")
  34. if traceID == "" {
  35. // 生成简单的时间戳追踪ID
  36. traceID = time.Now().Format("20060102150405.000")
  37. }
  38. cfg := config.GetConfig()
  39. requestCtx := &ctx.RequestContext{
  40. ServiceName: cfg.GetServiceConfig().ServiceName,
  41. InstanceName: cfg.GetServiceConfig().InstanceName,
  42. TraceID: traceID,
  43. TenantID: claims.TenantID,
  44. UserID: claims.UserID,
  45. Username: claims.Username,
  46. ProjectID: claims.ProjectID,
  47. }
  48. // 7. 保存到请求
  49. r = ctx.SaveContext(r, requestCtx)
  50. // 8. 继续处理
  51. next.ServeHTTP(w, r)
  52. })
  53. }
  54. // 验证令牌(需要根据实际项目实现)
  55. func validToken(token string) (*jwt.Claims, error) {
  56. secretKey := config.GetServiceConfig().SecretKey
  57. //logger.Debug("secretKey:%s", secretKey)
  58. return jwt.ParseToken(token, secretKey)
  59. }