Как восстановить исходное местоположение браузера после входа в систему с помощью amazon -ognito-auth-js
Cognito - это отличная служба идентификации пользователей, предоставляемая AWS. Cognito Auth SDK делает вход в браузер таким простым, как:
const authData = { RedirectUriSignIn: 'https://myapp.com/', ... }; const auth = new AmazonCognitoIdentity.CognitoAuth(authData); auth.userhandler = { onSuccess: session => { // Success! } }; auth.parseCognitoWebResponse(window.location.href); if (auth.getCurrentUser()) { auth.getSession(); }
К сожалению, приведенный выше код всегда перенаправляет пользователя в корень приложения после успешного входа в систему. Например, неаутентифицированный пользователь запрашивает страницу профиля Сью по адресу/profile/sue
. Наше приложение перенаправит браузер в поток входа в Cognito. После успешного входа в систему браузер будет перенаправлен на https://myapp.com/
, тем самым потеряв ссылку на страницу профиля Сью.
К счастью, мы можем использовать параметр состояния для хранения запрашиваемого пути, а затем установить местоположение браузера после успешного входа в систему:
auth.setState(location.pathname); auth.userhandler = { onSuccess: session => { // Restore deeplink if (session.state) { const pathname = decodeURIComponent(session.state); window.history.replaceState(null, null, pathname); } } }; auth.parseCognitoWebResponse(window.location.href); if (auth.getCurrentUser()) { auth.getSession(); }
Хотя это и помогает, это не совсем безопасно (подробности). Итак, вместо того, чтобы использовать полуфиксированное значение для состояния, мы смешиваем его с nonce:
const nonce = auth.generateRandomString(auth.getCognitoConstants().STATELENGTH, auth.getCognitoConstants().STATEORIGINSTRING); const state = { pathname: location.pathname, nonce }; auth.setState(window.btoa(JSON.stringify(state))); auth.userhandler = { onSuccess: session => { // Restore deeplink if (session.state) { const state = JSON.parse(window.atob(session.state)); const pathname = decodeURIComponent(state.pathname); window.history.replaceState(null, null, pathname); } } }; auth.parseCognitoWebResponse(window.location.href); if (auth.getCurrentUser()) { auth.getSession(); }
Удачного кодирования!
Фото: Эрих Фердинанд