با یک ضربه حساب جدید ایجاد کنید

اگر از ورود به سیستم با حساب‌های Google پشتیبانی می‌کنید، می‌توانید از سرویس گیرنده ورود به سیستم با یک ضربه استفاده کنید تا به کاربران خود تجربه ایجاد حساب بدون اصطکاک را ارائه دهید که هرگز آنها را از متن برنامه شما خارج نمی‌کند.

رابط کاربری ثبت نام با یک ضربه

وقتی رابط کاربری One Tap را نمایش می‌دهید، از کاربران خواسته می‌شود با استفاده از یکی از حساب‌های Google در دستگاه خود یک حساب کاربری جدید با برنامه شما ایجاد کنند. اگر کاربر ادامه را انتخاب کند، یک کد شناسه با اطلاعات اصلی نمایه - نام، عکس نمایه و آدرس ایمیل تأیید شده او - دریافت می‌کنید که می‌توانید از آن برای ایجاد حساب جدید استفاده کنید.

پیاده سازی ایجاد حساب کاربری One Tap دارای دو بخش است:

  • ادغام سرویس گیرنده One Tap در برنامه خود، که در این صفحه توضیح داده شده است. این بیشتر مانند استفاده از ورود به سیستم One Tap است، اما با برخی تفاوت‌ها در پیکربندی.
  • افزودن قابلیت ایجاد حساب‌های کاربری از توکن‌های Google ID به باطن شما، که در استفاده از نشانه‌های ID در باطن مورد بحث قرار گرفته است.

کجا باید از ثبت نام One Tap استفاده کنم؟

تاثیرگذارترین مکان برای ارائه ثبت نام One Tap به کاربران در شرایطی است که ورود به سیستم ویژگی های جدیدی را فعال می کند. ابتدا سعی کنید کاربر را با یک اعتبار ذخیره شده وارد کنید. اگر اعتبار ذخیره شده ای یافت نشد، پیشنهاد ایجاد یک حساب کاربری جدید برای کاربر را بدهید.

قبل از اینکه شروع کنی

پروژه کنسول Google APIs و پروژه Android خود را همانطور که در شروع با ورود به سیستم با One Tap توضیح داده شده است، تنظیم کنید.

1. سرویس گیرنده One Tap را پیکربندی کنید

برای پیکربندی مشتری One Tap برای ایجاد حساب، موارد زیر را انجام دهید:

  • درخواست های اعتبار رمز عبور را فعال نکنید. (ثبت نام با یک ضربه فقط با احراز هویت مبتنی بر توکن امکان پذیر است.)
  • با استفاده از setGoogleIdTokenRequestOptions() و این تنظیمات، درخواست‌های رمز Google ID را فعال کنید:

جاوا

public class YourActivity extends AppCompatActivity {

  // ...

  private SignInClient oneTapClient;
  private BeginSignInRequest signUpRequest;

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState,
                       @Nullable PersistableBundle persistentState) {
      super.onCreate(savedInstanceState, persistentState);

      oneTapClient = Identity.getSignInClient(this);
      signUpRequest = BeginSignInRequest.builder()
              .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder()
                      .setSupported(true)
                      // Your server's client ID, not your Android client ID.
                      .setServerClientId(getString(R.string.your_web_client_id))
                      // Show all accounts on the device.
                      .setFilterByAuthorizedAccounts(false)
                      .build())
              .build();

      // ...
  }
}

کاتلین

class YourActivity : AppCompatActivity() {
    // ...

    private lateinit var oneTapClient: SignInClient
    private lateinit var signUpRequest: BeginSignInRequest

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        oneTapClient = Identity.getSignInClient(this)
        signUpRequest = BeginSignInRequest.builder()
            .setGoogleIdTokenRequestOptions(
                BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                    .setSupported(true)
                    // Your server's client ID, not your Android client ID.
                    .setServerClientId(getString(R.string.your_web_client_id))
                    // Show all accounts on the device.
                    .setFilterByAuthorizedAccounts(false)
                    .build())
            .build()
        // ...
    }
    // ...
}

2. لغو One Tap UI را پیگیری کنید

باید پیگیری کنید که آیا کاربر قبلاً از استفاده از ثبت نام با One Tap خودداری کرده است یا با بستن فرمان یا ضربه زدن در خارج از آن. این می تواند به سادگی یک ویژگی بولی از Activity شما باشد. ( به توقف نمایش رابط کاربری One Tap در زیر مراجعه کنید.)

3. رابط کاربری ثبت نام با یک ضربه را نمایش دهید

اگر کاربر استفاده از One Tap را برای ایجاد یک حساب جدید رد نکرده است، متد beginSignIn() شی مشتری را فراخوانی کرده و شنوندگان را به Task که برمی‌گرداند متصل کنید. برنامه‌ها معمولاً این مرحله را زمانی انجام می‌دهند که یک درخواست ورود به سیستم با یک ضربه، هیچ اعتبار ذخیره‌شده‌ای را پیدا نمی‌کند - یعنی در شنونده شکست درخواست ورود به سیستم.

اگر کاربر یک یا چند حساب Google روی دستگاه تنظیم کرده باشد، مشتری One Tap با شنونده موفق تماس می گیرد. در موفقیت شنونده، هدف معلق را از نتیجه Task دریافت کنید و آن را به startIntentSenderForResult() ارسال کنید تا رابط کاربری One Tap شروع شود.

اگر کاربر هیچ حساب Google در دستگاه نداشته باشد، سرویس گیرنده One Tap با شنونده شکست تماس می گیرد. در این مورد، هیچ اقدامی لازم نیست: شما به سادگی می توانید به ارائه تجربه خروج از سیستم برنامه ادامه دهید، و کاربر می تواند با جریان ایجاد حساب عادی شما ثبت نام کند.

جاوا

oneTapClient.beginSignIn(signUpRequest)
        .addOnSuccessListener(this, new OnSuccessListener<BeginSignInResult>() {
            @Override
            public void onSuccess(BeginSignInResult result) {
                try {
                    startIntentSenderForResult(
                            result.getPendingIntent().getIntentSender(), REQ_ONE_TAP,
                            null, 0, 0, 0);
                } catch (IntentSender.SendIntentException e) {
                    Log.e(TAG, "Couldn't start One Tap UI: " + e.getLocalizedMessage());
                }
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // No Google Accounts found. Just continue presenting the signed-out UI.
                Log.d(TAG, e.getLocalizedMessage());
            }
        });

کاتلین

oneTapClient.beginSignIn(signUpRequest)
    .addOnSuccessListener(this) { result ->
        try {
            startIntentSenderForResult(
                result.pendingIntent.intentSender, REQ_ONE_TAP,
                null, 0, 0, 0)
        } catch (e: IntentSender.SendIntentException) {
            Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
        }
    }
    .addOnFailureListener(this) { e ->
        // No Google Accounts found. Just continue presenting the signed-out UI.
        Log.d(TAG, e.localizedMessage)
    }

4. پاسخ کاربر را مدیریت کنید

پاسخ کاربر به درخواست ثبت نام با یک ضربه با استفاده از روش onActivityResult() Activity به برنامه شما گزارش می شود. اگر کاربر ایجاد یک حساب کاربری را انتخاب کند، نتیجه یک توکن Google ID خواهد بود. اگر کاربر از ثبت نام خودداری کرد، چه با بستن رابط کاربری One Tap یا ضربه زدن در خارج از آن، نتیجه با کد RESULT_CANCELED برمی‌گردد. برنامه شما باید هر دو احتمال را مدیریت کند.

یک حساب کاربری با توکن Google ID ایجاد کنید

اگر کاربر ثبت نام با یک حساب Google را انتخاب کرد، می‌توانید با ارسال داده‌های intent از onActivityResult() به متد getSignInCredentialFromIntent() کلاینت One Tap، یک نشانه شناسه برای کاربر دریافت کنید. این اعتبار دارای ویژگی googleIdToken غیر تهی خواهد بود.

از نماد ID برای ایجاد یک حساب کاربری در باطن خود استفاده کنید (به تأیید اعتبار با یک باطن با استفاده از نشانه های ID مراجعه کنید) و کاربر را وارد سیستم کنید.

اعتبار همچنین حاوی هر گونه جزئیات اضافی است که درخواست کرده اید، مانند شماره تلفن تأیید شده حساب در صورت وجود.

جاوا

public class YourActivity extends AppCompatActivity {

  // ...
  private static final int REQ_ONE_TAP = 2;  // Can be any integer unique to the Activity.
  private boolean showOneTapUI = true;
  // ...

  @Override
  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
      super.onActivityResult(requestCode, resultCode, data);

      switch (requestCode) {
          case REQ_ONE_TAP:
              try {
                  SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data);
                  String idToken = credential.getGoogleIdToken();
                  if (idToken !=  null) {
                      // Got an ID token from Google. Use it to authenticate
                      // with your backend.
                      Log.d(TAG, "Got ID token.");
                  }
              } catch (ApiException e) {
                  // ...
              }
              break;
      }
  }
}

کاتلین

class YourActivity : AppCompatActivity() {

    // ...
    private val REQ_ONE_TAP = 2  // Can be any integer unique to the Activity
    private var showOneTapUI = true
    // ...

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        when (requestCode) {
             REQ_ONE_TAP -> {
                try {
                    val credential = oneTapClient.getSignInCredentialFromIntent(data)
                    val idToken = credential.googleIdToken
                    when {
                        idToken != null -> {
                            // Got an ID token from Google. Use it to authenticate
                            // with your backend.
                            Log.d(TAG, "Got ID token.")
                        }
                        else -> {
                            // Shouldn't happen.
                            Log.d(TAG, "No ID token!")
                        }
                    }
                } catch (e: ApiException) {
                    // ...
            }
        }
    }
    // ...
}

نمایش رابط کاربری One Tap را متوقف کنید

اگر کاربر ورود به سیستم را نپذیرفت، تماس با getSignInCredentialFromIntent() یک ApiException با کد وضعیت CommonStatusCodes.CANCELED ایجاد می کند. وقتی این اتفاق می‌افتد، باید به طور موقت نمایش رابط کاربری One Tap را متوقف کنید تا کاربران خود را با درخواست‌های مکرر آزار ندهید. مثال زیر این کار را با تنظیم یک ویژگی در Activity انجام می دهد، که از آن برای تعیین اینکه آیا به کاربر ورود با یک ضربه را ارائه می دهد یا خیر، استفاده می کند. با این حال، شما همچنین می توانید یک مقدار را در SharedPreferences ذخیره کنید یا از روش دیگری استفاده کنید.

این مهم است که محدودیت نرخ خود را برای درخواست‌های ورود به سیستم با یک ضربه اجرا کنید. اگر این کار را نکنید و یک کاربر چندین درخواست را پشت سر هم لغو کند، مشتری One Tap تا 24 ساعت آینده از کاربر درخواست نخواهد کرد.

جاوا

public class YourActivity extends AppCompatActivity {

  // ...
  private static final int REQ_ONE_TAP = 2;  // Can be any integer unique to the Activity.
  private boolean showOneTapUI = true;
  // ...

  @Override
  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
      super.onActivityResult(requestCode, resultCode, data);

      switch (requestCode) {
          case REQ_ONE_TAP:
              try {
                  // ...
              } catch (ApiException e) {
                  switch (e.getStatusCode()) {
                      case CommonStatusCodes.CANCELED:
                          Log.d(TAG, "One-tap dialog was closed.");
                          // Don't re-prompt the user.
                          showOneTapUI = false;
                          break;
                      case CommonStatusCodes.NETWORK_ERROR:
                          Log.d(TAG, "One-tap encountered a network error.");
                          // Try again or just ignore.
                          break;
                      default:
                          Log.d(TAG, "Couldn't get credential from result."
                                  + e.getLocalizedMessage());
                          break;
                  }
              }
              break;
      }
  }
}

کاتلین

class YourActivity : AppCompatActivity() {

    // ...
    private val REQ_ONE_TAP = 2  // Can be any integer unique to the Activity
    private var showOneTapUI = true
    // ...

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        when (requestCode) {
            REQ_ONE_TAP -> {
                try {
                    // ...
                } catch (e: ApiException) {
                    when (e.statusCode) {
                        CommonStatusCodes.CANCELED -> {
                            Log.d(TAG, "One-tap dialog was closed.")
                            // Don't re-prompt the user.
                            showOneTapUI = false
                        }
                        CommonStatusCodes.NETWORK_ERROR -> {
                            Log.d(TAG, "One-tap encountered a network error.")
                            // Try again or just ignore.
                        }
                        else -> {
                            Log.d(TAG, "Couldn't get credential from result." +
                                " (${e.localizedMessage})")
                        }
                    }
                }
            }
        }
    }
    // ...
}

مراحل بعدی

هنگامی که یک کاربر جریان ثبت نام با یک ضربه را کامل می کند، یک نشانه Google ID دریافت می کنید که شامل برخی از اطلاعات اولیه نمایه است: آدرس ایمیل کاربر، نام کامل، و URL تصویر نمایه. برای بسیاری از برنامه‌ها، این اطلاعات برای احراز هویت کاربر و ایجاد یک حساب کاربری جدید کافی است.

اگر برای تکمیل ایجاد حساب به اطلاعات بیشتری نیاز دارید - به عنوان مثال، تاریخ تولد کاربر - یک جریان جزئیات ثبت نام را به کاربر ارائه دهید، جایی که شما این اطلاعات اضافی را درخواست می کنید. سپس، آن را به باطن خود ارسال کنید تا ایجاد حساب کامل شود.