برنامههای Wear OS میتوانند بهصورت مستقل و بدون برنامه همراه اجرا شوند. این بدان معنی است که یک برنامه Wear OS باید هنگام دسترسی به داده ها از اینترنت، احراز هویت را به تنهایی مدیریت کند. اما اندازه صفحه نمایش کوچک ساعت و کاهش قابلیت های ورودی، گزینه های احراز هویتی را که برنامه Wear OS می تواند استفاده کند، محدود می کند.
این راهنما روشهای احراز هویت توصیهشده برای برنامههای Wear OS و همچنین گزینههای جایگزین را در مواردی که این روشها با موارد استفاده برنامه مطابقت ندارند، پوشش میدهد.
برای کسب اطلاعات بیشتر درباره نحوه طراحی یک تجربه ورود خوب، راهنمای ورود به سیستم UX را مشاهده کنید.
حالت مهمان
برای همه عملکردها به احراز هویت نیاز ندارید. در عوض، بدون نیاز به ورود به سیستم، تا حد امکان ویژگیهای بیشتری را در اختیار کاربر قرار دهید.
کاربران ممکن است برنامه Wear شما را بدون استفاده از برنامه تلفن همراه کشف و نصب کنند، بنابراین ممکن است حسابی نداشته باشند و ندانند چه ویژگی هایی ارائه می دهد. مطمئن شوید که عملکرد حالت مهمان به طور دقیق ویژگی های برنامه شما را نشان می دهد.
برخی از دستگاهها ممکن است مدت بیشتری باز بمانند
در دستگاههای پشتیبانیشده که دارای سیستمعامل Wear OS 5 یا بالاتر هستند، سیستم تشخیص میدهد که آیا کاربر دستگاه را روی مچ خود بسته است یا خیر. اگر کاربر تشخیص مچ را خاموش کند و سپس دستگاه را از مچ خود خارج کند، سیستم دستگاه را برای مدت زمان طولانیتری نسبت به حالت قبلی باز نگه میدارد.
اگر برنامه شما به سطح بالاتری از امنیت نیاز دارد - مانند هنگام نمایش داده های بالقوه حساس یا خصوصی - ابتدا بررسی کنید که آیا تشخیص مچ فعال است یا خیر:
val wristDetectionEnabled =
isWristDetectionAutoLockingEnabled(applicationContext)
اگر مقدار بازگشتی این روش false
است، از کاربر بخواهید قبل از نمایش محتوای خاص کاربر، وارد حساب کاربری در برنامه شما شود.
روش های احراز هویت توصیه شده
از روشهای احراز هویت زیر برای فعال کردن برنامههای Wear OS مستقل برای دریافت اعتبار احراز هویت کاربر استفاده کنید.
رمزها را با استفاده از لایه داده ارسال کنید
برنامه همراه تلفن میتواند بهطور ایمن دادههای احراز هویت را با استفاده از لایه داده پوشیدنی به برنامه Wear OS منتقل کند. اعتبارنامه ها را به عنوان پیام یا موارد داده منتقل کنید.
این نوع احراز هویت معمولاً به هیچ اقدامی از جانب کاربر نیاز ندارد. با این حال، بدون اطلاع دادن به کاربر مبنی بر ورود به سیستم، از انجام احراز هویت خودداری کنید. میتوانید با استفاده از یک صفحه نمایش ساده و غیرقابل حذف که نشان میدهد حسابش از تلفن همراه منتقل میشود، به کاربر اطلاع دهید.
مهم: برنامه 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 مشخص شده در درخواست هدایت می شود. اگر کاربر درخواست دسترسی را تأیید کند، پاسخ حاوی یک کد مجوز است. اگر کاربر درخواست را تأیید نکند، پاسخ حاوی یک پیام خطا است.
پاسخ به شکل یک query string است و شبیه یکی از نمونه های زیر است:
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 پیدا کنید.
اعطای مجوز دستگاه
هنگام استفاده از Device Authorization Grant، کاربر 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 Sign-In به کاربر اجازه میدهد با حساب Google موجود خود وارد سیستم شود. این بهترین تجربه کاربری را ارائه می دهد و پشتیبانی از آن آسان است، به خصوص اگر قبلاً آن را در برنامه های دستی خود پیاده سازی کرده باشید.
پس از روشهای احراز هویت توصیهشده که قبلاً توضیح داده شد، Google Sign-In راهحل ترجیحی بعدی است زیرا در iOS نیز به خوبی کار میکند. بخش زیر نحوه تکمیل یک ادغام اولیه ورود به سیستم Google را شرح می دهد.
پیش نیازها
قبل از اینکه بتوانید ادغام Google Sign-In را در برنامه Wear OS خود شروع کنید، باید یک پروژه Google API Console را پیکربندی کنید و پروژه Android Studio خود را راه اندازی کنید. برای اطلاعات بیشتر، به شروع ادغام Google Sign-In در برنامه Android خود مراجعه کنید.
اگر از Google Sign-In با برنامه یا سایتی استفاده میکنید که با یک سرور پشتیبان ارتباط برقرار میکند، دو پیشنیاز دیگر وجود دارد:
- یک شناسه سرویس گیرنده برنامه وب OAuth 2.0 برای سرور باطن خود ایجاد کنید. این شناسه مشتری با شناسه مشتری برنامه شما متفاوت است. برای اطلاعات بیشتر، به فعال کردن دسترسی سمت سرور مراجعه کنید.
- با ارسال کد شناسه کاربر با استفاده از HTTPS، کاربر وارد شده فعلی را به صورت ایمن در سرور شناسایی کنید. برای آشنایی با نحوه احراز هویت کاربر در سرور باطن، به احراز هویت با سرور باطن مراجعه کنید.
Google Sign-In را در برنامه خود ادغام کنید
برای ادغام Google Sign-In در برنامه Wear OS خود، مراحل زیر را که در بخشهای بعدی به تفصیل آمده است، مرور و اجرا کنید:
- Google Sign-In را پیکربندی کنید .
- یک دکمه ورود به سیستم Google اضافه کنید .
- با ضربه زدن روی دکمه ورود به سیستم، جریان ورود به سیستم را شروع کنید .
Google Sign-In را پیکربندی کنید و شی GoogleApiClient را بسازید
در روش onCreate()
در فعالیت ورود به سیستم، Google Sign-In را پیکربندی کنید تا اطلاعات کاربر مورد نیاز برنامه شما را درخواست کند. سپس، یک شی 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" />
کاتلین
findViewById<View>(R.id.sign_in_button).setOnClickListener(this)
جاوا
findViewById(R.id.sign_in_button).setOnClickListener(this);
یک هدف ورود ایجاد کنید و جریان ورود به سیستم را شروع کنید
با ایجاد یک intent ورود با متد getSignInIntent()
، ضربه های دکمه ورود به سیستم را در متد onCLick()
مدیریت کنید. سپس intent را با متد startActivityForResult()
شروع کنید.
Intent intent = mSignInClient.getSignInIntent(); startActivityForResult(intent, RC_SIGN_IN);
از کاربر خواسته می شود یک حساب Google را برای ورود به سیستم انتخاب کند. اگر دامنههایی فراتر از نمایه، ایمیل و شناسه باز درخواست کردهاید، از کاربر خواسته میشود به آن منابع دسترسی پیدا کند.
در نهایت، در روش onActivityResult
فعالیت، نتیجه ورود به سیستم را با getSignInResultFromIntent
بازیابی کنید. پس از بازیابی نتیجه ورود به سیستم، می توانید بررسی کنید که آیا ورود به سیستم با استفاده از روش isSuccess
موفق بوده است یا خیر. اگر ورود به سیستم با موفقیت انجام شد، میتوانید با روش getSignInAccount
تماس بگیرید تا یک شیء GoogleSignInAccount
دریافت کنید که حاوی اطلاعاتی درباره کاربر واردشده به سیستم، مانند نام کاربر است. این مراحل در مثال زیر نشان داده شده است:
کاتلین
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 } } } }
جاوا
@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 Sign-In را پیاده سازی می کند، به Horologist Google Sign-In Sample در GitHub مراجعه کنید.
احراز هویت کد سفارشی
به عنوان جایگزینی برای روشهای احراز هویت که قبلاً توضیح داده شد، میتوانید از کاربر بخواهید که از دستگاه دیگری مانند تلفن همراه یا رایانه لوحی احراز هویت کند و یک کد عددی کوتاه مدت دریافت کند. سپس کاربر برای تأیید هویت خود، کد را در دستگاه Wear OS خود وارد می کند و یک رمز تأیید دریافت می کند.
این جریان احراز هویت یا از ماژول ورود به سیستم برنامه شما استفاده می کند، یا به صورت دستی یک روش ورود به سیستم ارائه دهنده احراز هویت شخص ثالث را در کد برنامه شما ادغام می کند. اگرچه این روش احراز هویت به کار دستی و تلاش بیشتری برای ایمنتر کردن آن نیاز دارد، اگر در برنامههای Wear OS مستقل خود به احراز هویت زودتر نیاز دارید، میتوانید از این روش استفاده کنید.
جریان تأیید اعتبار برای این راهاندازی به صورت زیر عمل میکند:
- کاربر با برنامه Wear OS عملی را انجام می دهد که نیاز به مجوز دارد.
- برنامه Wear OS یک صفحه احراز هویت را به کاربر ارائه می دهد و به کاربر دستور می دهد تا یک کد را از یک URL مشخص وارد کند.
- کاربر به یک دستگاه تلفن همراه، تبلت یا رایانه شخصی سوئیچ میکند و سپس یک مرورگر را راهاندازی میکند، به URL مشخصشده در برنامه Wear OS میرود و وارد سیستم میشود.
- کاربر یک کد عددی کوتاه مدت دریافت می کند که با استفاده از صفحه کلید داخلی در Wear OS وارد صفحه تأیید اعتبار برنامه Wear OS می شود:
- از این مرحله، میتوانید از کد وارد شده بهعنوان مدرکی استفاده کنید که کاربر صحیح است و کد را با یک نشانه تأیید ذخیره شده و ایمن شده در دستگاه Wear OS برای تماسهای احراز هویت شده مبادله کنید.
توجه: کدی که کاربر تولید میکند باید کاملاً عددی باشد و حاوی هیچ کاراکتر حروف الفبا نباشد.
این جریان احراز هویت در نمودار زیر نشان داده شده است:
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2024-11-21 بهوقت ساعت هماهنگ جهانی.