plugin/token_source.go (48 lines of code) (raw):

// Copyright 2019 The Kubernetes Authors. // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package plugin import ( "context" "encoding/json" "net/http" "strings" "time" "golang.org/x/oauth2" "golang.org/x/oauth2/google" "google.golang.org/api/googleapi" ) // altTokenSource is the structure holding the data for the functionality needed to generates tokens type altTokenSource struct { oauthClient *http.Client tokenURL string tokenBody string } // Token returns a token which may be used for authentication func (a *altTokenSource) Token() (*oauth2.Token, error) { req, err := http.NewRequest("POST", a.tokenURL, strings.NewReader(a.tokenBody)) if err != nil { return nil, err } res, err := a.oauthClient.Do(req) if err != nil { return nil, err } defer res.Body.Close() if err := googleapi.CheckResponse(res); err != nil { return nil, err } var tok struct { AccessToken string `json:"accessToken"` ExpireTime time.Time `json:"expireTime"` } if err := json.NewDecoder(res.Body).Decode(&tok); err != nil { return nil, err } return &oauth2.Token{ AccessToken: tok.AccessToken, Expiry: tok.ExpireTime, }, nil } // newAltTokenSource constructs a new alternate token source for generating tokens. func newAltTokenSource(ctx context.Context, tokenURL, tokenBody string) oauth2.TokenSource { return &altTokenSource{ oauthClient: oauth2.NewClient(ctx, google.ComputeTokenSource("")), tokenURL: tokenURL, tokenBody: tokenBody, } }