Echo中間件使用


1.Echo中使用鏈路追蹤

    // 1.) 使用自定義中間件
    e.Use(Opentracing)

    // 2.) opentracing中間件
    func Opentracing(next echo.HandlerFunc) echo.HandlerFunc {
        	return func(c echo.Context) error {
        		ctx, span, err := trace.TraceFromHeader(context.Background(),"api:"+c.Request().URL.Path,c.Request().Header)
        		if err == nil {
        			defer span.Finish()
        			c.Set(cinit.TRACE_CONTEXT, ctx)
        		} else {
        			c.Set(cinit.TRACE_CONTEXT, context.Background())
        		}
        		return next(c)
        	}
    }
    
    // 3.opentracing從header獲取,寫入context,適用獲取http
    func TraceFromHeader(ctx context.Context, name string, header http.Header) (context.Context, opentracing.Span, error) {
    	   return traceFromHeaderByGlobalTracer(ctx, opentracing.GlobalTracer(), name, header)
    }
    
    //4.具體的方法實現
    func traceFromHeaderByGlobalTracer(ctx context.Context, tracer opentracing.Tracer, name string, header http.Header) (context.Context, opentracing.Span, error) {
        	var sp opentracing.Span
        	wireContext, err := tracer.Extract(opentracing.TextMap, opentracing.HTTPHeadersCarrier(header))
        	if err != nil {
        		sp = tracer.StartSpan(name)
        	} else {
        		sp = tracer.StartSpan(name, opentracing.ChildOf(wireContext))
        	}
        	md, ok := metadata.FromContext(ctx)
        	if !ok {
        		md = make(map[string]string)
        	}
        	if err := sp.Tracer().Inject(sp.Context(), opentracing.TextMap, opentracing.TextMapCarrier(md)); err != nil {
        		return nil, nil, err
        	}
        	ctx, sp = tag(ctx, sp)
        	ctx = metadata.NewContext(ctx, md)
        	return ctx, sp, nil
}

2.Echo 中使用JWT,驗證token

g1 := e.Group("/common/v1", JWT)

//驗證jwt
func JWT(next echo.HandlerFunc) echo.HandlerFunc {
	return func(c echo.Context) error {
		//從請求頭獲取token信息
		jwtString := c.Request().Header.Get(cinit.JWT_NAME)
		//log.Debug(jwtString, ctx)
		//解析JWT
		auths := strings.Split(jwtString, " ")
		if strings.ToUpper(auths[0]) != "BEARER" || auths[1] == " " {
			return HandleError(c, ReqNoAllow, "token驗證失敗")
		}
		jwtmsg, err := jwt.Decode(strings.Trim(auths[1], " ")) // Decode具體實現見下方代碼
		if err != nil {
			log.Info(err.Error(), ctx)
			return HandleError(c, ReqNoAllow, "token驗證失敗")
		}
		c.Set(cinit.JWT_MSG, jwtmsg)
		return next(c)
	}
}

// 解密Token
func Decode(tokenString string) (JWTMsg, error) {
	// Parse the token
	token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
		return secret, nil
	})
	if err != nil {
		return JWTMsg{}, err
	}
	// Validate the token and return the custom claims
	if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
		return claims.JWTMsg, nil
	} else {
		return JWTMsg{}, err
	}
}

  1. JWT詳解
// token生成:由三部分組成,header,payload,secret
token = HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),  
  your-256-bit-secret
)

header:
{
  "alg": "HS256",
  "typ": "JWT"
}

payload:
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

4.JWT驗證網站:
https://jwt.io/
https://jwt.io/introduction/
https://zhuanlan.zhihu.com/p/27370773


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM