-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
main.go
111 lines (100 loc) · 3.71 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
*
* Copyright 2015, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
package main
import (
"context"
"flag"
"fmt"
"io/ioutil"
"log"
"golang.org/x/oauth2/google"
"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
"google.golang.org/grpc/metadata"
)
const defaultName = "world"
var (
addr = flag.String("addr", "127.0.0.1:50051", "Address of grpc server.")
key = flag.String("api-key", "", "API key.")
token = flag.String("token", "", "Authentication token.")
keyfile = flag.String("keyfile", "", "Path to a Google service account key file.")
audience = flag.String("audience", "", "Audience.")
)
func main() {
flag.Parse()
// Set up a connection to the server.
conn, err := grpc.Dial(*addr, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
if *keyfile != "" {
log.Printf("Authenticating using Google service account key in %s", *keyfile)
keyBytes, err := ioutil.ReadFile(*keyfile)
if err != nil {
log.Fatalf("Unable to read service account key file %s: %v", *keyfile, err)
}
tokenSource, err := google.JWTAccessTokenSourceFromJSON(keyBytes, *audience)
if err != nil {
log.Fatalf("Error building JWT access token source: %v", err)
}
jwt, err := tokenSource.Token()
if err != nil {
log.Fatalf("Unable to generate JWT token: %v", err)
}
*token = jwt.AccessToken
// NOTE: the generated JWT token has a 1h TTL.
// Make sure to refresh the token before it expires by calling TokenSource.Token() for each outgoing requests.
// Calls to this particular implementation of TokenSource.Token() are cheap.
}
ctx := context.Background()
if *key != "" {
log.Printf("Using API key: %s", *key)
ctx = metadata.AppendToOutgoingContext(ctx, "x-api-key", *key)
}
if *token != "" {
log.Printf("Using authentication token: %s", *token)
ctx = metadata.AppendToOutgoingContext(ctx, "Authorization", fmt.Sprintf("Bearer %s", *token))
}
// Contact the server and print out its response.
name := defaultName
if len(flag.Args()) > 0 {
name = flag.Arg(0)
}
r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)
}