Эта структура команды кобры, кажется, решает проблему.
package cmd
import (
"github.com/IBM-Cloud/bluemix-go"
"github.com/IBM-Cloud/bluemix-go/authentication"
"github.com/IBM-Cloud/bluemix-go/rest"
"github.com/IBM-Cloud/bluemix-go/session"
"github.com/davecgh/go-spew/spew"
"github.com/spf13/cobra"
"log"
"os"
)
var (
debugFlag bool
region string
)
// tokenCmd represents the token command
var tokenCmd = &cobra.Command{
Use: "token",
Short: "Get an IBM Cloud IAM bearer token",
Long: `Generate an IAM token.`,
Run: tokenCmdExecute,
}
func init() {
rootCmd.AddCommand(tokenCmd)
// Cobra supports Persistent Flags which will work for this command
// and all subcommands
tokenCmd.PersistentFlags().BoolVarP(&debugFlag, "debug", "d", false, "Enable debug")
tokenCmd.PersistentFlags().StringVarP(®ion, "region", "r", "us-south", "IBM Cloud region to target")
}
func tokenCmdExecute(cmd *cobra.Command, args []string) {
// get the API key from the environment
apiKey := os.Getenv("BLUEMIX_API_KEY")
if apiKey == "" {
log.Fatal("No API key found: please specify a BLUEMIX_API_KEY environment variable containing the API key for your IBM Cloud account")
}
// create a session object that will generate an IAM token and cache it
cfg := &bluemix.Config{
BluemixAPIKey: apiKey,
Region: region,
Debug: debugFlag,
}
sess, err := session.New(cfg)
if err != nil {
log.Fatal(err)
}
iamClient, err := authentication.NewIAMAuthRepository(cfg, rest.NewClient())
if err != nil {
log.Fatal(err)
}
err = iamClient.AuthenticateAPIKey(sess.Config.BluemixAPIKey)
if err != nil {
log.Fatal(err)
}
log.Println(sess.Config.IAMAccessToken)
spew.Dump(sess.Config)
}
Области являются одним из набора;SDK выполняет поиск, чтобы найти подходящие конечные точки, и набор, который он поддерживает, - это регионы, в которых существует IBM Cloud.
Проблема заключалась в том, что в моей первой попытке я использовал клиент mccp, и это облачный API-интерфейс для нескольких облачных сред, использующий другой протокол кэширования аутентификации и конечной точки.