github.com/stackdocker/rkt@v0.10.1-0.20151109095037-1aa827478248/Godeps/_workspace/src/google.golang.org/grpc/credentials/oauth/oauth.go (about) 1 /* 2 * 3 * Copyright 2015, Google Inc. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: 9 * 10 * * Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * * Redistributions in binary form must reproduce the above 13 * copyright notice, this list of conditions and the following disclaimer 14 * in the documentation and/or other materials provided with the 15 * distribution. 16 * * Neither the name of Google Inc. nor the names of its 17 * contributors may be used to endorse or promote products derived from 18 * this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 * 32 */ 33 34 // Package oauth implements gRPC credentials using OAuth. 35 package oauth 36 37 import ( 38 "fmt" 39 "io/ioutil" 40 41 "github.com/coreos/rkt/Godeps/_workspace/src/golang.org/x/net/context" 42 "github.com/coreos/rkt/Godeps/_workspace/src/google.golang.org/grpc/credentials" 43 "golang.org/x/oauth2" 44 "golang.org/x/oauth2/google" 45 "golang.org/x/oauth2/jwt" 46 ) 47 48 // TokenSource supplies credentials from an oauth2.TokenSource. 49 type TokenSource struct { 50 oauth2.TokenSource 51 } 52 53 // GetRequestMetadata gets the request metadata as a map from a TokenSource. 54 func (ts TokenSource) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { 55 token, err := ts.Token() 56 if err != nil { 57 return nil, err 58 } 59 return map[string]string{ 60 "authorization": token.TokenType + " " + token.AccessToken, 61 }, nil 62 } 63 64 func (ts TokenSource) RequireTransportSecurity() bool { 65 return true 66 } 67 68 type jwtAccess struct { 69 jsonKey []byte 70 } 71 72 func NewJWTAccessFromFile(keyFile string) (credentials.Credentials, error) { 73 jsonKey, err := ioutil.ReadFile(keyFile) 74 if err != nil { 75 return nil, fmt.Errorf("credentials: failed to read the service account key file: %v", err) 76 } 77 return NewJWTAccessFromKey(jsonKey) 78 } 79 80 func NewJWTAccessFromKey(jsonKey []byte) (credentials.Credentials, error) { 81 return jwtAccess{jsonKey}, nil 82 } 83 84 func (j jwtAccess) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { 85 ts, err := google.JWTAccessTokenSourceFromJSON(j.jsonKey, uri[0]) 86 if err != nil { 87 return nil, err 88 } 89 token, err := ts.Token() 90 if err != nil { 91 return nil, err 92 } 93 return map[string]string{ 94 "authorization": token.TokenType + " " + token.AccessToken, 95 }, nil 96 } 97 98 func (j jwtAccess) RequireTransportSecurity() bool { 99 return true 100 } 101 102 // oauthAccess supplies credentials from a given token. 103 type oauthAccess struct { 104 token oauth2.Token 105 } 106 107 // NewOauthAccess constructs the credentials using a given token. 108 func NewOauthAccess(token *oauth2.Token) credentials.Credentials { 109 return oauthAccess{token: *token} 110 } 111 112 func (oa oauthAccess) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { 113 return map[string]string{ 114 "authorization": oa.token.TokenType + " " + oa.token.AccessToken, 115 }, nil 116 } 117 118 func (oa oauthAccess) RequireTransportSecurity() bool { 119 return true 120 } 121 122 // NewComputeEngine constructs the credentials that fetches access tokens from 123 // Google Compute Engine (GCE)'s metadata server. It is only valid to use this 124 // if your program is running on a GCE instance. 125 // TODO(dsymonds): Deprecate and remove this. 126 func NewComputeEngine() credentials.Credentials { 127 return TokenSource{google.ComputeTokenSource("")} 128 } 129 130 // serviceAccount represents credentials via JWT signing key. 131 type serviceAccount struct { 132 config *jwt.Config 133 } 134 135 func (s serviceAccount) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { 136 token, err := s.config.TokenSource(ctx).Token() 137 if err != nil { 138 return nil, err 139 } 140 return map[string]string{ 141 "authorization": token.TokenType + " " + token.AccessToken, 142 }, nil 143 } 144 145 func (s serviceAccount) RequireTransportSecurity() bool { 146 return true 147 } 148 149 // NewServiceAccountFromKey constructs the credentials using the JSON key slice 150 // from a Google Developers service account. 151 func NewServiceAccountFromKey(jsonKey []byte, scope ...string) (credentials.Credentials, error) { 152 config, err := google.JWTConfigFromJSON(jsonKey, scope...) 153 if err != nil { 154 return nil, err 155 } 156 return serviceAccount{config: config}, nil 157 } 158 159 // NewServiceAccountFromFile constructs the credentials using the JSON key file 160 // of a Google Developers service account. 161 func NewServiceAccountFromFile(keyFile string, scope ...string) (credentials.Credentials, error) { 162 jsonKey, err := ioutil.ReadFile(keyFile) 163 if err != nil { 164 return nil, fmt.Errorf("credentials: failed to read the service account key file: %v", err) 165 } 166 return NewServiceAccountFromKey(jsonKey, scope...) 167 } 168 169 // NewApplicationDefault returns "Application Default Credentials". For more 170 // detail, see https://developers.google.com/accounts/docs/application-default-credentials. 171 func NewApplicationDefault(ctx context.Context, scope ...string) (credentials.Credentials, error) { 172 t, err := google.DefaultTokenSource(ctx, scope...) 173 if err != nil { 174 return nil, err 175 } 176 return TokenSource{t}, nil 177 }