Develop/Java

[AWS] 아마존 웹 서비스 Android + Amazon Cognito 비빌번호 재설정

JunJangE 2021. 7. 18. 20:53

지난번에 안드로이드 앱이랑 aws cognito를 연결시킨 앱에 인증코드 재전송 기능을 추가하여 구현해보았다.

 

[AWS] 아마존 웹 서비스 Android + Amazon Cognito 인증코드 재전송

지난번에 안드로이드 앱이랑 aws cognito를 연결시킨 앱에 회원가입 기능을 추가하여 구현해보았다. [AWS] 아마존 웹 서비스 Android + Amazon Cognito 회원가입 구현 지난번에 안드로이드 앱이랑 aws cognito

fre2-dom.tistory.com

이번에는 비밀번호를 잊어버렸을 때 찾는 기능과 비밀번호를 바꾸는 기능을 구현해보자.

먼저 로그인 창에서 비밀번호 재설정 버튼을 만든다.

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.client.AWSMobileClient;
import com.amazonaws.mobile.client.Callback;
import com.amazonaws.mobile.client.UserState;
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 signIn_button = findViewById(R.id.signIn_button); // 로그인 버튼
        Button signUp_button = findViewById(R.id.signUp_button); // 회원가입 버튼
        Button forgot_Password_button = findViewById(R.id.forgot_Password_button); // 비밀번호를 잊어버리셨나요?

        // 로그인이 되어있는지 확인
        AWSMobileClient.getInstance().initialize(getApplicationContext(), new Callback<UserStateDetails>() {

            @Override
            public void onResult(UserStateDetails userStateDetails) {
                Log.i(TAG, userStateDetails.getUserState().toString());

                // 로그인이 되어있으면 MainActivity 로 이동
                if (userStateDetails.getUserState() == UserState.SIGNED_IN) {
                    Intent i = new Intent(AuthActivity.this, MainActivity.class);
                    startActivity(i);
                    finish();
                }
            }
            @Override
            public void onError(Exception e) {
                Log.e(TAG, e.toString());
            }
        });

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

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

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

            @Override
            public void onClick(View v) {

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

        });

        // 비밀번호를 잊어버리셨나요?
        forgot_Password_button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent i = new Intent(AuthActivity.this, Forgot_Activity.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);
            }
        });
    }
}

그냥 버튼을 눌렀을 때 비밀번호 재설정하는 액티비티로 이동하는 코드이다.

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"
    android:gravity="center">


    <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/login_id_text"
            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/login_paw_text"
            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/signIn_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="로그인"
        android:layout_gravity="center"
        android:layout_marginTop="20dp"/>
    <Button
        android:id="@+id/forgot_Password_button"
        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>

 

다음으로는 회원가입 창을 구현하기 위해 새 Activity를 만들었다.

이름은 ForgotActivity로 하였고 코드는 다음과 같다.

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.client.AWSMobileClient;
import com.amazonaws.mobile.client.Callback;
import com.amazonaws.mobile.client.results.ForgotPasswordResult;
import com.amazonaws.mobile.client.results.ForgotPasswordState;

public class ForgotActivity extends AppCompatActivity {

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

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

        Button code_button = findViewById(R.id.code_button); // 인증 코드 버튼
        Button new_paw_button = findViewById(R.id.new_paw_button); // 비밀번호 재설정 버튼


        // 인증 버튼
        code_button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {


                // 인증코드 확인
                EditText paw_signUpUsername = (EditText) findViewById(R.id.paw_signUpUsername);
                String username = paw_signUpUsername.getText().toString();

                AWSMobileClient.getInstance().forgotPassword(username, new Callback<ForgotPasswordResult>() {
                    @Override
                    public void onResult(final ForgotPasswordResult result) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Log.d(TAG, "forgot password state: " + result.getState());
                                if (result.getState() == ForgotPasswordState.CONFIRMATION_CODE) {
                                    Toast.makeText(getApplicationContext(), "이메일 주소로 인증 코드가 전송되었습니다.", Toast.LENGTH_SHORT).show();


                                } else {
                                    Log.e(TAG, "un-supported forgot password state");
                                }
                            }
                        });
                    }

                    @Override
                    public void onError(Exception e) {
                        Log.e(TAG, "forgot password error", e);
                    }

                });
            }
        });



        // 비밀번호 재설정 버튼
        new_paw_button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                // 인증코드, 비밀번호 재설정
                EditText paw_code_name = (EditText) findViewById(R.id.paw_code_name);
                EditText new_paw_name = (EditText) findViewById(R.id.new_paw_name);


                String CONFIRMATION_CODE = paw_code_name.getText().toString();
                String NEW_PASSWORD_HERE = new_paw_name.getText().toString();


                AWSMobileClient.getInstance().confirmForgotPassword(NEW_PASSWORD_HERE, CONFIRMATION_CODE, new Callback<ForgotPasswordResult>() {
                    @Override
                    public void onResult(final ForgotPasswordResult result) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Log.d(TAG, "forgot password state: " + result.getState());
                                if (result.getState() == ForgotPasswordState.DONE) {

                                    // 비밀번호가 재설정 되었으면 로그인 창으로 이동
                                    Toast.makeText(getApplicationContext(), "성공적으로 비밀번호가 재설정 되었습니다.", Toast.LENGTH_SHORT).show();
                                    Intent i = new Intent(ForgotActivity.this, AuthActivity.class);
                                    startActivity(i);
                                    finish();

                                } else {
                                    Log.e(TAG, "un-supported forgot password state");
                                }
                            }
                        });
                    }

                    @Override
                    public void onError(Exception e) {
                        Log.e(TAG, "forgot password error", e);
                    }
                });
            }
        });
    }



    // 뒤로가기 2번 눌러야 종료
    private final long FINISH_INTERVAL_TIME = 1000;
    private long backPressedTime = 0;

    @Override
    public void onBackPressed() {
        long tempTime = System.currentTimeMillis();
        long intervalTime = tempTime - backPressedTime;

        // 뒤로 가기 할 경우 AuthActivity 화면으로 이동
        if (0 <= intervalTime && FINISH_INTERVAL_TIME >= intervalTime)
        {
            Intent i = new Intent(ForgotActivity.this, AuthActivity.class);
            startActivity(i);
            finish();
        }
        else
        {
            backPressedTime = tempTime;
            Toast.makeText(getApplicationContext(), "한번 더 누르면 종료됩니다.", Toast.LENGTH_SHORT).show();
        }
    }
}

코드를 보면 회원가입 했을 때 이메일을 입력하고 인증 코드를 받는다. 받은 인증코드를 입력 후 재설정할 비밀번호를 적어 비밀번호를 바꾼다. 성공적으로 바꾸게 되면 로그인 창으로 이동된다.

activity_forgot.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=".OkActivity"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:id="@+id/ok_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="비밀번호를 잊어버리셨나요?\n
        인증 메일이 가입했던 이메일 주소로 전송됩니다!\n
        인증 코드 입력 후 비밀번호를 재설정 해주세요!"
        android:textSize="16dp"
        android:textStyle="bold" />

    <LinearLayout

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

        <TextView
            android:id="@+id/paw_signUpUsername_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="이메일 주소"
            android:textSize="16dp"
            android:textStyle="bold" />

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


    </LinearLayout>

    <Button
        android:id="@+id/code_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="20dp"
        android:text="인증 코드 발송" />


    <LinearLayout

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

        <TextView
            android:id="@+id/paw_code_name_text"
            android:layout_width="90dp"
            android:layout_height="30dp"
            android:text="인증 코드"
            android:textSize="16dp"
            android:textStyle="bold" />

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




    </LinearLayout>
    <LinearLayout

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

        <TextView
            android:id="@+id/new_paw_name_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="비밀번호 재설정"
            android:textSize="16dp"
            android:textStyle="bold" />

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



    </LinearLayout>



    <Button
        android:id="@+id/new_paw_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="20dp"
        android:text="확인" />


</LinearLayout>

코드를 모두 수정했다면 run을 눌러 다음 결과 동영상과 같이 실행 되는지 확인한다.

 

<결과 동영상>

인증 메일이 가입했던 이메일 주소로 전송되고 사용자는 받은 인증 코드를 앱에 적어 비밀번호를 재설정하는 것으로 구현했다.

참고

 

Authentication - Working with the API - Amplify Docs

Learn more about how to use the Amplify Framework's auth APIs

docs.amplify.aws

github

 

junjange/aws-Learning

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

github.com