স্প্রিং বুট এবং OAuth2 এর সাথে আমার ব্যাকেন্ডটি বিকাশ করার সময় আমি একই সমস্যায় পড়েছি। আমার যে সমস্যার মুখোমুখি হয়েছিল তা হ'ল, যদি একাধিক ডিভাইস একই টোকেনগুলি ভাগ করে নেয়, তবে একবার একটি ডিভাইস টোকেনকে সতেজ করে তুললে, অন্য ডিভাইসটি নিখরচায় এবং দীর্ঘ গল্পের ছোট হয়ে যায়, উভয় ডিভাইসই টোকেন রিফ্রেশ উন্মাদনায় প্রবেশ করেছিল। আমার সমাধানটি হ'ল ডিফল্টটিকে AuthenticationKeyGenerator
একটি কাস্টম প্রয়োগের সাথে প্রতিস্থাপন করা হবে যা কী জেনারেটরের মিশ্রণকে ওভাররাইড করে DefaultAuthenticationKeyGenerator
এবং একটি নতুন প্যারামিটার যুক্ত client_instance_id
করে। আমার মোবাইল ক্লায়েন্টরা তখন এই পরামিতিটি প্রেরণ করবে যা অ্যাপ্লিকেশন ইনস্টল (আইওএস বা অ্যান্ড্রয়েড) জুড়ে অনন্য হতে হবে। এটি কোনও বিশেষ প্রয়োজনীয়তা নয়, যেহেতু বেশিরভাগ মোবাইল অ্যাপ্লিকেশন ইতিমধ্যে কোনও রূপে অ্যাপ্লিকেশন উদাহরণটি ট্র্যাক করে।
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());
এইচটিটিপি অনুরোধটি তখন এর মতো কিছু দেখবে
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 ডাইজেস্টকে (অভ্যন্তরীণভাবে ব্যবহৃত হয়) দুইবার বলা হয়।