in cmd/hub/api/login.go [135:214]
func bearerToken() string {
if hubApiBearerToken != "" && tokenTimeValid(hubApiBearerTokenExpTime) {
return hubApiBearerToken
}
if config.ApiLoginToken == "" {
log.Fatalf("Login token is not supplied - use `hub login` to obtain one")
}
cachedTokens, err := loadAccessToken(config.ApiBaseUrl, config.ApiLoginToken)
if err != nil {
util.Warn("Unable to load cached API access token (requesting new): %v", err)
}
if cachedTokens != nil {
code, resp, err := verifyAccessToken(cachedTokens.AccessToken)
if err != nil {
if code != 401 {
util.Warn("Unable to verify API access token (requesting new): %v", err)
}
} else {
if code == 200 {
if resp != nil {
exp := time.Unix(resp.Exp, 0)
if config.Debug {
log.Printf("API access token verified; expiry at %v", exp)
}
if tokenTimeValid(exp) {
hubApiBearerToken = cachedTokens.AccessToken
hubApiBearerTokenExpTime = exp
return hubApiBearerToken
}
if config.Debug {
log.Print("API access token must be refreshed")
}
}
} else if code != 401 {
util.Warn("Got %d HTTP while verifying API access token - expected 401 HTTP (requesting new)", code)
}
resp, err := refreshAccessToken(cachedTokens)
if err != nil {
util.Warn("Unable to refresh API access token (requesting new): %v", err)
}
if resp != nil {
exp := time.Unix(resp.Exp, 0)
if config.Debug {
log.Printf("API access token refreshed; expiry at %v", exp)
}
if !tokenTimeValid(exp) {
util.Warn("API refreshed token expiry too short %v", exp)
}
storeAccessToken(config.ApiBaseUrl, config.ApiLoginToken, resp)
if err != nil {
util.Warn("Unable to store API access token in cache: %v", err)
}
hubApiBearerToken = resp.AccessToken
hubApiBearerTokenExpTime = exp
return hubApiBearerToken
}
}
}
resp, err := loginWithToken(config.ApiBaseUrl, config.ApiLoginToken)
if err != nil {
log.Fatalf("Unable to login with token: %v", err)
}
exp := time.Unix(resp.Exp, 0)
if config.Debug {
log.Printf("New API access token obtained; expiry at %v", exp)
}
if !tokenTimeValid(exp) {
util.Warn("API token expiry too short %v", exp)
}
storeAccessToken(config.ApiBaseUrl, config.ApiLoginToken, resp)
if err != nil {
util.Warn("Unable to store API access token in cache: %v", err)
}
hubApiBearerToken = resp.AccessToken
hubApiBearerTokenExpTime = exp
return hubApiBearerToken
}