मैं स्प्रिंग बूट और OAuth2 के साथ अपने बैकेंड को विकसित करते समय एक ही समस्या पर ठोकर खाई। मेरे सामने जो समस्या थी, वह यह थी कि, यदि कई उपकरणों ने एक ही टोकन साझा किया, तो एक बार एक टोकन को रीफ्रेश करने के बाद, दूसरा डिवाइस क्लूलेस होगा और लंबी कहानी छोटी होगी, दोनों डिवाइस एक टोकन रिफ्रेश उन्माद में प्रवेश करते हैं। मेरा समाधान AuthenticationKeyGenerator
एक कस्टम कार्यान्वयन के साथ डिफ़ॉल्ट को बदलना था जो कुंजी जनरेटर मिश्रण में ओवरराइड करता है DefaultAuthenticationKeyGenerator
और एक नया पैरामीटर जोड़ता है client_instance_id
। मेरे मोबाइल क्लाइंट तब इस पैरामीटर को भेजते हैं, जिसे ऐप इंस्टॉल (iOS या Android) में अद्वितीय होना चाहिए। यह एक विशेष आवश्यकता नहीं है, क्योंकि अधिकांश मोबाइल एप्लिकेशन पहले से ही किसी न किसी रूप में एप्लिकेशन इंस्टेंस को ट्रैक करते हैं।
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);
}
}
जिसके बाद आप एक समान तरीके से इंजेक्ट करेंगे:
final JdbcTokenStore tokenStore = new JdbcTokenStore(mDataSource);
tokenStore.setAuthenticationKeyGenerator(new EnhancedAuthenticationKeyGenerator());
HTTP अनुरोध फिर कुछ इस तरह दिखेगा
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}}
इस दृष्टिकोण का उपयोग करने का लाभ यह है कि, यदि ग्राहक ए नहीं भेजता है client_instance_id
, तो डिफ़ॉल्ट कुंजी उत्पन्न होगी, और यदि कोई उदाहरण प्रदान किया जाता है, तो उसी कुंजी को हर बार उसी उदाहरण के लिए लौटाया जाता है। इसके अलावा, कुंजी प्लेटफ़ॉर्म स्वतंत्र है। नकारात्मक पक्ष यह होगा कि एमडी 5 डाइजेस्ट (आंतरिक रूप से प्रयुक्त) को दो बार कहा जाता है।