0

так что я работаю с aws cognito, и я немного смущен тем, как получить пароль?Как получить пароль от aws cognito - Android?

Если пользователь вводит пароль в текст редактирования, как я могу получить пароль, который пользователь ввел при регистрации, поэтому я могу сравнить пароль, с которым они вошли, с паролем, зарегистрированным?

Вот код, я должен был зарегистрировать пользователя:

userPool.signUpInBackground(username_ET.getText().toString(), password_ET.getText().toString(), userAttributes, null, signupCallback); 

А вот код я использовал войти в систему:

private AuthenticationHandler authenticationHandler = new AuthenticationHandler() 
    { 
     @Override 
     public void onSuccess(CognitoUserSession userSession, CognitoDevice newDevice) 
     { 
      Log.d(COGNITO_LOGIN,"Login success I think?!"); 
      cognitoUser.getDetailsInBackground(getDetailsHandler); 
      //Here i need to compare passwords before i can move on. 
     } 
     @Override 
     public void getAuthenticationDetails(AuthenticationContinuation authenticationContinuation, String userId) 
     { 
      Log.d(COGNITO_LOGIN,passwordET.getText().toString()); 
      // The API needs user sign-in credentials to continue 
      AuthenticationDetails authenticationDetails = new AuthenticationDetails(userId, passwordET.getText().toString(), null); 

      // Pass the user sign-in credentials to the continuation 
      authenticationContinuation.setAuthenticationDetails(authenticationDetails); 

      // Allow the sign-in to continue 
      authenticationContinuation.continueTask(); 
     } 
     @Override 
     public void getMFACode(MultiFactorAuthenticationContinuation multiFactorAuthenticationContinuation) { 
      // Multi-factor authentication is required; get the verification code from user 
      multiFactorAuthenticationContinuation.setMfaCode("verificationCode"); 
      // Allow the sign-in process to continue 
      multiFactorAuthenticationContinuation.continueTask(); 
     } 
     @Override 
     public void authenticationChallenge(ChallengeContinuation continuation) { 
     } 
     @Override 
     public void onFailure(Exception exception) 
     { 
      // Sign-in failed, check exception for the cause 
      Log.d(COGNITO_LOGIN,"Login failed!"); 
      Log.d(COGNITO_LOGIN,exception.getMessage()); 
      exceptionMessage(exception.getMessage()); 
     } 
    }; 



cognitoUser.getSessionInBackground(authenticationHandler); 

С обработчика аутентификации, мне нужно только пройти в правильном имени пользователя (или userID), чтобы запустить onSuccess. Пароль даже не требуется. Поэтому я смущен, когда пользователь должен ввести правильный пароль для входа в систему.

+1

Я не уверен, что понимаю. Вы указываете пароль в коде, который вы только что опубликовали. Когда вы создаете AuthenticationDetails и добавляете их в продолжение. Так в чем именно заключается ваш вопрос? – doorstuck

+0

@doorstuck Да, я указал пароль, но оператор журнала в 'getgetAuthenticationDetails' не запускается. и когда я ввожу неверный пароль, он регистрируется в любом случае – TheQ

+0

попробуйте вызвать или переустановить приложение. Тогда у него нет учетных данных, и он будет запрашивать пароль с помощью метода getAuthenticationDetails. – doorstuck

ответ

1

Вам не нужно сравнивать пароли. Когда вы регистрируетесь, Cognito хранит соль и верификатор пароля, с которым вы подписались. Cognito не сохраняет ваш пароль в форме, в которую вы ввели его, но только соль и верификатор. Когда вы используете приведенный ниже код, Cognito использует протокол Secure Remote Password для соответствия внутреннему верификатору. Поскольку мы используем пароль, который вы предоставили для вычислений, вы не можете его получить. Обратите внимание, что в обратном вызове onSuccess вы получите токены, если вызов будет успешным, как указано ниже.

// Callback handler for the sign-in process 
AuthenticationHandler authenticationHandler = new AuthenticationHandler() { 

    @Override 
    public void onSuccess(CognitoUserSession cognitoUserSession) { 
     // Sign-in was successful, cognitoUserSession will contain tokens for the user 
    } 

    @Override 
    public void getAuthenticationDetails(AuthenticationContinuation authenticationContinuation, String userId) { 
     // The API needs user sign-in credentials to continue 
     AuthenticationDetails authenticationDetails = new AuthenticationDetails(userId, password, null); 

     // Pass the user sign-in credentials to the continuation 
     authenticationContinuation.setAuthenticationDetails(authenticationDetails); 

     // Allow the sign-in to continue 
     authenticationContinuation.continueTask(); 
    } 

    @Override 
    public void getMFACode(MultiFactorAuthenticationContinuation multiFactorAuthenticationContinuation) { 
     // Multi-factor authentication is required, get the verification code from user 
     multiFactorAuthenticationContinuation.setMfaCode(mfaVerificationCode); 
     // Allow the sign-in process to continue 
     multiFactorAuthenticationContinuation.continueTask(); 
    } 

    @Override 
    public void onFailure(Exception exception) { 
     // Sign-in failed, check exception for the cause 
    } 
}; 

// Sign-in the user 
cognitoUser.getSessionInBackground(authenticationHandler); 
+0

Благодарим за отзыв. Оценил это. У меня есть другой вопрос. Когда пользователь забудет пароль, как бы вы справились с этим, я знаю, что есть: 'user.forgotPasswordInBackground (new ForgotPasswordHandler ...)'. Но, я думаю, его предположим, чтобы отправить мне еще один код подтверждения каким-то образом, как мне получить этот код. Я опубликовал подробную версию этого вопроса здесь: http://stackoverflow.com/questions/41646278/forgot-password-in-aws-cognito-android – TheQ

+0

Да, вы должны получить код, если у вас есть подтвержденный адрес электронной почты или номер телефона когда вы вызываете забыли пароль. –

+0

Как только пользователь вошел в систему, getSession имеет тенденцию быть успешным, даже если пароль неверен. Что делать, если внутри приложения нам нужно проверить, чтобы пользователь мог изменить что-то критическое. Как мы можем проверить правильность введенного пароля? – desidigitalnomad