2016-12-28 3 views
3

У меня есть приложение Angular, которое использует SDK javascript AWS и может успешно войти в систему с Facebook и Google. Я могу создать идентификатор Cognito, и я вижу личность в моем пуле Federated Identity. Я также могу использовать свои конечные точки API, прошедшие аутентификацию IAM (я вижу пользовательский код в Lambda, который я звоню).Как получить адрес электронной почты аутентифицированного пользователя в node.js AWS Lambda?

Я хочу использовать адрес электронной почты пользователя в качестве ключа в базе данных (DynamoDB), поэтому я пытаюсь выяснить, как получить доступ к электронному адресу пользователя из надежного источника, либо Cognito (предпочтительно), либо провайдер аутентификации JWT.

Каков наилучший способ доступа к электронному адресу пользователя?

Обновление: На стороне клиента (javascript) Я использую федеративные идентификаторы с токенами Google и Facebook. Социальные Войти работаю, и я могу получить заверенный Cognito просто отлично, передавая логины:

AWS.config.credentials = new AWS.CognitoIdentityCredentials({ 
    IdentityPoolId: 'us-east-1:****', 
    Logins: { 
     'accounts.google.com': authResult['id_token'] 
    } 
}); 

тогда я AWS.config.credentials.get() и я могу получить такие вещи, как AWS.config.credentials.identityId, но я не могу найти или маркер доступа методы в звоните, чтобы получить JWT. Мне кажется, мне нужно позвонить result.getAccessToken().getJwtToken(), но я не могу его найти.

Все примеры, в которых они получают доступ, похоже, используют .authenticateUser(authenticationDetails()), но подробности включают имя пользователя и пароль (а не федеративный логин).

ответ

6

tldr; Отправьте accessToken после аутентификации в лямбда и используйте CognitoIdentityServiceProvider.getUser() для получения атрибутов.

Я потратил несколько часов на работу с помощью токенов ID, и из того, что я могу сказать, единственный способ получить фактическую идентификацию пользователя - использовать комбинацию accessToken, предоставленную при успешной аутентификации, и вызов getUser от поставщика удостоверений , Это похоже только на SDK NodeJS и ничего больше.

Я использую API-интерфейс Amazon для моего приложения и Лямбда в фоновом режиме. После успешной проверки подлинности вы можете получить доступ к accessToken и передать его поставщику сервера Cognito. Оттуда вы можете сохранить данные локально, но это представляет собой серьезную проблему безопасности, если вы планируете использовать эту информацию на бэкэнде. Поскольку это локальное хранилище, пользователь может просто настроить атрибуты пользователя по своему усмотрению.

Чтобы обойти это, вы можете напрямую передать функцию доступа к функции лямбда и выполнить тот же процесс на сервере. Это гарантирует, что пользовательские атрибуты не были обработаны или не подделаны. Обязательно используйте HTTPS на вашем API, чтобы избежать утечки accessToken другим пользователям, которые могут использовать AWS SDK, чтобы получить внутренние данные.

var AWS = require("aws-sdk"); 
 

 
AWS.config.region = '<REGION-ID>'; 
 

 
exports.lambda_handler = function(event, context) { 
 
    var accessToken = event['accessToken']; 
 
    var provider = new AWS.CognitoIdentityServiceProvider(); 
 
    provider.getUser({ 
 
    AccessToken: accessToken 
 
    }, function(err, obj) { 
 
    context.succeed({ 
 
     'user': obj 
 
    }); 
 
    }); 
 
};

+0

Спасибо, что нашли время, чтобы ответить. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не знаю, как получить accessToken. Я собираюсь обновить вопрос с помощью примера того, что я использую, чтобы получить учетные данные. Все примеры, которые я могу найти, похоже, используют учетные данные имени пользователя и пароля, тогда как я использую Federated Identities с поставщиками Google и Facebook. – destro

Смежные вопросы