...
1
18
19
20 package google
21
22 import (
23 "context"
24 "fmt"
25 "time"
26
27 "google.golang.org/grpc/credentials"
28 "google.golang.org/grpc/credentials/alts"
29 "google.golang.org/grpc/credentials/oauth"
30 "google.golang.org/grpc/grpclog"
31 "google.golang.org/grpc/internal"
32 )
33
34 const tokenRequestTimeout = 30 * time.Second
35
36 var logger = grpclog.Component("credentials")
37
38
39 type DefaultCredentialsOptions struct {
40
41 PerRPCCreds credentials.PerRPCCredentials
42 }
43
44
45
46
47
48 func NewDefaultCredentialsWithOptions(opts DefaultCredentialsOptions) credentials.Bundle {
49 if opts.PerRPCCreds == nil {
50 ctx, cancel := context.WithTimeout(context.Background(), tokenRequestTimeout)
51 defer cancel()
52 var err error
53 opts.PerRPCCreds, err = newADC(ctx)
54 if err != nil {
55 logger.Warningf("NewDefaultCredentialsWithOptions: failed to create application oauth: %v", err)
56 }
57 }
58 c := &creds{opts: opts}
59 bundle, err := c.NewWithMode(internal.CredsBundleModeFallback)
60 if err != nil {
61 logger.Warningf("NewDefaultCredentialsWithOptions: failed to create new creds: %v", err)
62 }
63 return bundle
64 }
65
66
67
68
69
70 func NewDefaultCredentials() credentials.Bundle {
71 return NewDefaultCredentialsWithOptions(DefaultCredentialsOptions{})
72 }
73
74
75
76
77
78
79 func NewComputeEngineCredentials() credentials.Bundle {
80 return NewDefaultCredentialsWithOptions(DefaultCredentialsOptions{
81 PerRPCCreds: oauth.NewComputeEngine(),
82 })
83 }
84
85
86 type creds struct {
87 opts DefaultCredentialsOptions
88
89
90 mode string
91
92 transportCreds credentials.TransportCredentials
93
94 perRPCCreds credentials.PerRPCCredentials
95 }
96
97 func (c *creds) TransportCredentials() credentials.TransportCredentials {
98 return c.transportCreds
99 }
100
101 func (c *creds) PerRPCCredentials() credentials.PerRPCCredentials {
102 if c == nil {
103 return nil
104 }
105 return c.perRPCCreds
106 }
107
108 var (
109 newTLS = func() credentials.TransportCredentials {
110 return credentials.NewTLS(nil)
111 }
112 newALTS = func() credentials.TransportCredentials {
113 return alts.NewClientCreds(alts.DefaultClientOptions())
114 }
115 newADC = func(ctx context.Context) (credentials.PerRPCCredentials, error) {
116 return oauth.NewApplicationDefault(ctx)
117 }
118 )
119
120
121
122 func (c *creds) NewWithMode(mode string) (credentials.Bundle, error) {
123 newCreds := &creds{
124 opts: c.opts,
125 mode: mode,
126 }
127
128
129 switch mode {
130 case internal.CredsBundleModeFallback:
131 newCreds.transportCreds = newClusterTransportCreds(newTLS(), newALTS())
132 case internal.CredsBundleModeBackendFromBalancer, internal.CredsBundleModeBalancer:
133
134
135 newCreds.transportCreds = newALTS()
136 default:
137 return nil, fmt.Errorf("unsupported mode: %v", mode)
138 }
139
140 if mode == internal.CredsBundleModeFallback || mode == internal.CredsBundleModeBackendFromBalancer {
141 newCreds.perRPCCreds = newCreds.opts.PerRPCCreds
142 }
143
144 return newCreds, nil
145 }
146
View as plain text