func WithUser(ctx context.Context, a AuthenticatedUser) context.Context {
	return context.WithValue(ctx, ctxAuthUserInfo{}, a)
}
WithUser adds authenticated user into to ctx.
package auth
import (
	"context"
	grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth"
	"go.opentelemetry.io/otel/attribute"
	"go.opentelemetry.io/otel/trace"
)
type ctxAuthUserInfo struct{}  
type AuthenticatedUser interface {
	DBKey() string
	DisplayName() string
	ProfileURL() string
}
type Authenticator interface {
	Authenticate(rpcCtx context.Context) (AuthenticatedUser, error)
}
func AuthenticatingInterceptor(a Authenticator) grpc_auth.AuthFunc {
	return func(rpcCtx context.Context) (context.Context, error) {
		user, err := a.Authenticate(rpcCtx)
		if err != nil {
			return rpcCtx, err
		}
		if span := trace.SpanFromContext(rpcCtx); span != nil {
			span.SetAttributes(attribute.String("user.id", user.DBKey()))
		}
		ctx := WithUser(rpcCtx, user)
		return ctx, nil
	}
}
func AuthInfoFromContext(ctx context.Context) AuthenticatedUser {
	v := ctx.Value(ctxAuthUserInfo{})
	if v == nil {
		return nil
	}
	return v.(AuthenticatedUser)
}