Мое веб-приложение использует React во внешнем интерфейсе и Flask во внутреннем интерфейсе.
Я хотел бы добавить AWS Cognito для пользователяуправление.Согласно документации , для этого требуется не более чем завершение оператора export
во внешнем интерфейсе, то есть изменение строки
export default App;
в файле App.js
(определяющей основное приложениеРеагировать компонент) на
export default withAuthenticator(App, true);
плюс добавление обязательных операторов import
.
Это тривиальное изменение дает мне все ориентированные на пользователя функциональные возможности, требуемые любым разумным веб-приложением, используемым в производстве, например
- регистрация пользователя
- подтверждение по электронной почте
- вход / выход из системы
- забытый пароль
- и т. Д.стр.
, включая
- themable UI
- службы отправки электронной почты
- федеративные входы (например, Google, Facebook и т. д.)
Проблема: Я не вижу, как интегрировать это с бэкэндом.
Подход: (как мне кажетсядолжно быть)
- существующий пользователь входит в веб-приложение, используя элементы пользовательского интерфейса, предоставленные Cognito и отображаемые внешним интерфейсом
- , при успешном входе в систему Cognito делает пользовательские данные доступными посредством
currentAuthenticatedUser()
;среди прочего, веб-токен JSON (JWT) - всякий раз, когда веб-интерфейс отправляет запросы бэкэнду, он передает этот JWT в качестве заголовка запроса
- , бэкэнд использует этот JWTчтобы определить, правильно ли пользователь вошел в систему, для какого пользователя сделан запрос и имеет ли этот пользователь достаточные разрешения
Я реализовал обычные обработчики запросов Flask /login
или /logout
иlogin_required
декоратор, а также передача JWT и заявка на декодирование работает нормально; однако , я не вижу, где веб-интерфейс должен уведомлять сервер о входе пользователя в систему.
Я пытался сделать это с помощью Cognito Post Authentication Lambda Trigger ,но это имеет ряд существенных недостатков:
Для начала лямбда-функция AWS, запускаемая при входе пользователя в систему, должна иметь доступ к бэкэнду, поэтому она должна быть общедоступной.Из соображений безопасности я бы предпочел, чтобы сервер был виден / доступен только для внешнего интерфейса.Кроме того, во время разработки я запускаю как интерфейс, так и бэкэнд в контейнерах Docker на моем MacBook;этот подход заставляет меня запускать хотя бы бэкэнд в облаке.
Самая большая проблема в том, что он не работает : с точки зрения бэкэнда выполняются запросы от внешнего интерфейса и Cognitoв отдельных сеансах, поэтому даже после того, как пользователь входит в систему с использованием Cognito (через интерфейс) и Cognito уведомляет серверную часть об этом входе в систему (через лямбда-триггер), любые последующие запросы от интерфейса к серверу - с точки зрения серверной части - несвязаны с (аутентифицированным) сеансом между бэкендом и Cognito и поэтому не аутентифицированы.
Ну, кроме огромных недостатков и того факта, что он не работает, подход лямбда-триггеров также чувствует полное перерасход.
Обновление: Я не знаю, почему я не видел этого раньше, но в документах Amplify есть раздел , который точно объясняет, как настроить withAuthenticator
,Тем не менее, я не хочу переопределять render()
, как в примере, но signIn()
(или я так считаю).Я успешно реализовал код для отправки запроса на http://mybackend.mydomain.com/login
с соответствующими заголовками для входа в серверную часть, но я не могу понять, где / как вызвать этот код.
Я скопировалкод из документов Amplify, связанных выше, посмотрел исходный код SignIn
JSX и версию ("rendered" / "built"?) в моей локальной папке с исходным кодом на node_modules/aws-amplify-react/dist/Auth/SignIn.js
и попробовал это:
class MySignIn extends SignIn {
async signIn() {
console.log('MySignIn.signIn() start');
super.signIn()
.then(data => console.log(data))
.catch(err => console.log(err));
console.log('MySignIn.signIn() end');
}
}
но все, что я получаю, это пустая страница и никаких сообщений в журнале.
Новый вопрос: Как мне реализовать MySignIn
, чтобы он выполнял всю SignIn
работу, но после успешного входа в систему также выполняет дополнительную работу, которая мне нужна?
СпасибоВы очень за ваше внимание!: -)