지난번에 안드로이드 앱이랑 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
'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 |