Autentikasi di perangkat wearable

Aplikasi Wear OS dapat berjalan secara mandiri tanpa aplikasi pendamping. Ini berarti aplikasi Wear OS perlu mengelola autentikasi sendiri saat mengakses data dari internet. Namun, ukuran layar smartwatch yang kecil dan kemampuan input yang berkurang membatasi opsi autentikasi yang dapat digunakan aplikasi Wear OS.

Panduan ini membahas metode autentikasi yang direkomendasikan untuk aplikasi Wear OS dan juga alternatif jika metode tersebut tidak sesuai dengan kasus penggunaan aplikasi.

Untuk mempelajari lebih lanjut cara mendesain pengalaman login yang baik, lihat Panduan UX login.

Mode tamu

Tidak mewajibkan autentikasi untuk semua fungsi. Sebagai gantinya, sediakan fitur sebanyak mungkin kepada pengguna tanpa mengharuskannya login.

Pengguna dapat menemukan dan menginstal aplikasi Wear Anda tanpa menggunakan perangkat seluler jadi mereka mungkin tidak memiliki akun dan mungkin tidak tahu fitur apa yang di seluruh platform Google. Pastikan fungsi mode tamu menampilkan fitur aplikasi Anda secara akurat.

Beberapa perangkat mungkin tetap terbuka kuncinya lebih lama

Pada perangkat yang didukung yang menjalankan Wear OS 5 atau yang lebih baru, sistem akan mendeteksi apakah pengguna memakai perangkat di pergelangan tangan mereka. Jika pengguna menonaktifkan pergelangan tangan deteksi, dan kemudian melepaskan perangkat dari pergelangan tangan mereka, sistem menjaga perangkat terbuka kuncinya untuk waktu yang lebih lama dari yang seharusnya.

Jika aplikasi Anda memerlukan tingkat keamanan yang lebih tinggi—seperti saat menampilkan data yang berpotensi sensitif atau pribadi—periksa terlebih dahulu apakah deteksi pergelangan tangan diaktifkan:

val wristDetectionEnabled =
        isWristDetectionAutoLockingEnabled(applicationContext)

Jika nilai hasil dari metode ini adalah false, minta pengguna untuk login ke akun di aplikasi Anda sebelum menampilkan konten khusus pengguna.

Metode autentikasi yang direkomendasikan

Gunakan metode autentikasi berikut untuk mengaktifkan aplikasi Wear OS mandiri untuk mendapatkan kredensial otentikasi pengguna.

Meneruskan token menggunakan lapisan data

Aplikasi pendamping ponsel dapat mentransfer data autentikasi ke aplikasi Wear OS dengan aman menggunakan Lapisan Data Wearable. Transfer kredensial sebagai pesan atau item data.

Jenis autentikasi ini biasanya tidak meminta pengguna untuk melakukan tindakan apa pun. Namun, hindari melakukan autentikasi tanpa memberi tahu pengguna bahwa mereka sedang login. Anda dapat memberi tahu pengguna menggunakan layar sederhana yang dapat ditutup, yang menunjukkan bahwa akun mereka sedang ditransfer dari perangkat seluler.

Penting: Aplikasi Wear harus menawarkan minimal satu metode autentikasi lain karena opsi ini hanya berfungsi pada smartwatch yang tersambung ke ponsel Android saat aplikasi seluler yang terkait diinstal. Berikan metode autentikasi alternatif bagi pengguna yang tidak memiliki aplikasi seluler yang sesuai, atau yang perangkat Wear OS-nya disambungkan dengan perangkat iOS.

Teruskan token menggunakan lapisan data dari aplikasi seluler seperti yang ditunjukkan pada contoh berikut:

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)

Proses peristiwa perubahan data di aplikasi smartwatch seperti yang ditunjukkan dalam contoh berikut:

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

Untuk informasi lengkap tentang penggunaan Lapisan Data Wearable, lihat Mengirim dan menyinkronkan data di Wear OS.

Menggunakan OAuth 2.0

Wear OS mendukung dua alur berbasis OAuth 2.0, yang dijelaskan di bagian berikut:

  • Pemberian Kode Otorisasi dengan Kunci Bukti untuk Code Exchange (PKCE), seperti yang dijelaskan dalam RFC 7636
  • Pemberian Otorisasi Perangkat, seperti yang dijelaskan dalam RFC 8628.

Catatan: Untuk memastikan aplikasi Anda aktif saat smartwatch beralih ke mode standby, aktifkan mode Selalu Aktif menggunakan AmbientModeSupport.attach dalam aktivitas yang melakukan autentikasi. Untuk mengetahui informasi selengkapnya tentang praktik terbaik dalam mode standby, lihat Menjaga aplikasi Anda tetap terlihat di Wear.

Kunci Bukti untuk Pertukaran Kode (PKCE)

Untuk menggunakan PKCE secara efektif, gunakan RemoteAuthClient.

Untuk membuat permintaan autentikasi dari aplikasi Wear OS ke penyedia OAuth, buat objek OAuthRequest. Objek ini terdiri dari URL ke endpoint OAuth Anda untuk mendapatkan token dan objek CodeChallenge. Kode berikut menunjukkan contoh pembuatan permintaan autentikasi:

val request = OAuthRequest.Builder(this.applicationContext)
    .setAuthProviderUrl(Uri.parse("https://...."))
    .setClientId(clientId)
    .setCodeChallenge(codeChallenge)
    .build()

Setelah Anda membuat permintaan autentikasi, kirimkan ke aplikasi pendamping menggunakan metode 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
        }
    }
)

Permintaan ini memicu panggilan ke aplikasi pendamping yang kemudian akan menampilkan UI otorisasi di browser web pada ponsel pengguna. Penyedia OAuth 2.0 mengautentikasi pengguna dan memperoleh izin pengguna untuk izin yang diminta. Respons akan dikirim ke URL alihan yang dibuat secara otomatis.

Setelah otorisasi berhasil atau gagal, server OAuth 2.0 akan mengalihkan ke URL yang disebutkan dalam permintaan. Jika pengguna menyetujui permintaan akses, respons akan berisi kode otorisasi. Jika pengguna tidak menyetujui permintaan tersebut, respons akan berisi pesan error.

Respons berupa string kueri, dan akan terlihat seperti salah satu contoh berikut:

  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

Tindakan ini akan memuat halaman yang mengarahkan pengguna ke aplikasi pendamping. Aplikasi pendamping memverifikasi URL respons dan meneruskan respons ke aplikasi smartwatch pihak ketiga menggunakan onAuthorizationResponse API.

Kemudian aplikasi smartwatch dapat menukar kode otorisasi dengan token akses.

Catatan: Setelah OAuthRequest dibuat, Anda dapat menemukan URL alihan dengan mengakses redirectUrl.

Pemberian Otorisasi Perangkat

Saat menggunakan Pemberian Otorisasi Perangkat, pengguna akan membuka URI verifikasi di perangkat lain. Kemudian, server otorisasi akan meminta atau menolak permintaan tersebut.

Untuk mempermudah proses ini, gunakan RemoteActivityHelper untuk membuka halaman web di perangkat seluler pengguna yang disambungkan, seperti yang ditunjukkan dalam contoh berikut:

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

Jika Anda memiliki aplikasi iOS, gunakan link universal untuk menangkap intent ini di aplikasi Anda, bukan mengandalkan browser untuk melakukan otorisasi token.

Metode autentikasi lainnya

Wear OS mendukung metode login tambahan, yang dijelaskan di bagian berikut.

Login dengan Google

Login dengan Google memungkinkan pengguna login dengan akun Google yang sudah mereka miliki. Menawarkan terbaik dan mudah untuk didukung, terutama jika Anda sudah menerapkan di aplikasi genggam Anda.

Setelah metode autentikasi yang direkomendasikan sebelumnya dijelaskan, Login dengan Google adalah solusi pilihan berikutnya karena juga dapat berfungsi dengan baik di iOS. Bagian berikut menjelaskan cara menyelesaikan integrasi Login dengan Google di tingkat dasar.

Prasyarat

Sebelum mulai mengintegrasikan Login dengan Google di aplikasi Wear OS, Anda harus mengonfigurasi project Konsol API Google dan menyiapkan project Android Studio. Untuk informasi selengkapnya, lihat Memulai Integrasi Login dengan Google ke Aplikasi Android.

Jika Anda menggunakan Login dengan Google dengan aplikasi atau situs yang berkomunikasi dengan server backend, ada dua prasyarat tambahan:

  • Buat client ID aplikasi web OAuth 2.0 untuk server backend Anda. Client ID ini berbeda dengan client ID aplikasi Anda. Untuk informasi selengkapnya, lihat Mengaktifkan Akses Sisi Server.
  • Identifikasi pengguna yang saat ini login dengan aman di server dengan mengirimkan token ID pengguna menggunakan HTTPS. Untuk mempelajari cara mengautentikasi pengguna di server backend, lihat Mengautentikasi dengan server backend.

Mengintegrasikan Login dengan Google ke dalam aplikasi

Tinjau dan terapkan langkah-langkah berikut, yang dijelaskan di bagian berikut ini, untuk mengintegrasikan Login dengan Google ke dalam aplikasi Wear OS:

  1. Mengonfigurasi Login dengan Google.
  2. Menambahkan tombol Login dengan Google.
  3. Memulai alur login saat tombol login diketuk.

Mengonfigurasi Login dengan Google dan mem-build objek GoogleApiClient

Dalam metode onCreate() aktivitas login, konfigurasi Login dengan Google untuk meminta data pengguna yang dibutuhkan oleh aplikasi Anda. Kemudian, buat objek GoogleApiClient dengan akses ke Google Sign-In API dan opsi yang Anda tentukan. Langkah-langkah ini ditunjukkan dalam contoh berikut:

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);
    }
}

Menambahkan tombol Login dengan Google ke aplikasi

Selesaikan langkah-langkah berikut untuk menambahkan tombol Login dengan Google:

  1. Tambahkan SignInButton ke tata letak aplikasi Anda:
  2.  <com.google.android.gms.common.SignInButton
     android:id="@+id/sign_in_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
  3. Dalam metode onCreate() aplikasi Anda, daftarkan OnClickListener tombol untuk memproses login pengguna saat diketuk:
  4. Kotlin

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

    Java

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

Membuat intent login dan memulai alur login

Tangani ketukan tombol login dalam metode onCLick() dengan membuat intent login dengan metode getSignInIntent(). Kemudian, mulai intent dengan metode startActivityForResult().

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

Pengguna akan diminta memilih Akun Google yang akan digunakan untuk login. Jika Anda meminta cakupan di luar profil, email, dan openID, pengguna juga akan diminta untuk memberikan akses ke resource tersebut.

Terakhir, dalam aktivitas onActivityResult, ambil hasil login dengan getSignInResultFromIntent. Setelah Anda mengambil hasil login, Anda dapat memeriksa apakah proses login berhasil menggunakan isSuccess. Jika login berhasil, Anda dapat memanggil metode getSignInAccount untuk mendapatkan objek GoogleSignInAccount yang berisi informasi tentang pengguna yang login, seperti nama pengguna. Langkah-langkah ini ditampilkan dalam contoh berikut.

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();
        }
    }
}

Untuk melihat contoh aplikasi yang mengimplementasikan Login dengan Google, lihat Contoh Login dengan Google Horologist di GitHub.

Autentikasi kode kustom

Sebagai alternatif metode autentikasi yang dijelaskan sebelumnya, Anda dapat meminta pengguna untuk mengautentikasi dari perangkat lain, seperti ponsel atau tablet, dan mendapatkan kode numerik yang memiliki masa aktif singkat. Pengguna kemudian memasukkan kode pada perangkat Wear OS untuk mengonfirmasi identitas mereka dan menerima token autentikasi.

Alur autentikasi ini menggunakan modul login aplikasi atau mengintegrasikan metode login penyedia autentikasi pihak ketiga ke dalam kode aplikasi Anda secara manual. Meskipun metode otentikasi ini membutuhkan pekerjaan manual dan upaya tambahan lebih aman, Anda dapat menggunakan metode ini jika memerlukan autentikasi lebih awal di aplikasi Wear OS mandiri.

Alur autentikasi untuk penyiapan ini berjalan sebagai berikut:

  1. Pengguna melakukan tindakan pada aplikasi Wear OS yang memerlukan otorisasi.
  2. Aplikasi Wear OS menampilkan layar autentikasi kepada pengguna dan memerintahkan pengguna untuk memasukkan kode dari URL tertentu.
  3. Pengguna beralih ke perangkat seluler, tablet, atau PC, lalu meluncurkan browser, membuka URL yang ditentukan di aplikasi Wear OS, dan login.
  4. Pengguna menerima kode numerik yang memiliki masa aktif singkat yang dimasukkan ke layar autentikasi aplikasi Wear OS menggunakan keyboard yang ada di perangkat Wear OS:

  5. Dari sini dan seterusnya, Anda dapat menggunakan kode yang dimasukkan sebagai bukti bahwa ini adalah pengguna yang benar, dan menukar kode dengan token autentikasi yang disimpan dan diamankan di perangkat Wear OS untuk panggilan yang diautentikasi.

Catatan: Kode yang dihasilkan pengguna harus sepenuhnya berupa angka dan tidak boleh berisi karakter alfabet.

Alur autentikasi ini digambarkan dalam diagram berikut: