Develop/Java

[AWS] 아마존 웹 서비스 Android + Amazon Cognito 로그인 구현

JunJangE 2021. 7. 15. 12:41

지난번에 안드로이드 앱이랑 aws cognito를 연결시켜 구현해보았다.

 

[AWS] 아마존 웹 서비스 Android + Amazon Cognito 구현

지난번에 AWS Amplify와 Android 앱을 연동해보았다. [AWS] 아마존 웹 서비스 Amplify + Android 프로젝트 연동 Android 앱과 AWS의 서비스를 연동해보자. 클라우드 서비스 | 클라우드 컴퓨팅 솔루션| Amazon Web..

fre2-dom.tistory.com

하지만 다음과 같은 에러 때문에 실행이 안 되는 것을 확인하여 로그인 코드를 새로 만들어 해결하기로 했다.

E/AndroidRuntime: FATAL EXCEPTION: Thread-2 Process: com.junjange.amplify_test, PID: 24726 java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/app/AppCompatActivity;

로그인을 하기위해서는 회원가입이 필요했기 때문에 회원가입 창도 함께 구현해보았다.

코드는 AuthActivity와 activity_auth_xml 두 부분만 수정했다.

첫 번째로 AuthActivity를 수정한 코드이다.

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.amazonaws.mobile.auth.userpools.SignUpActivity;
import com.amazonaws.mobile.client.AWSMobileClient;
import com.amazonaws.mobile.client.Callback;
import com.amazonaws.mobile.client.UserStateDetails;
import com.amazonaws.mobile.client.results.SignInResult;

public class AuthActivity extends AppCompatActivity {

    private final String TAG = AuthActivity.class.getSimpleName();

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

        Button button = findViewById(R.id.button2); // 로그인 버튼
        Button sign_button = findViewById(R.id.signup_button); // 회원가입 버튼

        AWSMobileClient.getInstance().initialize(getApplicationContext(), new Callback<UserStateDetails>() {

            @Override
            public void onResult(UserStateDetails userStateDetails) {
                Log.i(TAG, userStateDetails.getUserState().toString());
                switch (userStateDetails.getUserState()){
                    case SIGNED_IN:
                        Intent i = new Intent(AuthActivity.this, MainActivity.class);
                        startActivity(i);

                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onError(Exception e) {
                Log.e(TAG, e.toString());
            }
        });

        // 로그인 버튼
        button.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View v) {
                showSignIn();
            }
        });

        // 회원가입 버튼
        sign_button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent i = new Intent(AuthActivity.this, SignUpActivity.class);
                startActivity(i);
                finish();
            }

        });
    }


    // 로그인 함수
    private void showSignIn() {

        EditText login_id = findViewById(R.id.login_id);
        EditText login_paw = findViewById(R.id.login_paw);
        String username = login_id.getText().toString();
        String password = login_paw.getText().toString();
        AWSMobileClient.getInstance().signIn(username, password, null, new Callback<SignInResult>() {
            @Override
            public void onResult(final SignInResult signInResult) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Log.d(TAG, "Sign-in callback state: " + signInResult.getSignInState());
                        switch (signInResult.getSignInState()) {
                            case DONE:
                                Toast.makeText(getApplicationContext(), "Sign-in done.", Toast.LENGTH_SHORT).show();
                                Intent i = new Intent(AuthActivity.this, MainActivity.class);
                                startActivity(i);
                                finish();
                                break;
                            case SMS_MFA:
                                Toast.makeText(getApplicationContext(), "Please confirm sign-in with SMS.", Toast.LENGTH_SHORT).show();
                                break;
                            case NEW_PASSWORD_REQUIRED:
                                Toast.makeText(getApplicationContext(), "Please confirm sign-in with new password.", Toast.LENGTH_SHORT).show();
                                break;
                            default:
                                Toast.makeText(getApplicationContext(), "Unsupported sign-in confirmation: " + signInResult.getSignInState(), Toast.LENGTH_SHORT).show();
                                break;
                        }
                    }
                });
            }

            @Override
            public void onError(Exception e) {
                Log.e(TAG, "Sign-in error", e);
            }
        });
    }
}

회원가입 창 코드를 만드려는 도중 SingUpActivity로 이동하는 코드가 있어 버튼을 눌렀을 때 회원가입 창으로 이동되게 해 보았다.

두번째로 activity_auth_xml 코드는 다음과 같이 수정했다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".AuthActivity"
    android:orientation="vertical">


    <LinearLayout

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_gravity="center"
        android:layout_marginTop="40dp"
        >

        <TextView
            android:id="@+id/textView0"
            android:layout_width="90dp"
            android:layout_height="30dp"
            android:text="아이디"
            android:textSize="20sp"
            android:textStyle="bold" />

        <EditText
            android:id="@+id/login_id"
            android:layout_width="300dp"
            android:layout_height="50dp"
            android:ems="10"
            android:inputType="textEmailAddress" />


    </LinearLayout>


    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_gravity="center"
        android:layout_marginTop="20dp">

        <TextView
            android:id="@+id/textView2"
            android:layout_width="90dp"
            android:layout_height="30dp"
            android:text="비밀번호"
            android:textSize="20sp"
            android:textStyle="bold" />

        <EditText
            android:id="@+id/login_paw"
            android:layout_width="300dp"
            android:layout_height="50dp"
            android:ems="10"
            android:inputType="textPassword" />


    </LinearLayout>
    

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="로그인"

        android:layout_gravity="center"
        android:layout_marginTop="20dp"/>
    <Button
        android:id="@+id/signup_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="회원가입"
        android:layout_gravity="center"
        android:layout_marginTop="20dp"/>



</LinearLayout>

코드를 모두 수정했다면 run을 눌러 다음 실행 화면과 같이 나오는지 확인한다.

여기서 놀라왔던 부분은 회원가입 버튼을 눌렀을 때 회원가입 UI가 나오는 것을 확인할 수 있었다. 아무래도 이전에 코드가 터졌던 이유는 로그인 UI만이 문제였던 것 같다.

그러면 회원가입을 하고 로그인을 해보도록 하겠다.

<회원가입>

위 회원가입 사진과 같이 작성하고 sign up을 누른다.

그럼 저기 작성했던 이메일로 인증 메일이 하나 온다.

그런데 여기서 또 문제인게 인증 코드를 확인하는 창이 없다는 것이다.

일단은 로그인이 되는지만 확인하기 위해 인증 코드 확인 없이 아이디를 승인하기 위해 aws cognito 서비스를 들어간다.

사용자 풀 관리 -> 자신이 만든 서비스 -> 사용자 및 그룹에 들어가면 자신이 만든 사용자가 나온다.

사용자를 클릭하여 사용자 정보를 보면 사용자 확인 버튼이 있다. 

버튼을 누르게 되면 사용자를 인증 승인한 것으로 바뀌게 된다.

그리고 다시 앱을 켜서 아이디, 비밀번호를 치고 로그인 버튼을 누르면 다음 결과 화면과 같이 로그인되는 것을 확인할 수 있다.

<결과 화면>

그런데 여기서 또 문제가 있다...

로그인 후에는 자동으로 로그인 되는 상황이 발생한다.

따라서 로그아웃 버튼을 만들어야 하고 위에서 문제였던 사용자 인증 버튼도 만들어야 한다.

또 noHistroy를 true로 설정했기 때문에 다시 로그인 창으로 가려할 때 종료가 되는 것을 수정해야 할 것 같다.

github

 

junjange/aws-Learning

aws 학습. Contribute to junjange/aws-Learning development by creating an account on GitHub.

github.com