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 menimpa DefaultAuthenticationKeyGenerator
dan menambahkan parameter baru client_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.
public class EnhancedAuthenticationKeyGenerator extends DefaultAuthenticationKeyGenerator {
public static final String PARAM_CLIENT_INSTANCE_ID = "client_instance_id";
private static final String KEY_SUPER_KEY = "super_key";
private static final String KEY_CLIENT_INSTANCE_ID = PARAM_CLIENT_INSTANCE_ID;
@Override
public String extractKey(final OAuth2Authentication authentication) {
final String superKey = super.extractKey(authentication);
final OAuth2Request authorizationRequest = authentication.getOAuth2Request();
final Map<String, String> requestParameters = authorizationRequest.getRequestParameters();
final String clientInstanceId = requestParameters != null ? requestParameters.get(PARAM_CLIENT_INSTANCE_ID) : null;
if (clientInstanceId == null || clientInstanceId.length() == 0) {
return superKey;
}
final Map<String, String> values = new LinkedHashMap<>(2);
values.put(KEY_SUPER_KEY, superKey);
values.put(KEY_CLIENT_INSTANCE_ID, clientInstanceId);
return generateKey(values);
}
}
yang kemudian akan Anda injeksi dengan cara yang sama:
final JdbcTokenStore tokenStore = new JdbcTokenStore(mDataSource);
tokenStore.setAuthenticationKeyGenerator(new EnhancedAuthenticationKeyGenerator());
Permintaan HTTP akan terlihat seperti ini
POST /oauth/token HTTP/1.1
Host: {{host}}
Authorization: Basic {{auth_client_basic}}
Content-Type: application/x-www-form-urlencoded
grant_type=password&username={{username}}&password={{password}}&client_instance_id={{instance_id}}
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.