المصادقة على الأجهزة القابلة للارتداء

يمكن تشغيل تطبيقات Wear OS بشكل مستقل بدون تطبيق مصاحب. وهذا يعني أنّ تطبيق Wear OS يحتاج إلى إدارة المصادقة بنفسه عند الوصول إلى البيانات من الإنترنت. ولكنّ حجم الشاشة الصغير في الساعة وإمكانات الإدخال المخفّضة يحدّ من خيارات المصادقة التي يمكن أن يستخدمها تطبيق Wear OS.

يتناول هذا الدليل طرق المصادقة المقترَحة لتطبيقات Wear OS والبدائل المتاحة عندما لا تتناسب هذه الطرق مع حالة استخدام التطبيق.

للاطّلاع على مزيد من المعلومات حول كيفية تصميم تجربة جيدة لتسجيل الدخول، يمكنك مراجعة دليل تجربة المستخدم لتسجيل الدخول.

وضع الضيف

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

يمكن للمستخدمين اكتشاف تطبيق Wear OS وتثبيته بدون استخدام التطبيق المتوافق مع الأجهزة الجوّالة، لذلك قد لا يكون لديهم حساب وقد لا يعرفون الميزات التي يقدّمها. تأكّد من أن وظيفة "وضع الضيف" تعرض ميزات تطبيقك بدقة.

طرق المصادقة المقترَحة

يمكنك استخدام طرق المصادقة التالية لتفعيل تطبيقات Wear OS المستقلّة من أجل الحصول على بيانات اعتماد مصادقة المستخدم.

تمرير الرموز المميّزة باستخدام طبقة البيانات

يمكن للتطبيق المصاحب للهاتف نقل بيانات المصادقة بأمان إلى تطبيق Wear OS باستخدام طبقة البيانات القابلة للارتداء. نقل بيانات الاعتماد كرسائل أو عناصر بيانات

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

ملاحظة مهمة: يجب أن يوفّر تطبيق Wear OS طريقة مصادقة واحدة أخرى على الأقل، لأنّ هذا الخيار لا يعمل إلا على الساعات المقترنة بنظام التشغيل Android عند تثبيت التطبيق المتوافق مع الأجهزة الجوّالة. يمكنك توفير طريقة مصادقة بديلة للمستخدمين الذين ليس لديهم التطبيق المتوافق مع الأجهزة الجوّالة أو الذين تم إقران أجهزتهم التي تعمل بنظام التشغيل Wear OS بجهاز iOS.

مرر الرموز المميزة باستخدام طبقة البيانات من تطبيق الجوّال، كما هو موضح في المثال التالي:

val token = "..." // Auth token to transmit to the wearable device.
val dataClient: DataClient = Wearable.getDataClient(context)
val putDataReq: PutDataRequest = PutDataMapRequest.create("/auth").run {
    dataMap.putString("token", token)
    asPutDataRequest()
}
val putDataTask: Task<DataItem> = dataClient.putDataItem(putDataReq)

استمع إلى أحداث تغيير البيانات على تطبيق الساعة الذكية كما هو موضّح في المثال التالي:

val dataClient: DataClient = Wearable.getDataClient(context)
dataClient.addListener{ dataEvents ->
    dataEvents.forEach { event ->
        if (event.type == DataEvent.TYPE_CHANGED) {
            val dataItemPath = event.dataItem.uri.path ?: ""
            if (dataItemPath.startsWith("/auth")) {
                val token = DataMapItem.fromDataItem(event.dataItem).dataMap.getString("token")
                // Display interstitial screen to notify the user they are being signed in.
                // Then, store the token and use it in network requests.
            }
        }
    }
}

لمزيد من المعلومات حول استخدام طبقة البيانات القابلة للارتداء، يمكنك الاطّلاع على إرسال البيانات ومزامنتها على نظام التشغيل Wear OS.

استخدام OAuth 2.0

يتوافق Wear OS مع مسارَين يستندان إلى بروتوكول OAuth 2.0 والموضّحَين في الأقسام التالية:

  • منح رمز التفويض مع مفتاح إثبات لتبادل الرموز (PKCE)، على النحو المحدّد في RFC 7636
  • منح تفويض الجهاز، على النحو المحدّد في RFC 8628

ملاحظة: للمساعدة في ضمان عدم إيقاف تشغيل التطبيق عند دخول الساعة في وضع الإضاءة السينمائية، فعِّل الإعداد "تشغيل دائم" باستخدام AmbientModeSupport.attach في النشاط الذي يجري المصادقة. لمزيد من المعلومات عن أفضل الممارسات في "وضع الاستراحة"، راجع إبقاء تطبيقك مرئيًا على Wear.

مفتاح إثبات لتبادل الرموز (PKCE)

لاستخدام PKCE بفعالية، استخدِم RemoteAuthClient.

لتنفيذ طلب مصادقة من تطبيق Wear OS إلى موفِّر بروتوكول OAuth، عليك إنشاء كائن OAuthRequest. يتألف هذا الكائن من عنوان URL لنقطة نهاية OAuth للحصول على رمز مميّز وكائن CodeChallenge. يعرض الرمز التالي مثالاً على إنشاء طلب مصادقة:

val request = OAuthRequest.Builder(this.applicationContext)
    .setAuthProviderUrl(Uri.parse("https://...."))
    .setClientId(clientId)
    .setCodeChallenge(codeChallenge)
    .build()

بعد إنشاء طلب المصادقة، أرسِله إلى التطبيق المصاحب باستخدام طريقة sendAuthorizationRequest():

val client = RemoteAuthClient.create(this)
client.sendAuthorizationRequest(request,
    { command -> command?.run() },
    object : RemoteAuthClient.Callback() {
        override fun onAuthorizationResponse(
            request: OAuthRequest,
            response: OAuthResponse
        ) {
            // Extract the token from the response, store it and use it in network requests.
        }

        override fun onAuthorizationError(errorCode: Int) {
            // Handle error
        }
    }
)

يؤدّي هذا الطلب إلى إجراء مكالمة مع التطبيق المصاحب، والذي يقدِّم بعد ذلك واجهة مستخدم للتفويض في متصفِّح ويب على الهاتف الجوّال للمستخدم. ويعمل موفِّر OAuth 2.0 على مصادقة المستخدم والحصول على موافقة المستخدم على الأذونات المطلوبة. يتم إرسال الردّ إلى عنوان URL لإعادة التوجيه الذي يتم إنشاؤه تلقائيًا.

بعد نجاح التفويض أو تعذُّر إكماله، يعيد خادم OAuth 2.0 التوجيه إلى عنوان URL المحدَّد في الطلب. إذا وافق المستخدم على طلب الوصول، سيحتوي الرد على رمز تفويض. إذا لم يوافق المستخدم على الطلب، سيحتوي الرد على رسالة خطأ.

يكون الرد في شكل سلسلة استعلام ويبدو كأحد الأمثلة التالية:

  https://wear.googleapis.com/3p_auth/com.your.package.name?code=xyz
  https://wear.googleapis-cn.com/3p_auth/com.your.package.name?code=xyz

يؤدي ذلك إلى تحميل صفحة توجّه المستخدم إلى التطبيق المصاحب. يتحقّق التطبيق المصاحب من عنوان URL للاستجابة وينقل الردّ إلى تطبيق الساعة التابع لجهة خارجية باستخدام واجهة برمجة التطبيقات onAuthorizationResponse.

يمكن لتطبيق الساعة الذكية بعد ذلك استبدال رمز التفويض برمز الدخول.

ملاحظة: بعد إنشاء OAuthRequest، يمكنك العثور على عنوان URL لإعادة التوجيه من خلال الانتقال إلى redirectUrl.

منح تفويض الجهاز

وعند استخدام "منح تفويض الجهاز"، يفتح المستخدم معرّف الموارد المنتظم (URI) لإثبات الملكية على جهاز آخر. بعد ذلك، يطلب منه خادم التفويض الموافقة على الطلب أو رفضه.

لتسهيل هذه العملية، استخدِم RemoteActivityHelper لفتح صفحة ويب على الجهاز الجوّال المقترن الخاص بالمستخدم، كما هو موضّح في المثال التالي:

// Request access from the authorization server and receive Device Authorization Response.
val verificationUri = "..." // Extracted from the Device Authorization Response.
RemoteActivityHelper.startRemoteActivity(
    this,
    Intent(Intent.ACTION_VIEW)
        .addCategory(Intent.CATEGORY_BROWSABLE)
        .setData(Uri.parse(verificationUri)),
    null
)
// Poll the authorization server to find out if the user completed the user authorization
// step on their mobile device.

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

طرق المصادقة الأخرى

يتيح Wear OS طرقًا إضافية لتسجيل الدخول على النحو الموضّح في الأقسام التالية.

تسجيل الدخول باستخدام حساب Google

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

بعد طرق المصادقة المقترَحة والموضّحة سابقًا، يُعدّ "تسجيل الدخول بحساب Google" الحلّ التالي المفضَّل، لأنّه يعمل جيدًا أيضًا على نظام التشغيل iOS. يوضّح القسم التالي كيفية إكمال عملية دمج أساسية لتسجيل الدخول بحساب Google.

المتطلّبات الأساسية

قبل البدء بدمج ميزة "تسجيل الدخول بحساب Google" في تطبيق Wear OS، عليك ضبط مشروع وحدة تحكّم واجهة برمجة تطبيقات Google وإعداد مشروعك على "استوديو Android". لمزيد من المعلومات، يُرجى الاطّلاع على بدء دمج ميزة "تسجيل الدخول بحساب Google" في تطبيق Android.

إذا كنت تستخدم ميزة "تسجيل الدخول بحساب Google" مع تطبيق أو موقع إلكتروني يتصل بخادم خلفية، هناك شرطان أساسيان إضافيان:
  • أنشئ معرِّف عميل تطبيق ويب OAuth 2.0 لخادم الخلفية. ويختلف معرّف العميل هذا عن معرّف العميل لتطبيقك. ولمزيد من المعلومات، يُرجى الاطّلاع على تفعيل ميزة "الوصول من جهة الخادم".
  • يمكنك تحديد المستخدم الذي سجّل الدخول حاليًا إلى الحساب بأمان على الخادم من خلال إرسال الرمز المميز لمعرّف المستخدم باستخدام HTTPS. للتعرّف على كيفية مصادقة المستخدم على خادم الخلفية، يُرجى الاطّلاع على المصادقة باستخدام خادم خلفية.

دمج تسجيل الدخول بحساب Google في تطبيقك

راجِع ونفِّذ الخطوات التالية - الواردة بالتفصيل في الأقسام التالية - لدمج تسجيل الدخول بحساب Google في تطبيق Wear OS:

  1. ضبط تسجيل الدخول بحساب Google
  2. أضِف زر "تسجيل الدخول بحساب Google".
  3. يمكنك بدء عملية تسجيل الدخول عند النقر على زر تسجيل الدخول.

إعداد "تسجيل الدخول بحساب Google" وإنشاء الكائن GoogleApiClient

في طريقة onCreate() لنشاط تسجيل الدخول، يمكنك إعداد ميزة "تسجيل الدخول بحساب Google" لطلب بيانات المستخدمين التي يطلبها تطبيقك. بعد ذلك، يمكنك إنشاء عنصر GoogleApiClient مع إمكانية الوصول إلى واجهة برمجة التطبيقات لتسجيل الدخول بحساب Google والخيارات التي حدّدتها. يتم عرض هذه الخطوات في المثال التالي:

  public class MyNewActivity extends AppCompatActivity {

    private static final int RC_SIGN_IN = 9001;

    private GoogleSignInClient mSignInClient;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        GoogleSignInOptions options =
               new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .build();

        mSignInClient = GoogleSignIn.getClient(this, options);
    }
  }

إضافة زر "تسجيل الدخول بحساب Google" إلى تطبيقك

أكمِل الخطوات التالية لإضافة زر "تسجيل الدخول بحساب Google":
  1. أضِف SignInButton إلى تنسيق تطبيقك:
  2.  <com.google.android.gms.common.SignInButton
     android:id="@+id/sign_in_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
  3. في طريقة onCreate() في تطبيقك، عليك تسجيل OnClickListener للزر لتسجيل دخول المستخدم عند النقر عليه:
  4. Kotlin

    findViewById<View>(R.id.sign_in_button).setOnClickListener(this)
    

    Java

    findViewById(R.id.sign_in_button).setOnClickListener(this);
    

إنشاء رغبة في تسجيل الدخول وبدء عملية تسجيل الدخول

تعامل مع نقرات زر تسجيل الدخول بطريقة onCLick() من خلال إنشاء هدف تسجيل الدخول باستخدام طريقة getSignInIntent(). بعد ذلك، ابدأ الغرض من خلال استخدام طريقة startActivityForResult().

  Intent intent = mSignInClient.getSignInIntent();
  startActivityForResult(intent, RC_SIGN_IN);

The user is prompted to select a Google account to sign in with. If you requested scopes beyond profile, email, and open ID, the user is also prompted to grant access to those resources.

Finally, in the activity's onActivityResult method, retrieve the sign-in result with getSignInResultFromIntent. After you retrieve the sign-in result, you can check whether the sign-in succeeded using the isSuccess method. If sign-in succeeds, you can call the getSignInAccount method to get a GoogleSignInAccount object that contains information about the signed-in user, such as the user's name. These steps are shown in the following example:

Kotlin

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

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...).
    if (requestCode == RC_SIGN_IN) {
        Auth.GoogleSignInApi.getSignInResultFromIntent(data)?.apply {
            if (isSuccess) {
                // Get account information.
                fullName = signInAccount?.displayName
                mGivenName = signInAccount?.givenName
                mFamilyName = signInAccount?.familyName
                mEmail = signInAccount?.email
            }
        }
    }
}

Java

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

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...).
    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult signInResult = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (signInResult.isSuccess()) {
            GoogleSignInAccount acct = signInResult.getSignInAccount();

            // Get account information.
            fullName = acct.getDisplayName();
            givenName = acct.getGivenName();
            familyName = acct.getFamilyName();
            email = acct.getEmail();
        }
    }
}

للاطّلاع على نموذج تطبيق ينفّذ ميزة "تسجيل الدخول باستخدام حساب Google"، راجِع نموذج تسجيل الدخول باستخدام حساب Google على Android Wear على GitHub.

مصادقة باستخدام رمز مخصّص

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

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

يعمل مسار المصادقة لهذا الإعداد على النحو التالي:

  1. ينفِّذ المستخدم إجراءً باستخدام تطبيق Wear OS يتطلب إذنًا.
  2. يعرض تطبيق Wear OS شاشة مصادقة للمستخدم ويوجّه المستخدم إلى إدخال رمز من عنوان URL محدّد.
  3. ينتقل المستخدم إلى جهاز جوّال أو جهاز لوحي أو كمبيوتر شخصي، ثم يشغِّل متصفّحًا وينتقل إلى عنوان URL المحدّد في تطبيق Wear OS ويسجّل الدخول.
  4. يتلقّى المستخدم رمزًا رقميًا قصير الأجل يُدخله في شاشة مصادقة تطبيق Wear OS باستخدام لوحة المفاتيح المضمّنة في نظام التشغيل Wear OS:

  5. بعد ذلك، يمكنك استخدام الرمز الذي تم إدخاله كدليل على أنّ هذا المستخدم هو المستخدم الصحيح واستبدال الرمز برمز مميّز للمصادقة تم تخزينه وتأمينه على جهاز Wear OS للمكالمات التي تمت مصادقتها من الآن فصاعدًا.

ملاحظة: يجب أن يكون الرمز الذي ينشئه المستخدم رقميًا فقط ولا يمكن أن يحتوي على أي أحرف أبجدية.

يتم عرض مسار المصادقة هذا في الرسم البياني التالي: