برنامههای Wear OS میتوانند بهصورت مستقل و بدون برنامه همراه اجرا شوند. این بدان معنی است که یک برنامه Wear OS باید هنگام دسترسی به داده ها از اینترنت، احراز هویت را به تنهایی مدیریت کند. اما اندازه صفحه نمایش کوچک ساعت و کاهش قابلیت های ورودی، گزینه های احراز هویتی را که برنامه Wear OS می تواند استفاده کند، محدود می کند.
این راهنما دستورالعملهایی را برای روش احراز هویت توصیهشده برای برنامههای Wear OS، Credential Manager ارائه میدهد.
برای کسب اطلاعات بیشتر درباره نحوه طراحی یک تجربه ورود خوب، راهنمای ورود به سیستم UX را مشاهده کنید.
ملاحظات اولیه
قبل از شروع اجرای خود، نکات زیر را در نظر بگیرید.
حالت مهمان
برای همه عملکردها به احراز هویت نیاز ندارید. در عوض، بدون نیاز به ورود به سیستم، تا حد امکان ویژگیهای بیشتری را در اختیار کاربر قرار دهید.
کاربران ممکن است برنامه Wear شما را بدون استفاده از برنامه تلفن همراه کشف و نصب کنند، بنابراین ممکن است حسابی نداشته باشند و ندانند چه ویژگی هایی ارائه می دهد. مطمئن شوید که عملکرد حالت مهمان به طور دقیق ویژگی های برنامه شما را نشان می دهد.
برخی از دستگاهها ممکن است مدت بیشتری باز بمانند
در دستگاههای پشتیبانیشده که دارای سیستمعامل Wear OS 5 یا بالاتر هستند، سیستم تشخیص میدهد که آیا کاربر دستگاه را روی مچ خود بسته است یا خیر. اگر کاربر تشخیص مچ را خاموش کند و سپس دستگاه را از مچ خود خارج کند، سیستم دستگاه را برای مدت زمان طولانیتری نسبت به حالت قبلی باز نگه میدارد.
اگر برنامه شما به سطح بالاتری از امنیت نیاز دارد - مانند هنگام نمایش داده های بالقوه حساس یا خصوصی - ابتدا بررسی کنید که آیا تشخیص مچ فعال است یا خیر:
val wristDetectionEnabled =
isWristDetectionAutoLockingEnabled(applicationContext)
اگر مقدار بازگشتی این روش false
است، از کاربر بخواهید قبل از نمایش محتوای خاص کاربر، وارد حساب کاربری در برنامه شما شود.
مدیر اعتبار
Credential Manager API توصیه شده برای احراز هویت در Wear OS است. این محیط امن تری را برای کاربران فراهم می کند تا بدون نیاز به تلفن جفت شده متصل و بدون نیاز به یادآوری رمز عبور خود، به برنامه های Wear OS وارد شوند.
این سند به تشریح اطلاعاتی که توسعهدهندگان برای پیادهسازی راهحل Credential Manager با مکانیسمهای احراز هویت استانداردی که میزبان آن هستند، نیاز دارند، میپردازد که عبارتند از:
- کلیدهای عبور
- رمزهای عبور
- هویت های فدرال (مانند ورود با Google)
این راهنما همچنین دستورالعملهایی را برای نحوه انتقال سایر روشهای تأیید اعتبار Wear OS ( اشتراکگذاری رمز لایه داده و OAuth ) بهعنوان پشتیبانگیری برای Credential Manager، و دستورالعملهای ویژه برای مدیریت انتقال از دکمه Google Sign in مستقل که اکنون منسوخ شده به نسخه مدیریت اعتبار تعبیهشده ارائه میدهد.
کلیدهای عبور در Wear OS
توسعه دهندگان به شدت تشویق می شوند که کلیدهای عبور را در پیاده سازی های Wear OS Credential Manager خود پیاده سازی کنند. کلیدهای عبور استاندارد جدید صنعتی برای احراز هویت کاربر نهایی هستند و چندین مزیت قابل توجه برای کاربران دارند.
کلیدهای عبور ساده تر هستند
- کاربران می توانند حسابی را برای ورود به سیستم انتخاب کنند. آنها نیازی به تایپ نام کاربری ندارند.
- کاربران می توانند با استفاده از قفل صفحه دستگاه احراز هویت کنند.
- پس از ایجاد و ثبت یک رمز عبور، کاربر می تواند به طور یکپارچه به یک دستگاه جدید تغییر مکان داده و بلافاصله بدون نیاز به ثبت نام مجدد از آن استفاده کند.
کلیدهای عبور امن تر هستند
- توسعه دهندگان به جای ذخیره رمز عبور، تنها یک کلید عمومی را در سرور ذخیره می کنند، به این معنی که برای یک بازیگر بد ارزش بسیار کمتری برای هک کردن سرورها وجود دارد، و پاکسازی بسیار کمتری برای انجام در صورت نقض وجود دارد.
- کلیدهای عبور محافظت در برابر فیشینگ را فراهم می کنند. کلیدهای عبور فقط در وب سایت ها و برنامه های ثبت شده آنها کار می کنند. کاربر را نمی توان فریب داد تا در یک سایت فریبنده احراز هویت کند زیرا مرورگر یا سیستم عامل تأیید را انجام می دهد.
- کلیدهای عبور نیاز به ارسال پیامک را کاهش می دهند و احراز هویت را مقرون به صرفه تر می کنند.
پیاده سازی کلیدهای عبور
شامل راه اندازی و راهنمایی برای همه انواع پیاده سازی است.
راه اندازی
سطح API هدف را در فایل build.gradle ماژول برنامه خود روی 35 تنظیم کنید:
android { defaultConfig { targetSdkVersion(35) } }
با استفاده از آخرین نسخه پایدار از مرجع انتشارات
androidx.credentials
، خطوط زیر را به فایل build.gradle برای برنامه یا ماژول خود اضافه کنید.androidx.credentials:credentials:1.5.0 androidx.credentials:credentials-play-services-auth:1.5.0
روش های احراز هویت داخلی
از آنجایی که Credential Manager یک API یکپارچه است، مراحل پیادهسازی Wear OS مانند هر نوع دستگاه دیگری است.
برای شروع و اجرای پشتیبانی از رمزهای عبور و رمزهای عبور از دستورالعمل های تلفن همراه استفاده کنید.
مراحل افزودن پشتیبانی Sign in With Google به Credential Manager به سمت توسعه تلفن همراه است، اما مراحل در Wear OS یکسان است. برای ملاحظات ویژه در این مورد، بخش انتقال به سیستم قدیمی با Google را ببینید.
توجه داشته باشید که از آنجایی که اعتبارنامه ها را نمی توان در Wear OS ایجاد کرد، نیازی به پیاده سازی روش های ایجاد اعتبار ذکر شده در دستورالعمل های تلفن همراه ندارید.
روش های احراز هویت پشتیبان
دو روش تأیید اعتبار قابل قبول دیگر برای برنامههای Wear OS وجود دارد: OAuth 2.0 (هر نوع) و Mobile Auth Token Data Layer Sharing. در حالی که این روشها نقاط یکپارچهسازی در Credential Manager API ندارند، میتوانند در جریان تجربه کاربری شما از Credential Manager بهعنوان جایگزین در مواردی که کاربران صفحه Credential Manager را رد کنند، گنجانده شوند.
برای رسیدگی به اقدام کاربر مبنی بر رد کردن صفحه Credential Manager، یک NoCredentialException
به عنوان بخشی از منطق GetCredential
خود بگیرید و به UI auth سفارشی خود بروید.
yourCoroutineScope.launch {
try {
val response = credentialManager.getCredential(activity, request)
signInWithCredential(response.credential)
} catch (e: GetCredentialCancellationException) {
navigateToFallbackAuthMethods()
}
}
سپس رابط کاربری تأیید اعتبار سفارشی شما میتواند هر یک از روشهای احراز هویت قابل قبول دیگر را که در راهنمای UX ورود به سیستم توضیح داده شده است ارائه دهد.
اشتراک توکن لایه داده
برنامه همراه تلفن می تواند با استفاده از Wearable Data Layer API داده های احراز هویت را به برنامه Wear OS منتقل کند. اعتبارنامه ها را به عنوان پیام یا به عنوان اقلام داده منتقل کنید.
این نوع احراز هویت معمولاً به هیچ اقدامی از جانب کاربر نیاز ندارد. با این حال، از انجام احراز هویت بدون اطلاع دادن به کاربر مبنی بر ورود به سیستم خودداری کنید. میتوانید با استفاده از صفحه قابل رد کردنی که به او نشان میدهد حسابش از تلفن همراه منتقل میشود، به کاربر اطلاع دهید.
مهم: برنامه Wear OS شما باید حداقل یک روش احراز هویت دیگر را ارائه دهد، زیرا این گزینه فقط در ساعتهای جفتشده با Android زمانی که برنامه تلفن همراه مربوطه نصب میشود کار میکند. یک روش احراز هویت جایگزین برای کاربرانی که برنامه تلفن همراه مربوطه را ندارند یا دستگاه Wear OS آنها با دستگاه iOS جفت شده است، ارائه دهید.
همانطور که در مثال زیر نشان داده شده است، رمزها را با استفاده از لایه داده از برنامه تلفن همراه ارسال کنید:
val token = "..." // Auth token to transmit to the Wear OS 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)
همانطور که در مثال زیر نشان داده شده است، به رویدادهای تغییر داده در برنامه Wear OS گوش دهید:
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 an interstitial screen to notify the user that
// they're 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 تعریف شده است
- اعطای مجوز دستگاه (DAG)، همانطور که در RFC 8628 تعریف شده است
کلید اثبات برای تبادل کد (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 any errors.
}
}
)
این درخواست یک تماس با برنامه همراه را راهاندازی میکند، که سپس یک رابط کاربری مجوز را در یک مرورگر وب در تلفن همراه کاربر ارائه میدهد. ارائه دهنده 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 پاسخ را تأیید می کند و پاسخ را به برنامه Wear OS شما ارسال می کند. با استفاده از onAuthorizationResponse
API.
سپس برنامه ساعت میتواند کد مجوز را با یک نشانه دسترسی مبادله کند.
اعطای مجوز دستگاه
هنگام استفاده از 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 دارید، به جای اینکه به مرورگر برای تأیید توکن اعتماد کنید، از پیوندهای جهانی برای رهگیری این هدف در برنامه خود استفاده کنید.
خروج از Legacy Sign with Google
Credential Manager یک نقطه ادغام اختصاصی برای دکمه Sign in With Google دارد. قبلاً، این دکمه را میتوانست در هر جایی از UX احراز هویت برنامه اضافه کند، اما با گنجاندن آن در Credential Manager، اکنون گزینه قدیمی منسوخ شده است.
// Define a basic SDK check.
fun isCredentialManagerAvailable(): Boolean {
return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.VANILLA_ICE_CREAM
}
// Elsewhere in the code, use it to selectively disable the legacy option.
Button(
onClick = {
if (isCredentialManagerAvailable()) {
Log.w(TAG, "Devices on API level 35 or higher should use
Credential Manager for Sign in with Google")
} else {
navigateToSignInWithGoogle()
}},
enabled = !isCredentialManagerAvailable(),
label = { Text(text = stringResource(R.string.sign_in_with_google)) },
secondaryLabel = { Text(text = "Disabled on API level 35+")
}
)