Включает ли AWS Golang SDK поддержку поставщика Cognito? - PullRequest
0 голосов
/ 14 февраля 2019

Я ранее использовал мобильный SDK AWS с AWS Cognito.Поэтому у меня есть AWS Cognito Identity Pool, настроенный с двумя ролями AWS IAM (аутентифицированными и не аутентифицированными).Через это я сейчас вызываю некоторые функции AWS Lambda.(кстати, я знаю о AWS API Gateway)

Сейчас я пытаюсь сделать нечто подобное с клиентом Go / Golang, то есть вызвать AWS Lambda (роль без аутентификации) со стороны клиента Go, но я могуНе могу найти пример.

Я нашел эту информацию, но, похоже, она предназначена для вызова сервисных функций (т. е. с настроенными секретами среды и т. д., похожими на CLI)

https://docs.aws.amazon.com/sdk-for-go/api/service/cognitoidentity/#New

Я также просмотрел исходный код Go AWS SDK (учетные данные), и похоже, что опция Cognito Provider исключена из SDK?и я не могу найти ничего, что, кажется, упоминает «identityPoolId».

Если это так, могу ли я каким-то образом подключиться к открытому интерфейсу Javascript в Go, не используя SDK?

https://docs.aws.amazon.com/cognito/latest/developerguide/getting-credentials.html#getting-credentials-1.javascript

Хотя я думаю, что мне нужно будет сделать это и без Javascript SDK ...

т.е. прямой HTTPS-вызов к бэкэнду AWS?Работает ли сервис AWS Cognito таким образом?

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Вот пост, который я нашел полезным, когда работал над аналогичным приложением (обращаясь к пулу пользователей из Go Lambda): https://benincosa.com/?p=3714

Его пример должен быть в поле (по крайней мере, показать вампуть вперед).

TLDR, адаптированный

Создание сеанса:

ses, _ := session.NewSession(&aws.Config{Region: aws.String("us-east-1")})

Аутентификация от провайдера:

params := &cognitoidentityprovider.InitiateAuthInput{
        AuthFlow: aws.String("USER_PASSWORD_AUTH"),
        AuthParameters: map[string]*string{
                "USERNAME": aws.String("maria@vontropps.com"),
                "PASSWORD": aws.String("doremefasolatido"),
        },
        ClientId: aws.String("123456789abcdefghijklmnopq"),
}
cip := cognitoidentityprovider.New(ses)
authResp, _ := cip.InitiateAuth(params)

Получение удостоверения:

   svc := cognitoidentity.New(ses)
   idRes, _ := svc.GetId(&cognitoidentity.GetIdInput{
           IdentityPoolId: aws.String("us-east-1:123456789-444-4444-123456789abc"),
           Logins: map[string]*string{
                   "cognito-idp.<reg>.amazonaws.com/us-east-1_<id>": authResp.AuthenticationResult.IdToken,
           },
   })

   credRes, _ := svc.GetCredentialsForIdentity(&cognitoidentity.GetCredentialsForIdentityInput{
           IdentityId: idRes.IdentityId,
           Logins: map[string]*string{
                   "cognito-idp.<reg>.amazonaws.com/us-east-1_<id>": authResp.AuthenticationResult.IdToken,
           },
   })

Вызов API:

   url := "fill in your endpoint"
   client := new(http.Client)
   req, _ := http.NewRequest("GET", url, nil)

Знак:

   v := v4.NewSigner(credentials.NewStaticCredentials(
          *credRes.Credentials.AccessKeyId,
          *credRes.Credentials.SecretKey,
          *credRes.Credentials.SessionToken,
   ))

   v.Sign(req, nil, "execute-api", "us-east-1", time.Now())

Сделать ответ:

   resp, _ := client.Do(req)

Ручка Resp:

   b, _ := ioutil.ReadAll(resp.Body)
   resp.Body.Close()
   fmt.Printf("%s\n", b)
0 голосов
/ 20 февраля 2019

Это не поддерживается в текущем SDK.Однако я нашел способ решить эту проблему с помощью веб-API.Сначала вызовите это:

https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html

И как только у вас будет IdendityId, вызовите это:

https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html

С возвращенными учетными данными у вас будет гость/ неаутентифицированная роль роли для вызова вашей публичной лямбды.IdentityId может кэшироваться локально для последующих вызовов.

[edit] пример незавершенного производства: https://github.com/WhiteHexagon/go2aws

...