9 "google.golang.org/grpc/metadata"
11 "github.com/go-kit/kit/transport/grpc"
12 "github.com/go-kit/kit/transport/http"
16 bearer string = "bearer"
17 bearerFormat string = "Bearer %s"
20 // HTTPToContext moves a JWT from request header to context. Particularly
21 // useful for servers.
22 func HTTPToContext() http.RequestFunc {
23 return func(ctx context.Context, r *stdhttp.Request) context.Context {
24 token, ok := extractTokenFromAuthHeader(r.Header.Get("Authorization"))
29 return context.WithValue(ctx, JWTTokenContextKey, token)
33 // ContextToHTTP moves a JWT from context to request header. Particularly
34 // useful for clients.
35 func ContextToHTTP() http.RequestFunc {
36 return func(ctx context.Context, r *stdhttp.Request) context.Context {
37 token, ok := ctx.Value(JWTTokenContextKey).(string)
39 r.Header.Add("Authorization", generateAuthHeaderFromToken(token))
45 // GRPCToContext moves a JWT from grpc metadata to context. Particularly
46 // userful for servers.
47 func GRPCToContext() grpc.ServerRequestFunc {
48 return func(ctx context.Context, md metadata.MD) context.Context {
49 // capital "Key" is illegal in HTTP/2.
50 authHeader, ok := md["authorization"]
55 token, ok := extractTokenFromAuthHeader(authHeader[0])
57 ctx = context.WithValue(ctx, JWTTokenContextKey, token)
64 // ContextToGRPC moves a JWT from context to grpc metadata. Particularly
65 // useful for clients.
66 func ContextToGRPC() grpc.ClientRequestFunc {
67 return func(ctx context.Context, md *metadata.MD) context.Context {
68 token, ok := ctx.Value(JWTTokenContextKey).(string)
70 // capital "Key" is illegal in HTTP/2.
71 (*md)["authorization"] = []string{generateAuthHeaderFromToken(token)}
78 func extractTokenFromAuthHeader(val string) (token string, ok bool) {
79 authHeaderParts := strings.Split(val, " ")
80 if len(authHeaderParts) != 2 || strings.ToLower(authHeaderParts[0]) != bearer {
84 return authHeaderParts[1], true
87 func generateAuthHeaderFromToken(token string) string {
88 return fmt.Sprintf(bearerFormat, token)