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

بعد استرداد بيانات اعتماد المستخدم أو استرداد تلميحات تسجيل الدخول، يمكنك التحقق مما إذا كان الرمز المميز للمعرّف متاحًا لبيانات الاعتماد. الرمز المميّز للمعرّف هو تأكيد موقَّع لهوية المستخدم يحتوي أيضًا على معلومات الملف الشخصي الأساسية للمستخدم، وقد يتضمن عنوان بريد إلكتروني تحققت منه 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 API للغة 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 للحصول على مزيد من التفاصيل.