func bearerToken()

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
}