2016-11-05 3 views
0

В документации нет четкого способа сделать это. После создания пула пользователей, а затем создания провайдера в Cognito против пула пользователей, как мне пройти аутентификацию имени пользователя и пароля?Пул пользователей с идентификатором пользователя Аутентификация пользователя с помощью Amazon Cognito - Java SDK

Я нашел это sample, но похоже, что пароли управляются в отдельной базе данных, а не в Cognito.

ответ

0

Я предполагаю, что вы используете Mobile SDK для Android, и у вас все настроено. Во-первых, вы хотите подключиться к бассейну пользователя:

CognitoUserPool userPool = new CognitoUserPool(
          context, userPoolId, clientId, clientSecret); 

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

CognitoUser user = userPool.getUser(userId); 

Затем написать authentication handler. Cognito будет звонить в ваш код, когда (если) ему нужно имя пользователя и пароль, а не вы его называете.

AuthenticationHandler handler = new AuthenticationHandler { 
    @Override 
    public void onSuccess(CognitoUserSession userSession) { 
     // Authentication was successful, the "userSession" will have the current valid tokens 
    } 

    @Override 
    public void getAuthenticationDetails(final AuthenticationContinuation continuation, final String userID) { 
     // User authentication details, userId and password are required to continue. 
     // Use the "continuation" object to pass the user authentication details 

     // After the user authentication details are available, wrap them in an AuthenticationDetails class 
     // Along with userId and password, parameters for user pools for Lambda can be passed here 
     // The validation parameters "validationParameters" are passed in as a Map<String, String> 
     AuthenticationDetails authDetails = new AuthenticationDetails(userId, password, validationParameters); 

     // Now allow the authentication to continue 
     continuation.setAuthenticationDetails(authDetails); 
     continuation.continueTask(); 
    } 

    /* Handle 2FA, challenges, etc as needed */ 
}; 

Наконец, попробуйте получить новую сессию и дать обработчик.

user.getSession(handler); 

Если все пойдет хорошо, вы должны иметь сеанс с действительными токенами.

Этот пример основан на developer guide, в котором также есть примеры для регистрации новых пользователей, выхода из системы и т. Д.

+0

Извините, я не использую Mobile SDK. Я использую Java SDK. – bdparrish

0

Если у вас есть пул пользователей, вы должны пройти аутентификацию против пула пользователей. См. http://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html.

Для задней части, вы бы использовать что-то вроде этого:

Map<String, String> params = new HashMap<>(); 
params.put("USERNAME", userId); 
params.put("SECRET_HASH", calculateSecretHash(userId)); 
params.put("PASSWORD", rawPassword); 

AdminInitiateAuthRequest request = new AdminInitiateAuthRequest() 
    .withUserPoolId("YOUR_USER_POOL_ID") 
    .withClientId("YOUR_USER_POOL_APP_CLIENT_ID") 
    .withAuthFlow(AuthFlowType.ADMIN_NO_SRP_AUTH) 
    .withAuthParameters(params); 

AWSCognitoIdentityProvider identityProvider = AWSCognitoIdentityProviderClientBuilder.standard() 
     .withCredentials(credentialsProvider) 
     .withRegion(Regions.US_WEST_2) 
     .build(); 
AdminInitiateAuthResult result = identityProvider.adminInitiateAuth(request); 

Вспомогательная функция:

private String calculateSecretHash(@Nonnull String userName) { 

    SecretKeySpec signingKey = new SecretKeySpec(m_clientSecret.getBytes(StandardCharsets.UTF_8), HmacAlgorithms.HMAC_SHA_256.toString()); 
    try { 
    Mac mac = Mac.getInstance(HmacAlgorithms.HMAC_SHA_256.toString()); 
    mac.init(signingKey); 
    mac.update(userName.getBytes(StandardCharsets.UTF_8)); 
    byte[] rawHmac = mac.doFinal(m_clientId.getBytes(StandardCharsets.UTF_8)); 
    return Base64.encodeBase64String(rawHmac); 

    } catch (Exception ex) { 
    throw new PgkbRuntimeException("Error calculating secret hash", ex); 
    } 
} 

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

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