Develop/Java

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

JunJangE 2021. 7. 17. 12:02

지난번에 안드로이드 앱이랑 aws cognito를 연결시킨 앱에 회원가입 기능을 추가하여 구현해보았다.

 

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

지난번에 안드로이드 앱이랑 aws cognito를 연결시켜 로그인까지 구현해보았다. [AWS] 아마존 웹 서비스 Android + Amazon Cognito 로그인 구현 지난번에 안드로이드 앱이랑 aws cognito를 연결시켜 구현해보

fre2-dom.tistory.com

이번에는 인증 코드를 재전송하는 기능을 구현해보자.

먼저 인증 코드 재전송 버튼을 만들자.

activity_ok.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
        24시간 이내로 인증을 완료해주세요!"
        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/signUpUsername2_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="이메일 주소"
            android:textSize="16dp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/signUpUsername2"
            android:layout_width="300dp"
            android:layout_height="50dp"
            android:gravity="center"
            android:textStyle="bold"
            android:textColor="@color/black"
            android:textSize="20dp"
            android:text="이메일" />


    </LinearLayout>

    <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/code_name_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="인증 코드"
            android:textSize="16dp"
            android:textStyle="bold" />

        <EditText
            android:id="@+id/code_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="text" />
        <Button
            android:id="@+id/Re_Ok_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="재전송" />



    </LinearLayout>



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


</LinearLayout>

인증 코드 재전송 버튼을 만들고 UI를 살짝 바꾸었다.

다음은 인증 코드를 재전송할 수 있게 코드를 작성했다.

OkAcitivty에 코드는 다음과 같다.

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.TextView;
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.SignUpResult;
import com.amazonaws.mobile.client.results.UserCodeDeliveryDetails;

public class OkActivity extends AppCompatActivity {
    String TAG = AuthActivity.class.getSimpleName();

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

        // 인증 확인 버튼
        Button Ok_button = findViewById(R.id.Ok_button);
        // 인증 재전송 버튼
        Button Re_Ok_button = findViewById(R.id.Re_Ok_button);

        // SingUpActivity 에서 사용된 username 정보를 가져와 TextView에 넣는다.
        TextView TextView = findViewById(R.id.signUpUsername2);
        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        String username = bundle.getString("email");
        TextView.setText(username);

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

            // 인증 코드 확인
            @Override
            public void onClick(View v) {

                EditText code_name = findViewById(R.id.code_name);
                String code = code_name.getText().toString();

                AWSMobileClient.getInstance().confirmSignUp(username, code, new Callback<SignUpResult>() {
                    @Override
                    public void onResult(final SignUpResult signUpResult) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {

                                Log.d(TAG, "Sign-up callback state: " + signUpResult.getConfirmationState());
                                if (!signUpResult.getConfirmationState()) {
                                    final UserCodeDeliveryDetails details = signUpResult.getUserCodeDeliveryDetails();

                                    Toast.makeText(getApplicationContext(), "Confirm sign-up with: " + details.getDestination(), Toast.LENGTH_SHORT).show();


                                } else {

                                    // 회원가입이 완료되면 로그인 창으로 이동
                                    Toast.makeText(getApplicationContext(), "성공적으로 회원가입 되셨습니다.", Toast.LENGTH_SHORT).show();
                                    Intent i = new Intent(OkActivity.this, AuthActivity.class);
                                    startActivity(i);
                                    finish();

                                }
                            }
                        });
                    }

                    @Override
                    public void onError(Exception e) {
                        Log.e(TAG, "Confirm sign-up error", e);
                    }
                });


            }

        });

        // 인증 코드 재전송 버튼
        Re_Ok_button.setOnClickListener(new View.OnClickListener() {

            // 인증 코드 재전송
            @Override
            public void onClick(View v) {

                AWSMobileClient.getInstance().resendSignUp(username, new Callback<SignUpResult>() {
                    @Override
                    public void onResult(SignUpResult signUpResult) {
                        Log.i(TAG, "A verification code has been sent via" +
                                signUpResult.getUserCodeDeliveryDetails().getDeliveryMedium()
                                + " at " +
                                signUpResult.getUserCodeDeliveryDetails().getDestination());
                        Toast.makeText(getApplicationContext(), "인증 메일이 재전송 되었습니다.", Toast.LENGTH_SHORT).show();

                    }

                    @Override
                    public void onError(Exception e) {
                        Log.e(TAG, String.valueOf(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;

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

}

인증코드 재전송 코드를 추가하여 쉽게 재전송 기능을 구현해보았다.

다음에는 비밀번호를 잊어버렸을 때 재설정하는 기능을 구현해보도록 하겠다.

참고

 

Authentication - Working with the API - Amplify Docs

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

docs.amplify.aws