@@ -2,16 +2,32 @@ package gcp
2
2
3
3
import (
4
4
"context"
5
+ "encoding/json"
5
6
"io/ioutil"
6
7
"net/http"
7
8
8
9
"github.com/pkg/errors"
10
+ "golang.org/x/oauth2/google"
11
+ iam "google.golang.org/api/iam/v1"
9
12
)
10
13
11
14
// GetDefaultEmail is a helper method for users on GCE or the 2nd generation GAE
12
15
// environment.
13
16
func GetDefaultEmail (ctx context.Context , addr string , hc * http.Client ) (string , error ) {
14
- email , err := metadataGet (ctx , addr , hc , "instance/service-accounts/default/email" )
17
+ creds , err := findDefaultCredentials (ctx , iam .CloudPlatformScope )
18
+ if err != nil {
19
+ return "" , errors .Wrap (err , "unable to find credentials to sign JWT" )
20
+ }
21
+
22
+ email , err := getEmailFromCredentials (creds )
23
+ if err != nil {
24
+ return "" , errors .Wrap (err , "unable to get email from given credentials" )
25
+ }
26
+ if email != "" {
27
+ return email , nil
28
+ }
29
+
30
+ email , err = metadataGet (ctx , addr , hc , "instance/service-accounts/default/email" )
15
31
return email , errors .Wrap (err , "unable to get default email from metadata" )
16
32
}
17
33
@@ -39,3 +55,19 @@ func metadataGet(ctx context.Context, addr string, hc *http.Client, suffix strin
39
55
tkn , err := ioutil .ReadAll (resp .Body )
40
56
return string (tkn ), errors .Wrap (err , "unable to read metadata response" )
41
57
}
58
+
59
+ var findDefaultCredentials = google .FindDefaultCredentials
60
+
61
+ func getEmailFromCredentials (creds * google.Credentials ) (string , error ) {
62
+ if len (creds .JSON ) == 0 {
63
+ return "" , nil
64
+ }
65
+
66
+ var data map [string ]string
67
+ err := json .Unmarshal (creds .JSON , & data )
68
+ if err != nil {
69
+ return "" , errors .Wrap (err , "unable to parse credentials" )
70
+ }
71
+
72
+ return data ["client_email" ], nil
73
+ }
0 commit comments