การตรวจสอบสิทธิ์ในอุปกรณ์ที่สวมใส่ได้

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

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

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

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

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

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

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

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

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

val wristDetectionEnabled =
        isWristDetectionAutoLockingEnabled(applicationContext)

หากค่าที่แสดงผลของเมธอดนี้คือ false แจ้งให้ผู้ใช้ลงชื่อเข้าใช้ ในแอปของคุณก่อนที่จะแสดงเนื้อหาที่เจาะจงผู้ใช้

วิธีการตรวจสอบสิทธิ์ที่แนะนำ

ใช้วิธีการตรวจสอบสิทธิ์ต่อไปนี้เพื่อเปิดใช้แอป Wear OS แบบสแตนด์อโลน ขอรับข้อมูลเข้าสู่ระบบการตรวจสอบสิทธิ์ผู้ใช้

ส่งโทเค็นโดยใช้ชั้นข้อมูล

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

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

สำคัญ แอป Wear ของคุณต้องเสนอวิธีการตรวจสอบสิทธิ์วิธีอื่นอย่างน้อย 1 วิธีเนื่องจาก ตัวเลือกนี้จะใช้ได้เฉพาะใน นาฬิกาที่จับคู่ Android เมื่อติดตั้งแอปบนอุปกรณ์เคลื่อนที่ที่เกี่ยวข้อง ระบุ URL อื่น วิธีการตรวจสอบสิทธิ์สําหรับผู้ใช้ที่ไม่มีแอปบนอุปกรณ์เคลื่อนที่ที่เกี่ยวข้องหรือมี 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 2 ขั้นตอนตามที่อธิบายไว้ในส่วน ที่เป็นไปตาม:

  • การให้สิทธิ์รหัสการให้สิทธิ์พร้อมคีย์หลักฐานสำหรับการแลกเปลี่ยนโค้ด (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
        }
    }
)

คำขอนี้ทริกเกอร์การเรียกแอปที่ใช้ร่วมกัน ซึ่งจากนั้นจะแสดง 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 ตอบกลับและส่งต่อการตอบสนองไปยังแอปสมาร์ทวอทช์ของบุคคลที่สามโดยใช้ onAuthorizationResponse API

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

หมายเหตุ: เมื่อสร้าง 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 ให้ใช้ Universal Link เพื่อสกัดกั้นความตั้งใจนี้ในแอปแทนที่จะต้องให้เบราว์เซอร์ให้สิทธิ์โทเค็น

วิธีการตรวจสอบสิทธิ์อื่นๆ

Wear OS รองรับวิธีการลงชื่อเข้าใช้เพิ่มเติมตามที่อธิบายไว้ในส่วนต่อไปนี้

Google Sign-In

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

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

สิ่งที่ต้องมีก่อน

ก่อนที่คุณจะเริ่มผสานรวม Google Sign-In ในแอป Wear OS ได้ คุณต้องกำหนดค่า โปรเจ็กต์คอนโซล Google API และตั้งค่าโปรเจ็กต์ Android Studio สำหรับข้อมูลเพิ่มเติม ดู เริ่มผสานรวม Google Sign-In ในแอป Android ของคุณ

หากคุณใช้ Google Sign-In กับแอปหรือเว็บไซต์ที่ สื่อสารกับเซิร์ฟเวอร์แบ็กเอนด์ ซึ่งมีข้อกําหนดเบื้องต้นเพิ่มเติม 2 ประการ ได้แก่

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

ผสานรวม Google Sign-In ลงในแอปของคุณ

ตรวจสอบและดำเนินการตามขั้นตอนต่อไปนี้ซึ่งมีรายละเอียดในส่วนต่างๆ วิธีผสานรวม Google Sign-In กับแอป Wear OS ที่ตามมา

  1. กำหนดค่า Google Sign-In
  2. เพิ่มปุ่ม Google Sign-In
  3. เริ่มขั้นตอนการลงชื่อเข้าใช้เมื่อปุ่มลงชื่อเข้าใช้ แตะ

กำหนดค่า 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 Sign-In ลงในแอป

ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มปุ่ม Google Sign-In

  1. เพิ่ม SignInButton ลงในเลย์เอาต์ของแอป:
  2.  <com.google.android.gms.common.SignInButton
     android:id="@+id/sign_in_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
  3. ในเมธอด onCreate() ของแอป ให้ลงทะเบียน OnClickListener เพื่อลงชื่อเข้าใช้ให้ผู้ใช้เมื่อแตะ:
  4. Kotlin

    findViewById<View>(R.id.sign_in_button).setOnClickListener(this)
    

    Java

    findViewById(R.id.sign_in_button).setOnClickListener(this);
    

สร้างความตั้งใจในการลงชื่อเข้าใช้และเริ่มขั้นตอนการลงชื่อเข้าใช้

จัดการการแตะปุ่มลงชื่อเข้าใช้ใน onCLick() โดยการสร้าง Intent ในการลงชื่อเข้าใช้ด้วย getSignInIntent() จากนั้นเริ่มต้น Intent ด้วย startActivityForResult()

Intent intent = mSignInClient.getSignInIntent();
startActivityForResult(intent, RC_SIGN_IN);

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

สุดท้าย ใน 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 Sign-In ได้จาก Horologist ตัวอย่างการลงชื่อเข้าใช้ Google ใน GitHub

การตรวจสอบสิทธิ์โค้ดที่กำหนดเอง

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

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

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

  1. ผู้ใช้ดำเนินการกับแอป Wear OS ที่ต้องได้รับสิทธิ์
  2. แอป Wear OS แสดงหน้าจอการตรวจสอบสิทธิ์แก่ผู้ใช้และแจ้งให้ ให้ผู้ใช้ป้อนรหัสจาก URL ที่ระบุ
  3. ผู้ใช้เปลี่ยนไปใช้อุปกรณ์เคลื่อนที่ แท็บเล็ต หรือพีซี แล้วเปิดเบราว์เซอร์ ไปที่ URL ที่ระบุไว้ในแอป Wear OS แล้วเข้าสู่ระบบ
  4. ผู้ใช้จะได้รับรหัสตัวเลขอายุสั้นที่ป้อนลงในแอป Wear OS หน้าจอการตรวจสอบสิทธิ์โดยใช้แป้นพิมพ์ออนบอร์ดใน Wear OS

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

หมายเหตุ: รหัสที่ผู้ใช้สร้าง ต้องเป็นตัวเลขเท่านั้นและไม่มีพยัญชนะ อักขระ

ขั้นตอนการตรวจสอบสิทธิ์นี้จะแสดงในแผนภูมิต่อไปนี้