Spring Boot ve OAuth2 ile arka ucumu geliştirirken aynı sorun üzerinde tökezledim. Karşılaştığım sorun, birden fazla cihaz aynı jetonları paylaşırsa, bir cihaz jetonu yenilediğinde, diğer cihaz clueless ve uzun hikaye kısa olacaktı, her iki cihazın da jeton yenileme çılgınlığına girdi. Çözümüm, varsayılanı , anahtar üreteci karışımına AuthenticationKeyGenerator
geçersiz kılan DefaultAuthenticationKeyGenerator
ve yeni bir parametre ekleyen özel bir uygulama ile değiştirmekti client_instance_id
. Mobil istemcilerim daha sonra uygulama yüklemelerinde (iOS veya Android) benzersiz olması gereken bu parametreyi gönderir. Çoğu mobil uygulama zaten uygulama örneğini bir biçimde izlediğinden bu özel bir gereklilik değildir.
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);
}
}
daha sonra benzer bir şekilde enjekte edersiniz:
final JdbcTokenStore tokenStore = new JdbcTokenStore(mDataSource);
tokenStore.setAuthenticationKeyGenerator(new EnhancedAuthenticationKeyGenerator());
HTTP isteği daha sonra şöyle görünecektir
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}}
Bu yaklaşımı kullanmanın yararı, istemci bir gönderme yapmazsa client_instance_id
, varsayılan anahtarın üretilmesidir ve bir örnek sağlanırsa, aynı anahtar için her seferinde aynı anahtar döndürülür. Ayrıca, anahtar platformdan bağımsızdır. Dezavantajı, MD5 özetinin (dahili olarak kullanılır) iki kez çağrılmasıdır.