تسجيل الدخول باستخدام الرموز المميّزة للمعرّفات

بعد استرداد بيانات اعتماد المستخدم أو استرداد تلميحات تسجيل الدخول بنجاح، يمكنك التحقّق مما إذا كان رمز التعريف متاحًا لبيانات الاعتماد. رمز التعريف هو تأكيد موقّع لهوية المستخدم ويتضمّن أيضًا معلومات الملف الشخصي الأساسية للمستخدم، وقد يتضمّن عنوان بريد إلكتروني تم إثبات ملكيته من خلال Google. عند توفّر رموز التعريف، يمكنك استخدامها للمصادقة بشكل آمن مع الخلفية البرمجية لتطبيقك، أو لتخطّي خطوة تأكيد عنوان البريد الإلكتروني عند إنشاء حساب جديد.

يتوفّر رمز مميّز للمعرّف عندما يتطابق معرّف المستخدم الخاص بكائن Credential مع معرّف المستخدم الخاص بحساب Google الذي تم تسجيل الدخول إليه على الجهاز.

لتسجيل الدخول باستخدام رمز مميّز للمعرّف، عليك أولاً استرداد الرمز المميز للمعرّف باستخدام طريقة getIdTokens. بعد ذلك، أرسِل الرمز المميّز لتعريف الهوية إلى الخلفية في تطبيقك. في الخلفية، تحقَّق من صحة الرمز المميّز باستخدام إحدى مكتبات برامج Google API أو إحدى مكتبات JWT للأغراض العامة.

قبل البدء

الحصول على رمز مميّز للمعرّف من عنصر بيانات الاعتماد

بعد استرداد بيانات اعتماد المستخدم، تحقَّق مما إذا كان العنصر Credentials يتضمّن رمز تعريف. إذا كان الأمر كذلك، اتّصِل بالرقم getIdTokens لاسترداده، وأرسِله إلى الخلفية باستخدام HTTPS POST.

if (!credential.getIdTokens().isEmpty()) {
    String idToken = credential.getIdTokens().get(0).getIdToken();

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("https://yourbackend.example.com/tokensignin");

    try {
        List nameValuePairs = new ArrayList(1);
        nameValuePairs.add(new BasicNameValuePair("idToken", idToken));
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpClient.execute(httpPost);
        int statusCode = response.getStatusLine().getStatusCode();
        final String responseBody = EntityUtils.toString(response.getEntity());
        Log.i(TAG, "Signed in as: " + responseBody);
    }
}

التحقّق من رمز التعريف على الخلفية

بعد تلقّي رمز التعريف من خلال HTTPS POST، عليك التحقّق من توقيع الرمز والتحقّق من مطالبات aud وiss وexp الخاصة بالرمز.

تتضمّن مطالبة aud برمز تعريف من خدمة "Smart Lock لكلمات المرور" التنسيق التالي:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

القيمة SHA512HASH هي تجزئة SHA-512 لشهادة التوقيع. يمكنك الحصول على هذه القيمة باستخدام الأداتَين المساعدتَين keytool وopenssl:

keytool -exportcert -keystore path-to-keystore -alias key-name 
| openssl sha -sha512 -binary
| base64 -w 0
| tr '+/' '-
'

أو يمكنك الحصول على قيمة التجزئة SHA-512 من خلال فحص رمز مميّز صالح تعرفه.

يمكن لمكتبات JWT معالجة بعض مهام التحقّق هذه نيابةً عنك. على سبيل المثال، باستخدام مكتبة Google Auth للغة Java:

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;

...

// Verifier that checks that the token has the proper issuer and audience,
// and hasn't expired
private static GoogleIdTokenVerifier verifier =
    new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(String.format("android://%s@%s", SHA512_HASH, PACKAGE_NAME)))
        .build();

// (Receive idTokenString by HTTPS POST)

GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
  Payload payload = idToken.getPayload();
  System.out.println("User email: " + payload.getEmail());
  if (payload.getEmailVerified()) {
    System.out.println("Email verified by Google.");
  }
} else {
  System.out.println("Invalid ID token.");
}

لمزيد من التفاصيل، يُرجى الاطّلاع على مستندات "تسجيل الدخول باستخدام Google".