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

يمكن تشغيل تطبيقات 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 API.

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

ملاحظة: بعد إنشاء 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 API وإعداد مشروعك على "استوديو 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 لخبير مختصّ على GitHub.

مصادقة الرموز المخصّصة

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

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

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

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

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

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

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