একাধিক Oauth2 অ্যাক্সেস টোকেন


13

আমার কাছে এমন একটি এপিআই রয়েছে যা oAuth2 এবং আমার নিজস্ব অ্যাপ্লিকেশনগুলি ব্যবহার করে যা এই এপিআইটিকে তাদের ব্যাকএন্ড হিসাবে ব্যবহার করে। যেহেতু ব্যবহারকারীরা একই সাথে একাধিক ডিভাইস (যেমন আইফোন, আইপ্যাড, অ্যান্ড্রয়েড ট্যাবলেট বা অ্যান্ড্রয়েড ফোন) এর মাধ্যমে লগ ইন করতে পারে, তাই প্রতিটি সংযোগের মধ্যে পার্থক্য করার জন্য আমার এপিআই দরকার। আমি পৃথক অ্যাক্সেস টোকেনের মাধ্যমে এটি করতে চাই: প্রতিটি ক্লায়েন্ট পৃথক অ্যাক্সেস টোকেন পায়।

সমস্যাটি হ'ল আমরা ব্যবহার করি বর্তমান বাস্তবায়ন (স্প্রিং-সুরক্ষা-oauth2) ক্লায়েন্ট_আইডি, ব্যবহারকারীর নাম এবং স্কোপের উপর ভিত্তি করে একটি অনন্য কী উত্পন্ন করে। সুতরাং মূলত, অ্যাক্সেস টোকেন পাওয়ার সময়, সমস্ত ক্লায়েন্ট একই ব্যবহারকারীর জন্য একই অ্যাক্সেস টোকন পায়। এটি DefaultAuthenticationKeyGenerator ব্যবহার করে করা হয়।

প্রমাণীকরণ কী জেনারেটর উপেক্ষা এবং ক্লায়েন্টের প্রতিটি অনুরোধে কেবল নতুন অ্যাক্সেস টোকেন তৈরি করা নিরাপদ?


2
আপনি কি প্রতিটি ক্লায়েন্টকে আলাদা করতে সুযোগ ব্যবহার করতে পারেন? উদাহরণস্বরূপ, আইওসকে একটি "আইওএস" স্কোপ, অ্যান্ড্রয়েডকে একটি "অ্যান্ড্রয়েড" স্কোপ, ট্যাবলেটটিকে একটি "ট্যাবলেট" স্কোপ ইত্যাদি দিন F প্রতিবার একটি ব্র্যান্ড নতুন টোকেন উত্পন্ন।
রব

সাধারণভাবে, যদিও, স্প্রিং সিকিউরিটি OAuth2 বাস্তবায়ন আমার জন্য ভাল কাজ করেছিল (একবার আমি এক্সএমএল কনফিগারেশনের মাধ্যমে পেয়েছিলাম), তবে টোকেন এবং প্রমাণীকরণের বিষয়গুলি পরিচালনা করা একটি চলমান ব্যথার বিষয় ছিল।
রব

2
"DefaultAuthenticationKeyGenerator" এর জন্য গুগল অনুসন্ধান করা আমাকে গিটহাবের বসন্ত-সুরক্ষা-ওউথ লাইব্রেরিতে জাভা ফাইলের দিকে নিয়ে যায়। এই শ্রেণিটি AuthenticationKeyGeneratorইন্টারফেস প্রয়োগ করে । আপনি কি নিজের বাস্তবায়ন তৈরি করতে পারেন এবং তার পরিবর্তে এটি ব্যবহার করতে পারেন?
গ্রেগ বার্গার্ট

। জাভা ফাইলের URL টি আমি খুঁজে পেয়েছি: github.com/spring-projects/spring-security-oauth/blob/master/…
গ্রেগ বার্গার্ট

2
আমি @ রবের সাথে একমত, আপনি "অ্যান্ড্রয়েড", "আইওএস", "ওয়েব" ইত্যাদির মতো অনুরোধে ডিভিসিটাইপ সহ যেতে পারেন
বিকাশ রাজপুরোহিত

উত্তর:


1

বসন্তের মেঘ ইতিমধ্যে এই আচরণ সরবরাহ করে। শুধু বিভিন্ন ক্লায়েন্ট যুক্ত করুন। আপনার অনুমোদনের সেবা সার্ভার কনফিগারেশন ক্লাসে আইওএসএপসিলেট, অ্যান্ড্রয়েড অ্যাপ্লিকেশন পছন্দ করুন।

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
                clients.inMemory().withClient("androidAppclient")
                    .secret("clientsecret")
                    .autoApprove(true)
                    .accessTokenValiditySeconds(120)
                    .authorizedGrantTypes("password")
                    .resourceIds("accountservice")
                    .scopes("read", "write")
                    .and()
                    .withClient("iosappclient")
                    ........

        }

ব্যাকএন্ডে আপনি নীচের মত ক্লায়েন্টআইডি পেতে পারেন

clientId = ((OAuth2Authentication) authentication).getOAuth2Request().getClientId();

এবং ক্লায়েন্টআইডের উপর ভিত্তি করে বিভিন্ন আচরণ বাস্তবায়ন করুন।


0

একটি উত্তর হ'ল প্রতিটি অ্যাপ প্ল্যাটফর্মের আলাদা ক্লায়েন্ট, তাই আলাদা ক্লায়েন্টের আইডি থাকা উচিত। আইওএস অ্যাপ্লিকেশানের জন্য একটি, ওয়েব সাইটের জন্য একটি etc.

আইপ্যাড বনাম আইফোন বলার মধ্যে পার্থক্য করার জন্য, আমি এটির জন্য OAuth সিস্টেমের উপর নির্ভর না করার পরামর্শ দেব।


0

স্প্রিং বুট এবং 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 ডাইজেস্টকে (অভ্যন্তরীণভাবে ব্যবহৃত হয়) দুইবার বলা হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.