Autentikasi di perangkat wearable

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

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

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 meskipun belum pernah menggunakan aplikasi seluler sebelumnya sehingga mungkin tidak memiliki akun. Dalam hal ini, fungsi mode tamu harus menampilkan fitur aplikasi secara akurat untuk mendorong pengguna membuat akun.

Metode autentikasi yang direkomendasikan

Gunakan metode autentikasi berikut untuk mengaktifkan aplikasi Wear OS mandiri untuk mendapatkan kredensial autentikasi 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 alur berbasis OAuth 2.0 berikut:

  • Pemberian Kode Otorisasi dengan PKCE (Kunci Bukti untuk Pertukaran Kode), 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 informasi lengkap 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. Lihat contoh pembuatan permintaan autentikasi berikut:

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 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 akan berbentuk 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

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

Autentikasi berbasis sandi

Jika server Anda tidak mendukung salah satu alur OAuth 2.0 yang dijelaskan, tampilkan nama pengguna dan sandi kepada pengguna.

Pastikan Anda menyertakan petunjuk tentang isi otomatis guna memastikan pengguna diberi sandi tersimpan jika mereka memilikinya. Contoh berikut menetapkan petunjuk sandi pada EditText di file tata letak Anda:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autofillHints="password" />

Lihat Mengoptimalkan aplikasi Anda untuk isi otomatis untuk mengetahui informasi selengkapnya.

Metode autentikasi lainnya

Wear OS mendukung metode login tambahan.

Login dengan Google

Login dengan Google memungkinkan pengguna untuk login dengan akun Google yang sudah mereka miliki. Metode autentikasi ini menawarkan pengalaman pengguna terbaik serta mudah untuk didukung, terutama jika Anda telah mengimplementasikan solusi ini pada aplikasi ponsel.

Login dengan Google adalah solusi yang paling banyak dipilih karena juga dapat difungsikan di iOS. Bagian berikut menjelaskan cara menyelesaikan integrasi Login dengan Google di tingkat dasar.

Prasyarat

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

Catatan: Jika Anda menggunakan Login dengan Google dengan aplikasi atau situs yang berkomunikasi dengan server backend, buat client ID aplikasi web OAuth 2.0 untuk server backend Anda. ID klien ini berbeda dengan ID klien aplikasi Anda. Untuk informasi selengkapnya, lihat Mengaktifkan Akses Sisi Server.

Penting: Jika aplikasi Anda berkomunikasi dengan server backend, identifikasi pengguna yang saat ini login dengan aman di server dengan mengirimkan token ID pengguna tersebut menggunakan HTTPS. Untuk mempelajari cara mengautentikasi pengguna di server backend, lihat Mengautentikasi dengan server backend.

Mengintegrasikan Login dengan Google ke dalam aplikasi Anda

Untuk mengintegrasikan Login dengan Google ke dalam aplikasi Wear OS, Anda harus:

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

Mengonfigurasi Login dengan Google dan mem-build objek GoogleApiClient

Dalam metode onCreate aktivitas login, konfigurasikan Login dengan Google untuk meminta data pengguna yang diperlukan oleh aplikasi Anda. Kemudian, buat objek GoogleApiClient dengan akses ke Google Sign-In API dan opsi yang Anda tentukan.

Kotlin

// Configure sign-in to request the user's ID, email address, and basic
// profile. The ID and basic profile are included in DEFAULT_SIGN_IN.
// If you need to request additional scopes to access Google APIs, specify them with
// requestScopes().
googleApiClient = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestEmail()
        .build()
        .let { signInConfigBuilder ->
            // Build a GoogleApiClient with access to the Google Sign-In API and the
            // options specified in the sign-in configuration.
            GoogleApiClient.Builder(this)
                    .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
                    .addApi(Auth.GOOGLE_SIGN_IN_API, signInConfigBuilder)
                    .build()
        }

Java

// Configure sign-in to request the user's ID, email address, and basic
// profile. The ID and basic profile are included in DEFAULT_SIGN_IN.
// If you need to request additional scopes to access Google APIs, specify them with
// requestScopes().
GoogleSignInOptions.Builder signInConfigBuilder = new GoogleSignInOptions
        .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestEmail()
        .build();

// Build a GoogleApiClient with access to the Google Sign-In API and the
// options specified in the sign-in configuration.
googleApiClient = new GoogleApiClient.Builder(this)
        .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
        .addApi(Auth.GOOGLE_SIGN_IN_API, signInConfigBuilder)
        .build();

Menambahkan tombol Login dengan Google ke aplikasi

  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 membuat pengguna login saat diklik.
  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

Saat tombol login diklik, tangani tombol login dengan mengetuk metode onCLick() dengan membuat intent login dengan metode getSignInIntent, lalu mulai intent dengan metode startActivityForResult.

Kotlin

Auth.GoogleSignInApi.getSignInIntent(googleApiClient).also { signInIntent ->
    startActivityForResult(signInIntent, RC_SIGN_IN)
}

Java

Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
startActivityForResult(signInIntent, 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, pada metode onActivityResult aktivitas, ambil hasil login dengan getSignInResultFromIntent. Setelah Anda mengambil hasil login, Anda dapat memeriksa apakah proses login berhasil menggunakan metode isSuccess. Jika login berhasil, Anda dapat memanggil metode getSignInAccount untuk mendapatkan objek GoogleSignInAccount yang berisi informasi tentang pengguna yang login, seperti nama pengguna.

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
public 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 aplikasi contoh yang mengimplementasikan Login dengan Google, lihat aplikasi contoh di GitHub.

Autentikasi kode kustom

Metode autentikasi ini mengharuskan pengguna untuk menjalankan autentikasi dari sumber eksternal (perangkat seluler/tablet/PC) dan mendapatkan kode yang memiliki masa aktif singkat yang dimasukkan pengguna untuk membuktikan identitasnya dan ditukarkan dengan token autentikasi di perangkat Wear OS. Dengan metode ini, Anda dapat mengautentikasi pengguna ke aplikasi Wear OS dengan menggunakan modul login aplikasi, atau dengan mengintegrasikan metode login penyedia autentikasi pihak ketiga ke dalam kode aplikasi Anda secara manual. Meskipun metode ini memerlukan kerja manual dan upaya tambahan untuk meningkatkan keamanannya, jika Anda memerlukan autentikasi lebih awal di aplikasi Wear OS mandiri, metode ini dapat membantu.

Alur autentikasi untuk penyiapan ini berjalan sebagai berikut:

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

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