Проверьте сеанс Cognito в функции Lambda - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть некоторые данные, хранящиеся в DynamoDB. Для получения данных я требую, чтобы пользователи проходили аутентификацию в пуле пользователей Cognito. Мне удалось успешно аутентифицировать пользователей с помощью библиотеки AWS-Amplify, и Cognito возвращает после JSON следующие данные после успешной аутентификации:

{  
  "username":"....",
  "pool":{  
     "userPoolId":"....",
     "clientId":"...",
     "client":{  
        "endpoint":"....",
        "userAgent":"aws-amplify/0.1.x js"
     },
     "advancedSecurityDataCollectionFlag":true,
     "storage":{  
        "loglevel:webpack-dev-server":"INFO"
     }
  },
  "Session":"abcd12345", <-------------------------------------------
  "client":{  
     "endpoint":"......",
     "userAgent":"aws-amplify/0.1.x js"
  },
  "signInUserSession":null,
  "authenticationFlowType":"USER_SRP_AUTH",
  "storage":{  
     "loglevel:webpack-dev-server":"INFO"
  },
  "challengeName":"NEW_PASSWORD_REQUIRED",
  "challengeParam":{  
     "userAttributes":{  
        "email_verified":"true",
        "phone_number_verified":"true",
        "phone_number":"...",
        "email":"....."
     },
     "requiredAttributes":[  

     ]
  }
}

Я реализовал функцию Lambda с API-шлюзом для обработки запроса данных от клиента. У меня вопрос, есть ли способ проверить значение сеанса (возвращает Cognito) внутри лямбда-функции, чтобы я мог убедиться, что пользователь аутентифицирован, прежде чем я верну данные?

1 Ответ

0 голосов
/ 04 января 2019

Может быть, вы нашли решение для этого, тогда я надеюсь, что это поможет кому-то еще.

Если я правильно понял ваш вопрос, вы можете использовать AWS.CognitoIdentityServiceProvider

и сделайте это следующим образом:

const AWS = require('aws-sdk');

const cisp = new AWS.CognitoIdentityServiceProvider({ apiVersion: '2016-04-18'});

exports.handler = (event, context, callback) => {
     const accessToken = event.accessToken;
     const cispParams = {
         "AccessToken": accessToken
     };

     cisp.getUser(cispParams, (err, result) => {
         if (err) {
             console.log(err);
             callback(err);
         } else {
             // code in this part is reached only if accessToken is valid.
             // So add your code to respond to a verified user here.
         }
         // rest of your Lambda code.

Но accessToken не будет там по умолчанию.Вы должны передать его из внешнего интерфейса.

//your code to generate API Gateway url// 
+ '?accessToken=' + session.getAccessToken().getJwtToken();

Затем настройте API-шлюз, чтобы передать его в Lambda (можно найти способ передачи параметров URL-адреса в Lambda через API-шлюз).

...