Как восстановить исходное местоположение браузера после входа в систему с помощью 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();
}

Удачного кодирования!

Фото: Эрих Фердинанд