การตรวจสอบสิทธิ์ในอุปกรณ์ที่สวมใส่ได้: เครื่องมือจัดการข้อมูลเข้าสู่ระบบ

แอป Wear OS สามารถทำงานแบบสแตนด์อโลนได้โดยไม่ต้องมีแอปคู่ ซึ่งหมายความว่าแอป Wear OS ต้องจัดการการตรวจสอบสิทธิ์ด้วยตัวเองเมื่อเข้าถึงข้อมูลจากอินเทอร์เน็ต แต่ขนาดหน้าจอที่เล็กและความสามารถในการป้อนข้อมูลที่ลดลงของนาฬิกาจะจำกัดตัวเลือกการตรวจสอบสิทธิ์ที่แอป Wear OS ใช้ได้

คู่มือนี้จะให้คำแนะนำเกี่ยวกับวิธีการตรวจสอบสิทธิ์ที่แนะนำสำหรับแอป Wear OS ซึ่งก็คือ Credential Manager

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีออกแบบประสบการณ์การลงชื่อเข้าใช้ที่ดีได้ใน คู่มือ UX การลงชื่อเข้าใช้

ข้อควรพิจารณาเบื้องต้น

โปรดพิจารณาประเด็นต่อไปนี้ก่อนเริ่มการติดตั้งใช้งาน

โหมดผู้มาเยือน

ไม่ต้องกำหนดให้มีการตรวจสอบสิทธิ์สำหรับฟังก์ชันทั้งหมด แต่ให้แสดงฟีเจอร์ต่างๆ แก่ผู้ใช้ให้มากที่สุดโดยไม่ต้องกำหนดให้ผู้ใช้ลงชื่อเข้าใช้

ผู้ใช้อาจค้นพบและติดตั้งแอป Wear โดยไม่ได้ใช้แอปบนอุปกรณ์เคลื่อนที่มาก่อน จึงอาจไม่มีบัญชีและไม่ทราบว่าแอปมีฟีเจอร์ใดบ้าง ตรวจสอบว่าฟังก์ชันโหมดผู้มาเยือนแสดงฟีเจอร์ของแอปได้อย่างถูกต้อง

อุปกรณ์บางเครื่องอาจปลดล็อกอยู่นานขึ้น

ในอุปกรณ์ที่รองรับซึ่งใช้ Wear OS 5 ขึ้นไป ระบบจะตรวจหาว่าผู้ใช้สวมอุปกรณ์ไว้ที่ข้อมือหรือไม่ หากผู้ใช้ปิดการตรวจจับข้อมือแล้วถอดอุปกรณ์ออกจากข้อมือ ระบบจะปลดล็อกอุปกรณ์ไว้นานกว่าปกติ

หากแอปของคุณกำหนดให้มีการรักษาความปลอดภัยระดับสูงขึ้น เช่น เมื่อแสดงข้อมูลที่อาจมีความละเอียดอ่อนหรือเป็นส่วนตัว ให้ตรวจสอบก่อนว่าได้เปิดใช้การตรวจจับข้อมือแล้วหรือไม่ โดยทำดังนี้

fun isWristDetectionAutoLockingEnabled(context: Context): Boolean {
    // Use the keyguard manager to check for the presence of a lock mechanism
    val keyguardManager = context.getSystemService<KeyguardManager>()
    val isSecured = keyguardManager?.isDeviceSecure == true

    // Use OEM-specific system settings to verify that on-body autolock is enabled.
    val isWristDetectionOn = android.provider.Settings.Global.getInt(
        context.contentResolver, PIXEL_WRIST_AUTOLOCK_SETTING_STATE,
        0
    ) == 1

    return isSecured && isWristDetectionOn
}

หากค่าที่แสดงผลของเมธอดนี้เป็น false ให้แจ้งให้ผู้ใช้ลงชื่อเข้าใช้บัญชีในแอปก่อนที่จะแสดงเนื้อหาที่เฉพาะเจาะจงกับผู้ใช้

Credential Manager

Credential Manager เป็น API ที่แนะนำสำหรับ การตรวจสอบสิทธิ์ใน Wear OS โดยมีสภาพแวดล้อมที่ปลอดภัยยิ่งขึ้นสำหรับผู้ใช้ในการลงชื่อเข้าใช้แอปพลิเคชัน Wear OS ในการตั้งค่าแบบสแตนด์อโลน โดยไม่จำเป็นต้องมีโทรศัพท์ที่จับคู่และเชื่อมต่ออยู่ และไม่จำเป็นต้องจำรหัสผ่าน

เอกสารนี้สรุปข้อมูลที่นักพัฒนาแอปต้องใช้ในการติดตั้งใช้งานโซลูชัน Credential Manager ด้วยกลไกการตรวจสอบสิทธิ์มาตรฐานที่โซลูชันนี้โฮสต์ไว้ ซึ่งได้แก่

  • พาสคีย์
  • รหัสผ่าน
  • ข้อมูลประจำตัวแบบรวมศูนย์ (เช่น ลงชื่อเข้าใช้ด้วย Google)

นอกจากนี้ คู่มือนี้ยังให้คำแนะนำเกี่ยวกับวิธีย้ายวิธีการตรวจสอบสิทธิ์อื่นๆ ที่ยอมรับได้ของ Wear OS (การแชร์โทเค็นเลเยอร์ข้อมูล และ OAuth) เป็นข้อมูลสำรองสำหรับ Credential Manager รวมถึงคำแนะนำพิเศษสำหรับการ จัดการการเปลี่ยนจากปุ่มลงชื่อเข้าใช้ด้วย Google แบบสแตนด์อโลนที่เลิกใช้งานแล้ว ไปยัง Credential Manager เวอร์ชันที่ฝังไว้

ข้อจำกัดและความแตกต่างของ Wear OS

นักพัฒนาแอปควรทราบถึงข้อจำกัดและความแตกต่างต่อไปนี้ใน Wear OS

  • Credential Manager พร้อมใช้งานใน Wear OS 3 ขึ้นไป
  • สร้างข้อมูลเข้าสู่ระบบใน Wear OS ไม่ได้
  • ระบบไม่รองรับทั้งการคืนค่าข้อมูลเข้าสู่ระบบและขั้นตอนการลงชื่อเข้าใช้แบบไฮบริด
  • สามารถนำผู้ให้บริการข้อมูลเข้าสู่ระบบที่มีการผสานรวม Wear OS กลับมาใช้ซ้ำจากอุปกรณ์เคลื่อนที่ได้เท่านั้น

พาสคีย์ใน Wear OS

เราขอแนะนำให้นักพัฒนาแอปติดตั้งใช้งานพาสคีย์ในการติดตั้งใช้งาน Credential Manager ของ Wear OS พาสคีย์เป็นมาตรฐานอุตสาหกรรมใหม่สำหรับการตรวจสอบสิทธิ์ผู้ใช้ปลายทาง และมีประโยชน์ที่สำคัญหลายประการสำหรับผู้ใช้

พาสคีย์ใช้งานง่ายกว่า

  • ผู้ใช้สามารถเลือกบัญชีที่จะใช้ลงชื่อเข้าใช้ได้ โดยไม่จำเป็นต้องพิมพ์ชื่อผู้ใช้
  • ผู้ใช้สามารถตรวจสอบสิทธิ์โดยใช้การล็อกหน้าจอของอุปกรณ์ได้
  • หลังจากสร้างและลงทะเบียนพาสคีย์แล้ว ผู้ใช้จะเปลี่ยนไปใช้อุปกรณ์ใหม่ได้อย่างราบรื่นและใช้งานได้ทันทีโดยไม่ต้องลงทะเบียนใหม่

พาสคีย์ปลอดภัยกว่า

  • นักพัฒนาแอปจะบันทึกเฉพาะคีย์สาธารณะลงในเซิร์ฟเวอร์แทนการบันทึกรหัสผ่าน ซึ่งหมายความว่าผู้ไม่ประสงค์ดีจะแฮ็กเซิร์ฟเวอร์ได้ยากขึ้นมาก และคุณก็ไม่ต้องทำความสะอาดมากนักในกรณีที่เกิดการละเมิด
  • พาสคีย์ให้การป้องกันที่ทนทานต่อฟิชชิง พาสคีย์จะทำงานได้บนเว็บไซต์และแอปที่ลงทะเบียนเท่านั้น ผู้ใช้จึงไม่ถูกหลอกให้ตรวจสอบสิทธิ์ในเว็บไซต์หลอกลวง เนื่องจากเบราว์เซอร์หรือระบบปฏิบัติการจะจัดการการยืนยัน
  • พาสคีย์ช่วยลดความจำเป็นในการส่ง SMS ทำให้การตรวจสอบสิทธิ์คุ้มค่ามากขึ้น

ติดตั้งใช้งานพาสคีย์

รวมถึงการตั้งค่าและคำแนะนำสำหรับการติดตั้งใช้งานทุกประเภท

ตั้งค่า

  1. ตั้งค่าระดับ API เป้าหมายเป็น 35 ในไฟล์ build.gradle ของโมดูลแอปพลิเคชัน

    android {
        defaultConfig {
            targetSdk(35)
        }
    }
    
  2. เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ build.gradle ของแอปหรือโมดูล โดยใช้เวอร์ชันเสถียรล่าสุดจากการอ้างอิง androidx.credentialsการเผยแพร่

    androidx.credentials:credentials:1.6.0
    androidx.credentials:credentials-play-services-auth:1.6.0
    

วิธีการตรวจสอบสิทธิ์ในตัว

เนื่องจาก Credential Manager เป็น API แบบรวม ขั้นตอนการติดตั้งใช้งานสำหรับ Wear OS จึงเหมือนกับอุปกรณ์ประเภทอื่นๆ

ใช้คำแนะนำสำหรับอุปกรณ์เคลื่อนที่ เพื่อเริ่มต้นใช้งานและติดตั้งใช้งานการรองรับพาสคีย์และรหัสผ่าน

ขั้นตอนในการ เพิ่มการรองรับฟีเจอร์ลงชื่อเข้าใช้ด้วย Google ลงใน Credential Manager มุ่งเน้นไปที่การพัฒนาแอปบนอุปกรณ์เคลื่อนที่ แต่ขั้นตอนจะเหมือนกันใน Wear OS

โปรดทราบว่าเนื่องจากสร้างข้อมูลเข้าสู่ระบบใน Wear OS ไม่ได้ คุณจึงไม่จำเป็นต้องติดตั้งใช้งานวิธีการสร้างข้อมูลเข้าสู่ระบบที่กล่าวถึงในคำแนะนำสำหรับอุปกรณ์เคลื่อนที่

วิธีการตรวจสอบสิทธิ์สำรอง

แอป Wear OS มีวิธีการตรวจสอบสิทธิ์อื่นๆ ที่ยอมรับได้ 2 วิธี ได้แก่ OAuth 2.0 (ทั้ง 2 รูปแบบ) และการแชร์โทเค็นการตรวจสอบสิทธิ์ของอุปกรณ์เคลื่อนที่ผ่านเลเยอร์ข้อมูล แม้ว่าวิธีการเหล่านี้จะไม่มีจุดผสานรวมใน Credential Manager API แต่คุณก็สามารถรวมไว้ในขั้นตอน UX ของ Credential Manager เป็นข้อมูลสำรองในกรณีที่ผู้ใช้ปิดหน้าจอ Credential Manager

หากต้องการจัดการการดำเนินการของผู้ใช้ในการปิดหน้าจอ Credential Manager ให้ดักจับ NoCredentialExceptionซึ่งเป็นส่วนหนึ่งของ GetCredential ตรรกะ แล้วไปยัง UI การตรวจสอบสิทธิ์ที่กำหนดเอง

try {
    val getCredentialResponse: GetCredentialResponse =
        credentialManager.getCredential(activity, createGetCredentialRequest())
    return authenticate(getCredentialResponse.credential)
} catch (_: GetCredentialCancellationException) {
    navigateToSecondaryAuthentication()
}

จากนั้น UI การตรวจสอบสิทธิ์ที่กำหนดเองจะแสดงวิธีการตรวจสอบสิทธิ์อื่นๆ ที่ยอมรับได้ ซึ่งอธิบายไว้ในคู่มือ UX การลงชื่อเข้าใช้

การแชร์โทเค็นเลเยอร์ข้อมูล

แอปคู่ในโทรศัพท์สามารถโอนข้อมูลการตรวจสอบสิทธิ์ไปยังแอป Wear OS ได้อย่างปลอดภัยโดยใช้ Wearable Data Layer API โอนข้อมูลเข้าสู่ระบบเป็นข้อความหรือเป็นรายการข้อมูล

การตรวจสอบสิทธิ์ประเภทนี้มักไม่กำหนดให้ผู้ใช้ต้องดำเนินการใดๆ อย่างไรก็ตาม ให้หลีกเลี่ยงการตรวจสอบสิทธิ์โดยไม่แจ้งให้ผู้ใช้ทราบว่าระบบกำลังลงชื่อเข้าใช้ให้ คุณสามารถแจ้งให้ผู้ใช้ทราบโดยใช้หน้าจอที่ปิดได้ซึ่งแสดงว่าระบบกำลังโอนบัญชีจากอุปกรณ์เคลื่อนที่

สำคัญ: แอป Wear OS ต้องมีวิธีการตรวจสอบสิทธิ์อื่นๆ อย่างน้อย 1 วิธี เนื่องจากตัวเลือกนี้จะทำงานได้เฉพาะในนาฬิกาที่จับคู่กับ Android เมื่อมีการติดตั้งแอปบนอุปกรณ์เคลื่อนที่ที่เกี่ยวข้อง โปรดระบุวิธีการตรวจสอบสิทธิ์อื่นสำหรับผู้ใช้ที่ไม่มีแอปบนอุปกรณ์เคลื่อนที่ที่เกี่ยวข้องหรืออุปกรณ์ Wear OS จับคู่กับอุปกรณ์ iOS

ส่งโทเค็นโดยใช้เลเยอร์ข้อมูลจากแอปบนอุปกรณ์เคลื่อนที่ ดังที่แสดงในตัวอย่างต่อไปนี้

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

ฟังเหตุการณ์การเปลี่ยนแปลงข้อมูลในแอป Wear OS ดังที่แสดงในตัวอย่างต่อไปนี้

class AuthDataListenerService : WearableListenerService() {
    override fun onDataChanged(dataEvents: DataEventBuffer) {
        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.
                    handleSignInSequence(token)
                }
            }
        }
    }

    /** placeholder sign in handler. */
    fun handleSignInSequence(token: String?) {}
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ Wearable Data Layer ได้ที่ หัวข้อส่งและซิงค์ข้อมูลใน Wear OS

ใช้ OAuth 2.0

Wear OS รองรับขั้นตอนที่อิงตาม OAuth 2.0 2 ขั้นตอน ซึ่งอธิบายไว้ในส่วนต่อไปนี้

  • การให้สิทธิ์รหัสการให้สิทธิ์ที่มี Proof Key for Code Exchange (PKCE) ตามที่กำหนดไว้ ใน RFC 7636
  • การให้สิทธิ์การตรวจสอบสิทธิ์ของอุปกรณ์ (DAG) ตามที่กำหนดไว้ใน RFC 8628
Proof Key for Code Exchange (PKCE)

หากต้องการใช้ PKCE อย่างมีประสิทธิภาพ ให้ใช้ RemoteAuthClient จากนั้นสร้างออบเจ็กต์ OAuthRequest เพื่อส่งคำขอการตรวจสอบสิทธิ์จากแอป Wear OS ไปยังผู้ให้บริการ OAuth ออบเจ็กต์นี้ประกอบด้วย URL ไปยังปลายทาง OAuth สำหรับรับโทเค็นและออบเจ็กต์ CodeChallenge

โค้ดต่อไปนี้แสดงตัวอย่างการสร้างคำขอการตรวจสอบสิทธิ์

val oauthRequest = OAuthRequest.Builder(context)
    .setAuthProviderUrl(uri)
    .setCodeChallenge(codeChallenge)
    .setClientId(CLIENT_ID)
    .build()

หลังจากสร้างคำขอการตรวจสอบสิทธิ์แล้ว ให้ส่งคำขอไปยังแอปคู่โดยใช้เมธอด sendAuthorizationRequest()

RemoteAuthClient.create(context).sendAuthorizationRequest(
    request = oauthRequest,
    executor = { command -> command?.run() },
    clientCallback = object : RemoteAuthClient.Callback() {
        override fun onAuthorizationResponse(
            request: OAuthRequest,
            response: OAuthResponse
        ) {
            // Extract the token from the response, store it, and use it in requests.
            continuation.resume(parseCodeFromResponse(response))
        }
        override fun onAuthorizationError(request: OAuthRequest, errorCode: Int) {
            // Handle Errors
            continuation.resume(Result.failure(IOException("Authorization failed")))
        }
    }
)

คำขอนี้จะทริกเกอร์การเรียกไปยังแอปคู่ ซึ่งจะแสดง UI การให้สิทธิ์ในเว็บเบราว์เซอร์ในโทรศัพท์มือถือของผู้ใช้ ผู้ให้บริการ 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 การตอบกลับและส่งต่อการตอบกลับไปยังแอป Wear OS โดยใช้ onAuthorizationResponse API

จากนั้นแอปสมาร์ทวอทช์จะแลกรหัสการให้สิทธิ์เป็นโทเค็นเพื่อการเข้าถึงได้

การให้สิทธิ์การตรวจสอบสิทธิ์ของอุปกรณ์

เมื่อใช้การให้สิทธิ์การตรวจสอบสิทธิ์ของอุปกรณ์ ผู้ใช้จะเปิด URI การยืนยันในอุปกรณ์อื่น จากนั้นเซิร์ฟเวอร์การให้สิทธิ์จะขอให้ผู้ใช้อนุมัติหรือปฏิเสธคำขอ

หากต้องการทำให้กระบวนการนี้ง่ายขึ้น ให้ใช้ RemoteActivityHelper เพื่อเปิดหน้าเว็บใน อุปกรณ์เคลื่อนที่ที่จับคู่ของผู้ใช้ ดังที่แสดงในตัวอย่างต่อไปนี้

// Request access from the authorization server and receive Device Authorization Response.
private fun verifyDeviceAuthGrant(verificationUri: String) {
    RemoteActivityHelper(context).startRemoteActivity(
        Intent(Intent.ACTION_VIEW).apply {
            addCategory(Intent.CATEGORY_BROWSABLE)
            data = Uri.parse(verificationUri)
        },
        null
    )
}

หากคุณมีแอป iOS ให้ใช้ Universal Link เพื่อดักจับ Intent นี้ในแอปแทนที่จะใช้เบราว์เซอร์ในการให้สิทธิ์โทเค็น