지난번에 안드로이드 앱이랑 aws cognito를 연결시킨 앱에 인증코드 재전송 기능을 추가하여 구현해보았다.
이번에는 비밀번호를 잊어버렸을 때 찾는 기능과 비밀번호를 바꾸는 기능을 구현해보자.
먼저 로그인 창에서 비밀번호 재설정 버튼을 만든다.
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을 눌러 다음 결과 동영상과 같이 실행 되는지 확인한다.
인증 메일이 가입했던 이메일 주소로 전송되고 사용자는 받은 인증 코드를 앱에 적어 비밀번호를 재설정하는 것으로 구현했다.
참고
github
'Develop > Java' 카테고리의 다른 글
[AWS] 아마존 웹 서비스 Android + Amazon Cognito 에러 메시지 (0) | 2021.07.21 |
---|---|
[Java] 자바 Android 다이얼로그(Dialog) 구현 (0) | 2021.07.19 |
[AWS] 아마존 웹 서비스 Android + Amazon Cognito 인증코드 재전송 (0) | 2021.07.17 |
[AWS] 아마존 웹 서비스 Android + Amazon Cognito 회원가입 구현 (2) | 2021.07.16 |
[AWS] 아마존 웹 서비스 Android + Amazon Cognito 로그인 구현 (0) | 2021.07.15 |