يمكن تشغيل تطبيقات Wear OS بشكل مستقل بدون تطبيق مصاحب. وهذا يعني أنّه على تطبيق Wear OS إدارة المصادقة بنفسه عند الوصول إلى البيانات من الإنترنت. ولكن حجم شاشة الساعة الصغير وقدرات الإدخال المحدودِة تفرضان قيودًا على خيارات المصادقة التي يمكن لتطبيق Wear OS استخدامها.
يتناول هذا الدليل طرق المصادقة المقترَحة لتطبيقات Wear OS، بالإضافة إلى البدائل عندما لا تتوافق هذه الطرق مع حالة استخدام التطبيق.
للاطّلاع على مزيد من المعلومات عن كيفية تصميم تجربة تسجيل دخول جيدة، يمكنك الاطّلاع على دليل تجربة تسجيل الدخول.
وضع الضيف
عدم طلب المصادقة لاستخدام جميع الوظائف بدلاً من ذلك، يمكنك توفير أكبر عدد ممكن من الميزات للمستخدم بدون طلب تسجيل الدخول منه.
قد يعثر المستخدمون على تطبيقك المتوافق مع Wear وتثبيته بدون استخدام التطبيق المتوافق مع الأجهزة الجوّالة، لذا قد لا يكون لديهم حساب وقد لا يعرفون الميزات التي يقدّمها التطبيق. تأكَّد من أنّ وظائف وضع الضيف تعرض ميزات تطبيقك بدقة.
قد يظل قفل بعض الأجهزة مفتوحًا لفترة أطول
على الأجهزة المتوافقة التي تعمل بنظام التشغيل Wear OS 5 أو إصدار أحدث، يرصد النظام ما إذا كان المستخدم يرتدي الجهاز على معصمه. إذا أوقف المستخدم ميزة رصد المعصم ثم أزال الجهاز من معصمه، يحافظ النظام على فتح قفل الجهاز لفترة أطول من المعتاد.
إذا كان تطبيقك يتطلب مستوى أمان أعلى، مثل عند عرض بيانات حسّاسة أو خاصة محتملة، تحقّق أولاً مما إذا كانت ميزة "رصد المعصم" مفعّلة:
val wristDetectionEnabled =
isWristDetectionAutoLockingEnabled(applicationContext)
إذا كانت القيمة المعروضة لهذه الطريقة هي false
، اطلب من المستخدم تسجيل الدخول إلى
حساب في تطبيقك قبل عرض محتوى خاص بالمستخدم.
طرق المصادقة المُقترَحة
استخدِم طرق المصادقة التالية لتفعيل تطبيقات Wear OS المستقلة من أجل الحصول على بيانات اعتماد مصادقة المستخدم.
تمرير الرموز المميّزة باستخدام طبقة البيانات
يمكن لتطبيق الهاتف المصاحب نقل بيانات المصادقة بأمان إلى تطبيق Wear OS باستخدام Wearable Data Layer. نقل بيانات الاعتماد كرسائل أو عناصر بيانات
لا يتطلّب هذا النوع من المصادقة عادةً أي إجراء من المستخدم. ومع ذلك، تجنَّب إجراء المصادقة بدون إبلاغ المستخدم بأنّه يتم تسجيل دخوله. يمكنك إعلام المستخدم باستخدام شاشة بسيطة يمكن إغلاقها توضّح له أنّه تتم عملية نقل حسابه من الجهاز الجوّال.
ملاحظة مهمة: يجب أن يقدّم تطبيق Wear طريقة مصادقة أخرى واحدة على الأقل، لأنّ هذا الخيار لا يعمل إلا على الساعات المقترنة بأجهزة 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 API" وإعداد مشروعك على Android Studio. لمزيد من المعلومات، اطّلِع على المقالة البدء في دمج ميزة "تسجيل الدخول باستخدام حساب Google" في تطبيق Android.
إذا كنت تستخدم ميزة "تسجيل الدخول باستخدام حساب Google" مع تطبيق أو موقع إلكتروني يتواصل مع خادم خلفية، هناك شرطان أساسيان إضافيان:
- أنشِئ معرِّف عميل لتطبيق ويب يستخدم بروتوكول OAuth 2.0 ل خادم الخلفية. يختلف معرّف العميل هذا عن معرّف العميل لتطبيقك. لمزيد من المعلومات، يُرجى الاطّلاع على تفعيل الوصول من جهة الخادم.
- تحديد المستخدم الذي سجّل الدخول حاليًا بشكل آمن على الخادم من خلال إرسال رمز تعريف المستخدم باستخدام بروتوكول HTTPS للتعرّف على كيفية مصادقة المستخدم على خادم الخلفية، يُرجى الاطّلاع على المصادقة باستخدام خادم خلفية.
دمج ميزة "تسجيل الدخول باستخدام حساب Google" في تطبيقك
راجِع الخطوات التالية، الموضّحة بالتفصيل في الأقسام التالية، ونفذها لدمج ميزة "تسجيل الدخول باستخدام حساب Google" في تطبيقك المتوافق مع نظام التشغيل Wear OS:
- ضبط ميزة "تسجيل الدخول باستخدام حساب Google"
- إضافة زر "تسجيل الدخول باستخدام حساب Google"
- ابدأ عملية تسجيل الدخول عند النقر على زر تسجيل الدخول.
ضبط ميزة "تسجيل الدخول باستخدام حساب Google" وإنشاء عنصر GoogleApiClient
في طريقة onCreate()
لنشاط تسجيل الدخول، عليك ضبط ميزة "تسجيل الدخول باستخدام حساب Google" لطلب
بيانات المستخدم التي يتطلبها تطبيقك. بعد ذلك، أنشئ عنصرًا من النوع GoogleApiClient
يمكنه
الوصول إلى Google Sign-In API والخيارات التي حدّدتها. يتم عرض هذه الخطوات
في المثال التالي:
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":
-
أضِف الرمز
SignInButton
إلى تنسيق تطبيقك: -
في طريقة
onCreate()
في تطبيقك، سجِّلOnClickListener
الزر لتسجيل دخول المستخدم عند النقر عليه:
<com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="wrap_content" android:layout_height="wrap_content" />
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);
سيُطلَب من المستخدم اختيار حساب Google لتسجيل الدخول باستخدامه. إذا طلبت نطاقات تتعدى الملف الشخصي والبريد الإلكتروني ورقم التعريف المفتوح، سيُطلب من المستخدم أيضًا منح الإذن بالوصول إلى هذه الموارد.
أخيرًا، في طريقة
onActivityResult
للنشاط، استرجع نتيجة تسجيل الدخول باستخدام
getSignInResultFromIntent
. بعد استرداد نتيجة تسجيل الدخول، يمكنك
التحقّق مما إذا كان تسجيل الدخول قد تم بنجاح باستخدام الأسلوب
isSuccess
. في حال نجاح عملية تسجيل الدخول، يمكنك استدعاء الأسلوب
getSignInAccount
للحصول على عنصر
GoogleSignInAccount
يحتوي على معلومات عن المستخدِم الذي سجّل الدخول، مثل اسمه. يتم عرض هذه الخطوات في المثال التالي:
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"، يمكنك الاطّلاع على نموذج تطبيق Horologist الذي يستخدم ميزة "تسجيل الدخول باستخدام حساب Google" على GitHub.
مصادقة الرمز المخصّص
كبديل لطرق المصادقة الموضّحة سابقًا، يمكنك أن تطلب من المستخدم المصادقة من جهاز آخر، مثل هاتف جوّال أو جهاز لوحي، والحصول على رمز رقمي صالح لفترة قصيرة. بعد ذلك، يُدخِل المستخدم رمز المصادقة على جهاز Wear OS لتأكيد هويته ويتلقّى رمزًا مميّزًا للمصادقة.
تستخدِم عملية المصادقة هذه إما وحدة تسجيل الدخول في تطبيقك، أو تدمج يدويًا طريقة تسجيل الدخول لمقدّم خدمة مصادقة تابع لجهة خارجية في رمز تطبيقك. على الرغم من أنّ طريقة المصادقة هذه تتطلّب إجراءً يدويًا وجهودًا إضافية لجعلها أكثر أمانًا، يمكنك استخدام هذه الطريقة إذا كنت بحاجة إلى المصادقة في وقت أبكر في تطبيقات Wear OS المستقلة.
تعمل عملية المصادقة لهذا الإعداد على النحو التالي:
- ينفِّذ المستخدم إجراءً باستخدام تطبيق Wear OS يتطلّب الحصول على إذن.
- يعرض تطبيق Wear OS شاشة مصادقة للمستخدم ويطلب منه إدخال رمز من عنوان URL محدّد.
- ينتقل المستخدم إلى جهاز جوّال أو جهاز لوحي أو كمبيوتر شخصي، ثم يشغّل متصفّحًا وينتقل إلى عنوان URL المحدّد في تطبيق Wear OS ويُسجّل الدخول.
- يتلقّى المستخدم رمزًا رقميًا صالحًا لفترة قصيرة ويُدخله في شاشة مصادقة
تطبيق Wear OS باستخدام لوحة المفاتيح المدمجة في Wear OS:
- من هذه النقطة فصاعدًا، يمكنك استخدام الرمز الذي أدخلته كدليل على هوية مستخدم الجهاز الصحيح واستبدال الرمز برمز مميّز للمصادقة يتم تخزينه وتأمينه على جهاز Wear OS للمكالمات التي تمّت مصادقتها من الآن فصاعدًا.
ملاحظة: يجب أن يكون الرمز الذي ينشئه المستخدم رقميًا فقط ولا يمكن أن يحتوي على أي أحرف alfabetic.
يظهر مسار المصادقة هذا في الرسم البياني التالي: