طلب موافقة لمرّة واحدة لقراءة رمز إثبات الهوية عبر الرسائل القصيرة SMS

توضّح هذه الصفحة كيفية استخدام واجهة برمجة التطبيقات لطلب موافقة المستخدم في تطبيق SMS لطلب موافقة المستخدم. لقراءة رسالة تحقق واحدة عبر الرسائل القصيرة SMS. وفي حال موافقة المستخدِم، تعرض واجهة برمجة التطبيقات نص الرسالة، الذي يمكنك منه الحصول على رمز التحقق لإكمال عملية التحقق.

تثبيت الملحقات

ضمِّن مكوّن المصادقة في "خدمات Play" في ملف build.gradle لتطبيقك:

implementation 'com.google.android.gms:play-services-auth:17.0.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:17.4.0'

1. الحصول على رقم هاتف المستخدم

إذا لم يكن لديك رقم هاتف المستخدم، يُرجى طلبه قبل بدء رسالة SMS. عملية إثبات الملكية.

يمكنك الحصول على رقم هاتف المستخدم بما يناسب التطبيق. ننصحك باستخدام أداة اختيار تلميحات ميزة "Smart Lock لكلمات المرور" لمساعدة المستخدم في ملء رقم هاتفه إذا لم تكن هذه المعلومات مطلوبة لإنشاء حساب المستخدم. لاستخدام أداة اختيار التلميحات:

Kotlin

private val CREDENTIAL_PICKER_REQUEST = 1  // Set to an unused request code

// Construct a request for phone numbers and show the picker
private fun requestHint() {
    val hintRequest = HintRequest.Builder()
        .setPhoneNumberIdentifierSupported(true)
        .build()
    val credentialsClient = Credentials.getClient(this)
    val intent = credentialsClient.getHintPickerIntent(hintRequest)
    startIntentSenderForResult(
        intent.intentSender,
        CREDENTIAL_PICKER_REQUEST,
        null, 0, 0, 0
    )
}

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    when (requestCode) {
        CREDENTIAL_PICKER_REQUEST ->
            // Obtain the phone number from the result
            if (resultCode == Activity.RESULT_OK && data != null) {
                val credential = data.getParcelableExtra<Credential>(Credential.EXTRA_KEY)
                // credential.getId();  <-- will need to process phone number string
            }
        // ...
    }
}

Java

private static final int CREDENTIAL_PICKER_REQUEST = 1;  // Set to an unused request code

// Construct a request for phone numbers and show the picker
private void requestHint() throws IntentSender.SendIntentException {
    HintRequest hintRequest = new HintRequest.Builder()
            .setPhoneNumberIdentifierSupported(true)
            .build();
    PendingIntent intent = Credentials.getClient(this).getHintPickerIntent(hintRequest);
    startIntentSenderForResult(intent.getIntentSender(),
            RESOLVE_HINT, null, 0, 0, 0);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case CREDENTIAL_PICKER_REQUEST:
            // Obtain the phone number from the result
            if (resultCode == RESULT_OK) {
                Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
                // credential.getId();  <-- will need to process phone number string
            }
            break;
        // ...
    }
}

2. بدء الاستماع إلى الرسائل الواردة

بعد ذلك، عليك استدعاء طريقة startSmsUserConsent() في واجهة برمجة التطبيقات لـ SMS User Consent API للبدء الاستماع إلى الرسائل الواردة. إذا كنت تعرف رقم الهاتف الذي ترسل منه رسالة SMS ستنشئ رسالة، حددها (وإلا، انقر على null). بهذه الطريقة، ترسل SMS لن تظهر واجهة برمجة التطبيقات Consent API إلا على الرسائل الواردة من هذا الرقم.

لبدء الاستماع:

Kotlin

// Start listening for SMS User Consent broadcasts from senderPhoneNumber
// The Task<Void> will be successful if SmsRetriever was able to start
// SMS User Consent, and will error if there was an error starting.
val task = SmsRetriever.getClient(context).startSmsUserConsent(senderPhoneNumber /* or null */)

Java

// Start listening for SMS User Consent broadcasts from senderPhoneNumber
// The Task<Void> will be successful if SmsRetriever was able to start
// SMS User Consent, and will error if there was an error starting.
Task<Void> task = SmsRetriever.getClient(context).startSmsUserConsent(senderPhoneNumber /* or null */);

بمجرد الاستماع إلى الرسائل القصيرة SMS الواردة، يمكنك التحقق من إرسال رمز التحقق إلى رقم هاتف المستخدم، الذي أدخلته الخطوة الأولى.

خلال الدقائق الخمس التالية، عندما يتلقّى الجهاز رسالة SMS تحتوي على رمز يُستخدم لمرة واحدة، ستُبث "خدمات Play" على تطبيقك بغرض طلب على المستخدم الحصول على إذن لقراءة الرسالة. عند ظهور رسالة، يبدأ البث إذا كانت تستوفي المعايير التالية فقط:

  • تحتوي الرسالة على سلسلة من 4 إلى 10 أحرف أبجدية رقمية مع حرف واحد على الأقل الصف.
  • إذا حددت رقم هاتف المُرسِل، يعني هذا أنّ الرسالة هي المرسَلة من خلاله. الصف.

التعامل مع عمليات البث هذه من خلال مستقبِل بث يتضمّن SEND_PERMISSION إذن ويستجيب على SMS_RETRIEVED_ACTION أغراض. لإنشاء تسجيل مستقبل البث:

Kotlin

private val SMS_CONSENT_REQUEST = 2  // Set to an unused request code
private val smsVerificationReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (SmsRetriever.SMS_RETRIEVED_ACTION == intent.action) {
            val extras = intent.extras
            val smsRetrieverStatus = extras?.get(SmsRetriever.EXTRA_STATUS) as Status

            when (smsRetrieverStatus.statusCode) {
                CommonStatusCodes.SUCCESS -> {
                    // Get consent intent
                    val consentIntent = extras.getParcelable<Intent>(SmsRetriever.EXTRA_CONSENT_INTENT)
                    try {
                        // Start activity to show consent dialog to user, activity must be started in
                        // 5 minutes, otherwise you'll receive another TIMEOUT intent
                        startActivityForResult(consentIntent, SMS_CONSENT_REQUEST)
                    } catch (e: ActivityNotFoundException) {
                        // Handle the exception ...
                    }
                }
                CommonStatusCodes.TIMEOUT -> {
                    // Time out occurred, handle the error.
                }
            }
        }
    }
}

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    val intentFilter = IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION)
    registerReceiver(smsVerificationReceiver, SmsRetriever.SEND_PERMISSION, intentFilter)
}

Java

private static final int SMS_CONSENT_REQUEST = 2;  // Set to an unused request code
private final BroadcastReceiver smsVerificationReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
            Bundle extras = intent.getExtras();
            Status smsRetrieverStatus = (Status) extras.get(SmsRetriever.EXTRA_STATUS);

            switch (smsRetrieverStatus.getStatusCode()) {
                case CommonStatusCodes.SUCCESS:
                    // Get consent intent
                    Intent consentIntent = extras.getParcelable(SmsRetriever.EXTRA_CONSENT_INTENT);
                    try {
                        // Start activity to show consent dialog to user, activity must be started in
                        // 5 minutes, otherwise you'll receive another TIMEOUT intent
                        startActivityForResult(consentIntent, SMS_CONSENT_REQUEST);
                    } catch (ActivityNotFoundException e) {
                        // Handle the exception ...
                    }
                    break;
                case CommonStatusCodes.TIMEOUT:
                    // Time out occurred, handle the error.
                    break;
            }
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // ...

    IntentFilter intentFilter = new IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION);
    registerReceiver(smsVerificationReceiver, SmsRetriever.SEND_PERMISSION, intentFilter);
}

من خلال بدء نشاط لـ "EXTRA_CONSENT_INTENT"، ستطلب من المستخدم إذن لمرة واحدة لقراءة محتويات الرسالة.

3- الحصول على رمز التحقّق من رسالة

في طريقة onActivityResult()، يمكنك التعامل مع ردّ المستخدم على طلبك. للحصول على الإذن. إذا حصلت على رمز نتيجة RESULT_OK، يعني ذلك أنّ المستخدم قد منحك إذنًا بقراءة محتوى الرسالة، ويمكنك الحصول على نص الرسالة عن المقصد المطلوب.

Kotlin

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    when (requestCode) {
        // ...
        SMS_CONSENT_REQUEST ->
            // Obtain the phone number from the result
            if (resultCode == Activity.RESULT_OK && data != null) {
                // Get SMS message content
                val message = data.getStringExtra(SmsRetriever.EXTRA_SMS_MESSAGE)
                // Extract one-time code from the message and complete verification
                // `message` contains the entire text of the SMS message, so you will need
                // to parse the string.
                val oneTimeCode = parseOneTimeCode(message) // define this function

                // send one time code to the server
            } else {
                // Consent denied. User can type OTC manually.
            }
    }
}

Java

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        // ...
        case SMS_CONSENT_REQUEST:
            if (resultCode == RESULT_OK) {
                // Get SMS message content
                String message = data.getStringExtra(SmsRetriever.EXTRA_SMS_MESSAGE);
                // Extract one-time code from the message and complete verification
                // `sms` contains the entire text of the SMS message, so you will need
                // to parse the string.
                String oneTimeCode = parseOneTimeCode(message); // define this function

                // send one time code to the server
            } else {
                // Consent canceled, handle the error ...
            }
            break;
    }
}

بمجرد حصولك على نص الرسالة، يمكنك تحليل رمز التحقق ملء النموذج تلقائيًا أو إكمال عملية إثبات الملكية