본문 바로가기
개발/Android

[Android] 전화번호 인증 - Firebase SMS

by 바이너리10 2021. 6. 23.
반응형

전화번호 인증의 목적

 

  • 서비스 전반의 스팸이나 악용 사례를 방지
  • 사용자 정보 수집

 

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

 

반응형