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

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

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

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

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

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

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

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

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

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

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

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

val wristDetectionEnabled =
        isWristDetectionAutoLockingEnabled(applicationContext)

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

Credential Manager

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

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

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

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

พาสคีย์ใน Wear OS

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

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

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

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

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

ใช้พาสคีย์

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

ตั้งค่า

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

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

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

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

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

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

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

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

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

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

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

yourCoroutineScope.launch {
    try {
      val response = credentialManager.getCredential(activity, request)
      signInWithCredential(response.credential)
    } catch (e: GetCredentialCancellationException) {
      navigateToFallbackAuthMethods()
    }
}

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

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

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

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

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

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

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.
            }
        }
    }
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ 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 จากนั้นหากต้องการส่งคำขอการให้สิทธิ์จากแอป 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.
        }
    }
)

คำขอนี้จะทริกเกอร์การเรียกไปยังแอปคู่ ซึ่งจะแสดง 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.
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 ให้ใช้ Universal Link เพื่อสกัดกั้น Intent นี้ในแอปแทนที่จะพึ่งพาเบราว์เซอร์ในการให้สิทธิ์โทเค็น

เปลี่ยนจากการลงชื่อเข้าใช้ด้วย Google แบบเดิม

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

// 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+")
  }
)