SMS Retriever API
SMS Retriever API를 사용하면 사용자가 수동으로 인증 코드를 입력하지 않고도 Android 앱에서 SMS 기반 사용자 확인을 자동으로 수행할 수 있습니다.
Android 앱에서 SMS 인증 요청 | Credential Verification | Google for Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 의견 보내기 Android 앱에서 SMS 인증 요청 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
developers.google.com
SMS Retriever API 사용하기
1. build.gradle에 의존성 추가
SMS Retriever API를 사용하기 위해서 build.gradle에 SMS Retriever API 라이브러리를 추가합니다.
implementation 'com.google.android.gms:play-services-auth:20.7.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:18.0.1
2. Manifest에 SMS Retriever 등록
<receiver
android:name=".util.AuthOtpReceiver"
android:exported="true"
android:permission="com.google.android.gms.auth.api.phone.permission.SEND">
<intent-filter>
<action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED"/>
</intent-filter>
</receiver>
3. SMS Retriever 클래스 생성
사용자 기기에 인증 메시지가 성공적으로 수신되면 Play 서비스는 메시지 내용을 포함하는 SMS_RETRIEVED_ACTION 인텐트를 앱에 명시적으로 브로드캐스트합니다.
해당 인증 메시지를 수신하려면 BroadcastReceiver를 사용해야 합니다.
BroadcastReceiver의 onReceive()에서 미리 만들어놓은 Pattern을 통해 SMS 메시지를 파싱하여 인증번호를 추출합니다.
/**
* SMS의 규칙
* 1. SMS 내용은 140byte 이하여야 합니다.
* 2. SMS 맨 앞은 <#>라는 Text로 시작해야 합니다.
* 3. SMS 맨 마지막은 앱을 식별하는 11글자 해시 문자열로 끝나야 합니다.
* ex) <#> [앱 이름] 인증번호는 [1234] 입니다. 0QaSrUKkEGq
*/
class AuthOtpReceiver : BroadcastReceiver() {
companion object {
private const val PATTERN = "^<#>.*\\[${R.string.app_name}\\].+\\[(\\d{6})\\].+\$"
}
interface OtpReceiveListener {
fun onOtpReceived(otp: String)
}
private var otpReceiver: OtpReceiveListener? = null
override fun onReceive(context: Context, intent: Intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION == intent.action) {
intent.extras?.let { bundle ->
val status = bundle.get(SmsRetriever.EXTRA_STATUS) as Status
when (status.statusCode) {
CommonStatusCodes.SUCCESS -> {
val otpSms = bundle.getString(SmsRetriever.EXTRA_SMS_MESSAGE, "")
if (otpReceiver != null && otpSms.isNotEmpty()) {
val otp = PATTERN.toRegex().find(otpSms)?.destructured?.component1()
if (!otp.isNullOrEmpty()) {
otpReceiver!!.onOtpReceived(otp)
}
}
}
}
}
}
}
fun setOtpListener(receiver: OtpReceiveListener) {
this.otpReceiver = receiver
}
fun doFilter() = IntentFilter().apply {
addAction(SmsRetriever.SMS_RETRIEVED_ACTION)
}
}
4. Activity에서 적용
AuthOtpReceiver 객체의 인스턴스를 가져와 startSmsRetriever()를 호출하고 성공 리스너와 실패 리스너를 연결합니다.
private var smsReceiver: AuthOtpReceiver? = null
private fun startSmsRetriever() {
SmsRetriever.getClient(this).startSmsRetriever().also { task ->
task.addOnSuccessListener {
if (smsReceiver == null) {
smsReceiver = AuthOtpReceiver().apply {
setOtpListener(this@VerifyOtpActivity)
}
}
registerReceiver(smsReceiver, smsReceiver!!.doFilter())
}
task.addOnFailureListener {
stopSmsRetriever()
}
}
}
private fun stopSmsRetriever() {
if (smsReceiver != null) {
unregisterReceiver(smsReceiver)
smsReceiver = null
}
}
728x90
반응형
'안드로이드 > 활용' 카테고리의 다른 글
[Android] Coil 사용하기 (0) | 2023.10.24 |
---|---|
[Android] CountDownTimer 사용하기 (0) | 2023.10.11 |
[Android] BindingAdapter 사용하기 (0) | 2023.10.09 |
[Android] ML Kit를 사용하여 얼굴 인식 (0) | 2023.10.07 |
[Android] CameraX 사용하기 (0) | 2023.10.06 |