diff --git a/client/grpc/grpc.go b/client/grpc/grpc.go index 42e7101b..e1043afe 100644 --- a/client/grpc/grpc.go +++ b/client/grpc/grpc.go @@ -18,6 +18,7 @@ import ( "github.com/micro/go-micro/v2/errors" "github.com/micro/go-micro/v2/metadata" "github.com/micro/go-micro/v2/registry" + "github.com/micro/go-micro/v2/util/config" "google.golang.org/grpc" "google.golang.org/grpc/credentials" @@ -25,6 +26,10 @@ import ( gmetadata "google.golang.org/grpc/metadata" ) +var ( + BearerScheme = "Bearer " +) + type grpcClient struct { opts client.Options pool *pool @@ -128,6 +133,10 @@ func (g *grpcClient) call(ctx context.Context, node *registry.Node, req client.R header["timeout"] = fmt.Sprintf("%d", opts.RequestTimeout) // set the content type for the request header["x-content-type"] = req.ContentType() + // set the authorization token if one is saved locally + if token, err := config.Get("token"); err == nil && len(token) > 0 { + header["authorization"] = BearerScheme + token + } md := gmetadata.New(header) ctx = gmetadata.NewOutgoingContext(ctx, md) diff --git a/util/config/config.go b/util/config/config.go index 7286a04b..e0e85e37 100644 --- a/util/config/config.go +++ b/util/config/config.go @@ -9,39 +9,20 @@ import ( conf "github.com/micro/go-micro/v2/config" "github.com/micro/go-micro/v2/config/source/file" + "github.com/micro/go-micro/v2/util/log" ) // FileName for global micro config const FileName = ".micro" +// config is a singleton which is required to ensure +// each function call doesn't load the .micro file +// from disk +var config = newConfig() + // Get a value from the .micro file func Get(key string) (string, error) { - // get the filepath - fp, err := filePath() - if err != nil { - return "", err - } - - // create a new config - c, err := conf.NewConfig( - conf.WithSource( - file.NewSource( - file.WithPath(fp), - ), - ), - ) - if err != nil { - return "", err - } - - // load the config - if err := c.Load(); err != nil { - return "", err - } - - // set a value - tk := c.Get(key).String("") - + tk := config.Get(key).String("") return strings.TrimSpace(tk), nil } @@ -53,11 +34,36 @@ func Set(key, value string) error { return err } + // set the value + config.Set(value, key) + + // write to the file + return ioutil.WriteFile(fp, config.Bytes(), 0644) +} + +func filePath() (string, error) { + usr, err := user.Current() + if err != nil { + return "", err + } + return filepath.Join(usr.HomeDir, FileName), nil +} + +// newConfig returns a loaded config +func newConfig() conf.Config { + // get the filepath + fp, err := filePath() + if err != nil { + log.Error(err) + return conf.DefaultConfig + } + // write the file if it does not exist if _, err := os.Stat(fp); os.IsNotExist(err) { ioutil.WriteFile(fp, []byte{}, 0644) } else if err != nil { - return err + log.Error(err) + return conf.DefaultConfig } // create a new config @@ -69,25 +75,16 @@ func Set(key, value string) error { ), ) if err != nil { - return err + log.Error(err) + return conf.DefaultConfig } // load the config if err := c.Load(); err != nil { - return err + log.Error(err) + return conf.DefaultConfig } - // set a value - c.Set(value, key) - - // write the file - return ioutil.WriteFile(fp, c.Bytes(), 0644) -} - -func filePath() (string, error) { - usr, err := user.Current() - if err != nil { - return "", err - } - return filepath.Join(usr.HomeDir, FileName), nil + // return the conf + return c }