ورود به سیستم حساب پیوندی برای Android

ورود به سیستم با حساب کاربری مرتبط، ورود با یک ضربه با گوگل را برای کاربرانی که از قبل حساب گوگل خود را به سرویس شما متصل کرده‌اند، امکان‌پذیر می‌کند. این امر تجربه کاربران را بهبود می‌بخشد زیرا می‌توانند با یک کلیک و بدون وارد کردن مجدد نام کاربری و رمز عبور خود وارد سیستم شوند. همچنین احتمال ایجاد حساب‌های تکراری توسط کاربران در سرویس شما را کاهش می‌دهد.

ورود به حساب کاربری لینک‌شده به عنوان بخشی از جریان ورود با یک لمس برای اندروید در دسترس است. این بدان معناست که اگر برنامه شما از قبل ویژگی «ورود با یک لمس» را فعال کرده باشد، نیازی به وارد کردن کتابخانه جداگانه ندارید.

در این سند، شما یاد خواهید گرفت که چگونه برنامه اندروید خود را برای پشتیبانی از ورود به سیستم با حساب کاربری لینک‌شده تغییر دهید.

چگونه کار می‌کند؟

  1. شما انتخاب می‌کنید که حساب‌های کاربری مرتبط در طول فرآیند ورود با یک ضربه نمایش داده شوند.
  2. اگر کاربر در گوگل وارد سیستم شده باشد و حساب گوگل خود را به حساب خود در سرویس شما متصل کرده باشد، یک توکن شناسایی برای حساب متصل شده بازگردانده می‌شود.
  3. به کاربر یک اعلان ورود با یک لمس نمایش داده می‌شود که در آن گزینه‌ای برای ورود به سرویس شما با حساب کاربری مرتبط شده‌اش وجود دارد.
  4. اگر کاربر تصمیم به ادامه با حساب کاربری لینک‌شده بگیرد، توکن شناسه کاربر به برنامه شما بازگردانده می‌شود. شما این توکن را با توکنی که در مرحله ۲ به سرور شما ارسال شده است، مطابقت می‌دهید تا کاربر وارد شده را شناسایی کنید.

راه‌اندازی

محیط توسعه خود را تنظیم کنید

جدیدترین سرویس‌های گوگل پلی را روی میزبان توسعه خود دریافت کنید:

  1. مدیر SDK اندروید را باز کنید.
  1. در بخش ابزارهای SDK ، سرویس‌های Google Play را پیدا کنید.

  2. اگر وضعیت این بسته‌ها «نصب‌شده» نیست، هر دو را انتخاب کرده و روی «نصب بسته‌ها» کلیک کنید.

برنامه خود را پیکربندی کنید

  1. در فایل build.gradle در سطح پروژه، مخزن Maven گوگل را هم در بخش‌های buildscript و هم در بخش allprojects وارد کنید.

    buildscript {
        repositories {
            google()
        }
    }
    
    allprojects {
        repositories {
            google()
        }
    }
    
  2. وابستگی‌های API مربوط به "Link with Google" را به فایل gradle سطح برنامه ماژول خود که معمولاً app/build.gradle است، اضافه کنید:

    dependencies {
      implementation 'com.google.android.gms:play-services-auth:21.3.0'
    }
    

برنامه اندروید خود را برای پشتیبانی از ورود به حساب کاربری لینک‌شده اصلاح کنید

در پایان جریان ورود به حساب کاربری لینک‌شده، یک توکن شناسه به برنامه شما بازگردانده می‌شود. قبل از ورود کاربر، صحت توکن شناسه باید تأیید شود.

نمونه کد زیر مراحل بازیابی، تأیید توکن شناسه و متعاقباً ورود کاربر را شرح می‌دهد.

  1. یک اکتیویتی ایجاد کنید تا نتیجه‌ی هدف ورود (Sign-In intent) را دریافت کند.

    کاتلین

      private val activityResultLauncher = registerForActivityResult(
        ActivityResultContracts.StartIntentSenderForResult()) { result ->
        if (result.resultCode == RESULT_OK) {
          try {
            val signInCredentials = Identity.signInClient(this)
                                    .signInCredentialFromIntent(result.data)
            // Review the Verify the integrity of the ID token section for
            // details on how to verify the ID token
            verifyIdToken(signInCredential.googleIdToken)
          } catch (e: ApiException) {
            Log.e(TAG, "Sign-in failed with error code:", e)
          }
        } else {
          Log.e(TAG, "Sign-in failed")
        }
      }
    

    جاوا

      private final ActivityResultLauncher<IntentSenderResult>
        activityResultLauncher = registerForActivityResult(
        new ActivityResultContracts.StartIntentSenderForResult(),
        result -> {
        If (result.getResultCode() == RESULT_OK) {
            try {
              SignInCredential signInCredential = Identity.getSignInClient(this)
                             .getSignInCredentialFromIntent(result.getData());
              verifyIdToken(signInCredential.getGoogleIdToken());
            } catch (e: ApiException ) {
              Log.e(TAG, "Sign-in failed with error:", e)
            }
        } else {
            Log.e(TAG, "Sign-in failed")
        }
    });
    
  2. درخواست ورود را بسازید

    کاتلین

    private val tokenRequestOptions =
    GoogleIdTokenRequestOptions.Builder()
      .supported(true)
      // Your server's client ID, not your Android client ID.
      .serverClientId(getString("your-server-client-id")
      .filterByAuthorizedAccounts(true)
      .associateLinkedAccounts("service-id-of-and-defined-by-developer",
                               scopes)
      .build()
    

    جاوا

     private final GoogleIdTokenRequestOptions tokenRequestOptions =
         GoogleIdTokenRequestOptions.Builder()
      .setSupported(true)
      .setServerClientId("your-service-client-id")
      .setFilterByAuthorizedAccounts(true)
      .associateLinkedAccounts("service-id-of-and-defined-by-developer",
                                scopes)
      .build()
    
  3. اجرای هدف ورود به سیستم در انتظار

    کاتلین

     Identity.signInClient(this)
        .beginSignIn(
      BeginSignInRequest.Builder()
        .googleIdTokenRequestOptions(tokenRequestOptions)
      .build())
        .addOnSuccessListener{result ->
          activityResultLauncher.launch(result.pendingIntent.intentSender)
      }
      .addOnFailureListener {e ->
        Log.e(TAG, "Sign-in failed because:", e)
      }
    

    جاوا

     Identity.getSignInClient(this)
      .beginSignIn(
        BeginSignInRequest.Builder()
          .setGoogleIdTokenRequestOptions(tokenRequestOptions)
          .build())
      .addOnSuccessListener(result -> {
        activityResultLauncher.launch(
            result.getPendingIntent().getIntentSender());
    })
    .addOnFailureListener(e -> {
      Log.e(TAG, "Sign-in failed because:", e);
    });
    

صحت شناسه توکن را تأیید کنید

استفاده از کتابخانه کلاینت API گوگل

استفاده از کتابخانه کلاینت API گوگل جاوا ، روش پیشنهادی برای اعتبارسنجی توکن‌های شناسه گوگل در محیط عملیاتی است.

جاوا

  import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
  import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
  import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;

  ...

  GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
      // Specify the CLIENT_ID of the app that accesses the backend:
      .setAudience(Collections.singletonList(CLIENT_ID))
      // Or, if multiple clients access the backend:
      //.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
      .build();

  // (Receive idTokenString by HTTPS POST)

  GoogleIdToken idToken = verifier.verify(idTokenString);
  if (idToken != null) {
    Payload payload = idToken.getPayload();

    // Print user identifier
    String userId = payload.getSubject();
    System.out.println("User ID: " + userId);

    // Get profile information from payload
    String email = payload.getEmail();
    boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
    String name = (String) payload.get("name");
    String pictureUrl = (String) payload.get("picture");
    String locale = (String) payload.get("locale");
    String familyName = (String) payload.get("family_name");
    String givenName = (String) payload.get("given_name");

    // Use or store profile information
    // ...

  } else {
    System.out.println("Invalid ID token.");
  }

متد GoogleIdTokenVerifier.verify() امضای JWT، ادعای aud ، ادعای iss و ادعای exp آنها را تأیید می‌کند.

اگر نیاز دارید تأیید کنید که توکن شناسه، نشان‌دهنده‌ی یک حساب سازمانی Google Workspace یا Cloud است، می‌توانید ادعای hd را با بررسی نام دامنه‌ی برگردانده شده توسط متد Payload.getHostedDomain() تأیید کنید.