go-sdk icon indicating copy to clipboard operation
go-sdk copied to clipboard

Добавить в README разные примеры авторизации

Open konstesting opened this issue 1 year ago • 1 comments

Не у всех есть возможность использовать персональный oauth токен и приходится работать с Яндекс облаком через корпоративную (федеративную) учётную запись. В связи с этим прошу расширить пример авторизации в YandexCloud через SDK разными способами, чтобы другие люди могли сэкономить время.

Мой пример:

	oauthToken := flag.String("oauth-token", "", "")
	pathToServiceAccountKey := flag.String("path-to-service-account-key", "", "path/to/service-account-key.json")
	iamToken := flag.String("iam-token", "", "")
	flag.Parse()

	var creds ycsdk.Credentials
	if *oauthToken != "" {
		creds = ycsdk.OAuthToken(*oauthToken)
	} else if *iamToken != "" {
		creds = ycsdk.NewIAMTokenCredentials(*iamToken)
	} else if *pathToServiceAccountKey != "" {
		bytes, err := ioutil.ReadFile(*pathToServiceAccountKey)
		if err != nil {
			return fmt.Errorf("cant find service account json file: %w", err)
		}
		var SAKey iamkey.Key
		err = yaml.Unmarshal(bytes, &SAKey)
		if err != nil {
			return err
		}
		creds, err = ycsdk.ServiceAccountKey(&SAKey)
		if err != nil {
			return err
		}
	} else {
		return fmt.Errorf("error: oauth or iam token is not provided")
	}

	sdk, err := ycsdk.Build(ctx, ycsdk.Config{
		Credentials: creds,
	})
	if err != nil {
		log.Fatal("build creds error:", err)
	}

konstesting avatar Aug 02 '23 07:08 konstesting

С доками все так плохо, что пост @konstesting гугглится наряду с описаниями YC API. Так что добавлю свой примерчик для случая с serviceAccountJson file:

import (
        "context"
	"github.com/yandex-cloud/go-genproto/yandex/cloud/compute/v1"
	ycsdk "github.com/yandex-cloud/go-sdk"
	"github.com/yandex-cloud/go-sdk/iamkey"
)

func ycsdkApiFetch(ctx context.Context, folderId string) {
        serviceAccountKeyJson := "example.json"
	key, err := iamkey.ReadFromJSONFile(serviceAccountKeyJson)
	if err != nil {
		return err
	}

	creds, err := ycsdk.ServiceAccountKey(key)
	if err != nil {
		return err
	}

	cfg := ycsdk.Config{
		Credentials: creds,
	}

	sdk, err := ycsdk.Build(ctx, cfg)
	if err != nil {
		return err
	}

	result, err := sdk.Compute().Instance().List(ctx, &compute.ListInstancesRequest{
		FolderId: folderId,
	})
	if err != nil {
		return err
	}

	for _, inst := range result.GetInstances() {
		//  some code
	}
}

SergeyNarozhny avatar Feb 19 '24 22:02 SergeyNarozhny