Saya memiliki API yang menggunakan oAuth2 dan aplikasi seluler saya sendiri yang menggunakan API ini sebagai backend mereka. Karena pengguna dapat masuk melalui beberapa perangkat (yaitu iPhone, iPad, tablet android atau ponsel android) secara bersamaan, saya memerlukan API untuk membedakan antara setiap koneksi. Saya ingin melakukan ini melalui token akses terpisah: setiap klien mendapat token akses terpisah.
Masalahnya adalah implementasi saat ini yang kami gunakan (spring-security-oauth2) menghasilkan kunci unik berdasarkan client_id, nama pengguna, dan ruang lingkup. Jadi pada dasarnya, ketika mendapatkan token akses, semua klien mendapatkan token akses yang sama untuk pengguna yang sama. Ini dilakukan dengan menggunakan DefaultAuthenticationKeyGenerator.
Apakah aman untuk mengabaikan generator kunci otentikasi dan hanya membuat token akses baru pada setiap permintaan dari klien?
AuthenticationKeyGenerator
antarmuka. Bisakah Anda membuat implementasi Anda sendiri dan menggunakannya?Jawaban:
Awan musim semi sudah menyediakan perilaku ini. Cukup tambahkan Klien yang berbeda. Seperti iosAppClient, androidAppClient di kelas AuthorizationServerConfiguration Anda.
Di backend Anda bisa mendapatkan clientID seperti berikut ini
dan menerapkan perilaku berbeda berdasarkan clientId.
sumber
Satu jawaban adalah bahwa setiap platform aplikasi adalah klien yang berbeda, jadi harus memiliki id klien yang berbeda. Satu untuk aplikasi iOS, satu untuk situs web, dll.
Untuk membedakan antara mengatakan iPad vs iPhone, saya sarankan untuk tidak mengandalkan sistem OAuth untuk ini.
sumber
Saya menemukan masalah yang sama saat mengembangkan backend saya dengan Spring Boot dan OAuth2. Masalah yang saya temui adalah, jika beberapa perangkat berbagi token yang sama, sekali satu perangkat me-refresh token, perangkat lain akan tidak mengerti dan, singkatnya, kedua perangkat dimasukkan dalam hiruk-pikuk token refresh. Solusi saya adalah mengganti default
AuthenticationKeyGenerator
dengan implementasi kustom yang menimpaDefaultAuthenticationKeyGenerator
dan menambahkan parameter baruclient_instance_id
dalam campuran generator utama. Klien seluler saya kemudian akan mengirim parameter ini yang harus unik di seluruh pemasangan aplikasi (iOS atau Android). Ini bukan persyaratan khusus, karena sebagian besar aplikasi seluler sudah melacak instance aplikasi dalam beberapa bentuk.yang kemudian akan Anda injeksi dengan cara yang sama:
Permintaan HTTP akan terlihat seperti ini
Manfaat menggunakan pendekatan ini adalah, jika klien tidak mengirim
client_instance_id
, kunci default akan dihasilkan, dan jika instance disediakan, kunci yang sama dikembalikan setiap kali untuk instance yang sama. Juga, kuncinya adalah platform independen. Kelemahannya adalah bahwa MD5 digest (digunakan secara internal) disebut dua kali.sumber