Android Cognito с SAML (O365)

Я пытаюсь интегрировать SAML с Amazon Cognito через приложение для Android. Я следил за серией видеороликов YouTube от 101apps.co.za, где мне удалось успешно аутентифицировать созданного вручную пользователя на самой консоли Cognito как через размещенный пользовательский интерфейс, используя формат ссылок, который они предоставляют в своей документации, так и через мое простое приложение для Android.

В моем сценарии я должен аутентифицировать пользователей, используя идентификаторы электронной почты и пароли Office 365, поскольку это корпоративная среда. Я подписался на статью, в которой мне удалось успешно войти в систему с помощью Office 365. Ссылка - AWS Cognito с федерацией в Office 365 Мне удалось легко войти в систему, используя сгенерированный пользовательский интерфейс Cognito. См. Изображение ниже

Android Cognito с SAML (O365)

Единственная проблема в том, что я не могу заставить это работать в моем приложении для Android. Ниже я получаю ошибку.

Login failed User does not exist. (Service: AmazonCognitoIdentityProvider; Status Code: 400; Error Code: UserNotFoundException; Request ID: 3cd1e93e-d118-11e8-af77-098f4bda99f1)

Ниже приведен код из моего простого приложения для Android, в котором есть 2 текстовых поля для имени пользователя, пароля и кнопки для входа в систему. Это было реализовано после серии руководств на YouTube, о которой я упоминал ранее.

package com.midassafety.chulankumara.googleauthentication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoDevice;
import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUser;
import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserSession;
import com.amazonaws.mobileconnectors.cognitoidentityprovider.continuations.AuthenticationContinuation;
import com.amazonaws.mobileconnectors.cognitoidentityprovider.continuations.AuthenticationDetails;
import com.amazonaws.mobileconnectors.cognitoidentityprovider.continuations.ChallengeContinuation;
import com.amazonaws.mobileconnectors.cognitoidentityprovider.continuations.MultiFactorAuthenticationContinuation;
import com.amazonaws.mobileconnectors.cognitoidentityprovider.handlers.AuthenticationHandler;

import org.w3c.dom.Text;

public class LoginActivity extends AppCompatActivity {

    private static final String TAG = "Cognito";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        final EditText editTextUsername = findViewById(R.id.username);
        final EditText editTextPassword = findViewById(R.id.password);

        final AuthenticationHandler authenticationHandler = new AuthenticationHandler() {
            @Override
            public void onSuccess(CognitoUserSession cognitoUserSession, CognitoDevice cognitoDevice) {
                Log.i(TAG, "Login successfull, can get tokens here");
                cognitoUserSession.getIdToken();
            }

            @Override
            public void getAuthenticationDetails(AuthenticationContinuation authenticationContinuation, String userId) {
                Log.i(TAG, "Login getAuthenticationDetails()...");

                /*need to get the userId & password to continue*/
                AuthenticationDetails authenticationDetails = new AuthenticationDetails(userId, String.valueOf(editTextPassword.getText()), null);

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

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

            @Override
            public void getMFACode(MultiFactorAuthenticationContinuation multiFactorAuthenticationContinuation) {
                Log.i(TAG, "Login getMFACode()...");
            }

            @Override
            public void authenticationChallenge(ChallengeContinuation challengeContinuation) {
                Log.i(TAG, "Login authenticationChallenge()...");
            }

            @Override
            public void onFailure(Exception e) {
                Log.i(TAG,"Login failed " + e.getLocalizedMessage());
            }
        };

        Button buttonLogin = findViewById(R.id.login);
        buttonLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CognitoSettings cognitoSettings = new CognitoSettings(LoginActivity.this);

                CognitoUser thisUser = cognitoSettings.getUserPool().getUser(String.valueOf(editTextUsername.getText()));

                Log.i(TAG,"Login button clicked....");

                thisUser.getSessionInBackground(authenticationHandler);
            }
        });
    }
}

Это класс CognitoSettings.java для обработки основных настроек.

package com.midassafety.chulankumara.googleauthentication;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserPool;
import com.amazonaws.regions.Regions;

public class CognitoSettings  {
    private String userPoolId = "ap-southeast-1_######";
    private String clientId = "#############";
    private String clientSecret = "************************redacted********************";
    private Regions cognitoRegion = Regions.AP_SOUTHEAST_1;

    private Context context;

    public CognitoSettings(Context context){
        this.context = context;
    }

    public String getUserPoolId(){
        return userPoolId;
    }

    public String getClientId(){
        return clientId;
    }

    public String getClientSecret() {
        return clientSecret;
    }

    public Regions getCognitoRegion() {
        return cognitoRegion;
    }

    public CognitoUserPool getUserPool(){
        return new CognitoUserPool(context, userPoolId, clientId, clientSecret, cognitoRegion);
    }
}

Я проверяю UserPool и вижу группу AutoGenerated для созданного мной поставщика удостоверений SAML.

Android Cognito с SAML (O365)

Я весь день рыскал по интернету, но безуспешно.

Что я делаю не так или что мне еще нужно сделать для аутентификации пользователей с помощью SAML с O365?

Пожалуйста помоги!...

Могу я спросить, позволяет ли этот подход аутентифицироваться пользователям из ЛЮБОГО клиента 365 или только для вашего клиента 365?

Rob McFeely 27.02.2019 12:45

Собственно сейчас я здесь больше не работаю. Это задание мне дали незадолго до отъезда. Итак, ответьте на ваш вопрос: нет, это будет работать с любым клиентом 365, если вы настроите параметры, как в документации на веб-сайте AWS. Вам нужно выполнить некоторую настройку со стороны офиса Microsoft. Моя проблема заключалась в мобильном приложении, а не в веб-приложении, которое работало безупречно. Я должен вернуться к этому снова.

C2K 20.05.2019 18:00
4
2
502
0

Другие вопросы по теме