반응형
전화번호 인증의 목적
- 서비스 전반의 스팸이나 악용 사례를 방지
- 사용자 정보 수집
Firebase 전화번호 인증 장점
- 서버 개발 시간만큼 전체 개발 시간 감소
- 초기 비용 무료 (월 최대 1만 건 무료)
Firebase 전화번호 인증 단점
- 문자 메시지 내용 변경 어려움 (정해진 형식만 사용 가능)
- 휴대폰 본인인증은 불가능 (KCB나 NICE를 이용해야 한다)
Firebase 전화번호 인증과 기존 전화번호 인증 비교
순서 | Firebase | 기존방식 |
1 | 사용자 전화번호 입력 | 사용자 전화번호 입력 |
2 | Firebase에 인증 코드 발송 요청 | 서버에 인증코드 발송 요청 |
3 | 사용자 인증코드 수신 | 서버에서 SMS 호스팅 서비스사로 SMS 발송 요청 |
4 | 사용자 인증코드 입력 | SMS 발송 요청 정보 DB 저장 |
5 | 사용자 입력 인증코드 Firebase에 전달 후 일치 결과 수신 | 사용자 인증코드 수신 |
6 | 로그인 혹은 회원가입 | 사용자 인증코드 입력 |
7 | 사용자 입력 인증코드 DB에 저장된 값과 비교하여 일치 결과 전달 | |
8 | 로그인 혹은 회원가입 |
구현
- app/build.gradle
dependencies {
implementation 'com.google.firebase:firebase-auth:21.0.1'
}
- TestPhoneActivity.java
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.android.material.textfield.TextInputEditText;
import com.google.firebase.FirebaseException;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.PhoneAuthCredential;
import com.google.firebase.auth.PhoneAuthOptions;
import com.google.firebase.auth.PhoneAuthProvider;
import java.util.concurrent.TimeUnit;
public class TestPhoneActivity extends AppCompatActivity {
private String mVerificationId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_phone);
findViewById(R.id.requestBtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendVerificationCode("+82"+"10"+"12345678");
}
});
findViewById(R.id.checkBtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
verifyCode(((EditText)findViewById(R.id.codeEdt)).getText().toString());
}
});
}
//인증번호 요청
private void sendVerificationCode(String phoneNumber) {
PhoneAuthOptions options = PhoneAuthOptions
.newBuilder(FirebaseAuth.getInstance())
.setPhoneNumber(number) // Phone number to verify
.setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
.setActivity(this) // Activity (for callback binding)
.setCallbacks(mCallBack) // OnVerificationStateChangedCallbacks
.build();
PhoneAuthProvider.verifyPhoneNumber(options);
}
//인증번호 확인
private void verifyCode(String code) {
PhoneAuthCredential credential
= PhoneAuthProvider.getCredential(mVerificationId, code);
signInWithCredential(credential);
}
//인증번호로 Firebase Auth 가입
private void signInWithCredential(PhoneAuthCredential credential) {
FirebaseAuth.getInstance()
.signInWithCredential(credential)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser user = task.getResult().getUser();
} else {
Toast.makeText(CheckPhoneActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
}
}
});
}
//CallBack
private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallBack
= new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onCodeSent(String s
, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
super.onCodeSent(s, forceResendingToken);
mVerificationId = s;
}
@Override
public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
final String code = phoneAuthCredential.getSmsCode();
if (code != null) {
verifyCode(code);
}
}
@Override
public void onVerificationFailed(FirebaseException e) {
Toast.makeText(CheckPhoneActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
}
};
}
출처 : https://firebase.google.com/docs/auth/android/phone-auth
반응형