OAuth2RestTemplate জন্য বসন্ত সুরক্ষা 5 প্রতিস্থাপন


14

ইন spring-security-oauth2:2.4.0.RELEASEযেমন শ্রেণীর OAuth2RestTemplate, OAuth2ProtectedResourceDetailsএবং ClientCredentialsAccessTokenProviderসব অবচিত চিহ্নিত করা হয়েছে।

এই ক্লাসগুলির জাভাডোক থেকে এটি একটি বসন্ত সুরক্ষা মাইগ্রেশন গাইডের দিকে ইঙ্গিত করে যা মানুষকে মূল বসন্ত-সুরক্ষা 5 প্রকল্পে স্থানান্তরিত করা উচিত ins তবে আমি কীভাবে এই প্রকল্পে আমার ব্যবহারের কেসটি বাস্তবায়িত করব তা খুঁজে পেতে আমার সমস্যা হচ্ছে।

সমস্ত ডকুমেন্টেশন এবং উদাহরণগুলি যদি আপনি আপনার অ্যাপ্লিকেশনটিতে আগত অনুরোধগুলি সত্যায়িত করতে চান এবং আপনি পরিচয়টি যাচাই করতে তৃতীয় পক্ষের OAuth প্রদানকারী ব্যবহার করতে চান তবে একটি তৃতীয় অংশ OAuth সরবরাহকারীর সাথে সংহত করার বিষয়ে কথা বলেছেন।

আমার ব্যবহারের ক্ষেত্রে আমি যা করতে চাই RestTemplateতা হ'ল ওআউথ দ্বারা সুরক্ষিত কোনও বাহ্যিক পরিষেবাতে একটি অনুরোধ করা । বর্তমানে আমি OAuth2ProtectedResourceDetailsআমার ক্লায়েন্টের আইডি এবং গোপনীয়তার সাথে একটি তৈরি করি যা আমি পাস করি OAuth2RestTemplate। আমার একটি কাস্টম ClientCredentialsAccessTokenProviderযুক্ত হয়েছে OAuth2ResTemplateযা কেবলমাত্র কিছু অতিরিক্ত শিরোনাম টোকেন অনুরোধে যুক্ত করে যা আমি ব্যবহার করছি OAuth সরবরাহকারীর দ্বারা প্রয়োজনীয়।

স্প্রিং-সিকিউরিটি 5 ডকুমেন্টেশনে আমি একটি বিভাগ পেয়েছি যাতে টোকেন অনুরোধটি কাস্টমাইজ করার কথা উল্লেখ করা হয়েছে , তবে এটি আবার তৃতীয় পক্ষের OAuth সরবরাহকারীর সাথে আগত অনুরোধটিকে প্রমাণীকরণের প্রসঙ্গে বলে মনে হচ্ছে। এটি ClientHttpRequestInterceptorবাহ্যিক পরিষেবাতে প্রতিটি বহির্গামী অনুরোধ প্রথমে একটি টোকেন পায় এবং তারপরে অনুরোধে যুক্ত হয়েছে তা নিশ্চিত করার জন্য আপনি কীভাবে এটির মতো কিছুর সংমিশ্রণে এটি কীভাবে ব্যবহার করবেন তা পরিষ্কার নয় ।

উপরোক্ত সংযুক্ত মাইগ্রেশন গাইডে এখানে একটি উল্লেখ রয়েছে OAuth2AuthorizedClientServiceযা এটি বলেছে যে ইন্টারসেপ্টারগুলিতে ব্যবহারের জন্য দরকারী, তবে আবার এটি মনে হচ্ছে এটি এমন কিছুর উপর নির্ভর করে ClientRegistrationRepositoryযা মনে হয় যেখানে এটি তৃতীয় পক্ষের সরবরাহকারীদের রেজিস্ট্রেশন বজায় রাখে যদি আপনি ব্যবহার করতে চান যে একটি আগত অনুরোধ প্রমাণীকৃত হয় তা নিশ্চিত করতে সরবরাহ করে।

আমার অ্যাপ্লিকেশন থেকে বহির্গামী অনুরোধগুলিতে যোগ করার জন্য একটি টোকেন পাওয়ার জন্য বসন্ত-সুরক্ষা 5-এ নতুন কার্যকারিতাটি আমি কীভাবে ব্যবহার করতে পারি?

উত্তর:


15

স্প্রিং সিকিউরিটি 5.2.x এর OAuth 2.0 ক্লায়েন্ট বৈশিষ্ট্যগুলি সমর্থন করে না RestTemplate, তবে কেবল WebClient। দেখুন স্প্রিং সিকিউরিটি রেফারেন্স :

এইচটিটিপি ক্লায়েন্ট সমর্থন

  • WebClient সার্লেট এনভায়রনমেন্টের জন্য সংহতকরণ (সুরক্ষিত সংস্থার অনুরোধের জন্য)

এছাড়াও, RestTemplateভবিষ্যতের সংস্করণে হ্রাস করা হবে। রেস্টস্টেম্পলেট জাভাডোক দেখুন :

দ্রষ্টব্য: 5.0 হিসাবে, অ-অবরুদ্ধ, প্রতিক্রিয়াশীল org.springframework.web.reactive.client.WebClientএকটি RestTemplateসিঙ্ক এবং অ্যাসিঙ্ক উভয়ের জন্য দক্ষ সমর্থন, পাশাপাশি স্ট্রিমিংয়ের দৃশ্যের পাশাপাশি আধুনিক বিকল্প সরবরাহ করে offers RestTemplateভবিষ্যতে সংস্করণে থামানো হবে এবং প্রধান নতুন বৈশিষ্ট্য থাকবে না এগিয়ে যাচ্ছে এখনো যোগ করেনি। WebClientআরও বিশদ এবং উদাহরণ কোডের জন্য স্প্রিং ফ্রেমওয়ার্ক রেফারেন্স ডকুমেন্টেশনের বিভাগটি দেখুন ।

অতএব, সর্বোত্তম সমাধান হ'ল RestTemplateপক্ষে থাকা উচিত WebClient


WebClientক্লায়েন্ট শংসাপত্র প্রবাহ জন্য ব্যবহার

ক্লায়েন্ট নিবন্ধকরণ এবং সরবরাহকারীকে প্রোগ্রামগতভাবে বা স্প্রিং বুট অটো-কনফিগারেশন ব্যবহার করে কনফিগার করুন:

spring:
  security:
    oauth2:
      client:
        registration:
          custom:
            client-id: clientId
            client-secret: clientSecret
            authorization-grant-type: client_credentials
        provider:
          custom:
            token-uri: http://localhost:8081/oauth/token

… এবং OAuth2AuthorizedClientManager @Bean:

@Bean
public OAuth2AuthorizedClientManager authorizedClientManager(
        ClientRegistrationRepository clientRegistrationRepository,
        OAuth2AuthorizedClientRepository authorizedClientRepository) {

    OAuth2AuthorizedClientProvider authorizedClientProvider =
            OAuth2AuthorizedClientProviderBuilder.builder()
                    .clientCredentials()
                    .build();

    DefaultOAuth2AuthorizedClientManager authorizedClientManager =
            new DefaultOAuth2AuthorizedClientManager(
                    clientRegistrationRepository, authorizedClientRepository);
    authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);

    return authorizedClientManager;
}

সরবরাহকারীর সাথে WebClientব্যবহারের জন্য উদাহরণটি কনফিগার করুন :ServerOAuth2AuthorizedClientExchangeFilterFunctionOAuth2AuthorizedClientManager

@Bean
WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {
    ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2Client =
            new ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
    oauth2Client.setDefaultClientRegistrationId("custom");
    return WebClient.builder()
            .apply(oauth2Client.oauth2Configuration())
            .build();
}

এখন, আপনি যদি এই WebClientদৃষ্টান্তটি ব্যবহার করে অনুরোধ করার চেষ্টা করেন তবে এটি প্রথমে অনুমোদনের সার্ভার থেকে একটি টোকেনের জন্য অনুরোধ করবে এবং অনুরোধে এটি অন্তর্ভুক্ত করবে।


ধন্যবাদ, এটি কয়েকটি জিনিস পরিষ্কার করে দেয় তবে উপরের লিঙ্কযুক্ত সমস্ত ডকুমেন্টেশন থেকে আমি এখনও একটি উদাহরণ খুঁজে পেতে লড়াই করছি যেখানে কোনও ইন্টারসেপ্টার (বা যে কোনও নতুন পরিভাষা যার জন্যই WebClientরয়েছে) বা এর থেকে OAuth টোকন আনতে এরকম কিছু ব্যবহার করা হচ্ছে এটিকে বহির্গামী অনুরোধে যুক্ত করার জন্য কাস্টম ওআউথ সরবরাহকারী (ফেসবুক / গুগলের মতো ওওটিবি সমর্থন করে এমন একটিরও নয়)। সমস্ত উদাহরণ অন্যান্য সরবরাহকারীদের সাথে আগত অনুরোধগুলি প্রমাণীকরণে ফোকাস করে বলে মনে হচ্ছে। কোনও ভাল উদাহরণের জন্য আপনার কোনও পয়েন্টার রয়েছে?
ম্যাট উইলিয়ামস

1
@ ম্যাটউইলিয়ামস আমি WebClientক্লায়েন্টের শংসাপত্রগুলির অনুদানের ধরণের সাথে কীভাবে ব্যবহার করব তার একটি উদাহরণ সহ উত্তরটি আপডেট করেছি ।
আনার সুলতানভ

নিখুঁত, এটি এখন আরও বেশি অর্থবোধ করে, আপনাকে অনেক ধন্যবাদ। আমি কয়েক দিনের জন্য চেষ্টা করে দেখার সুযোগ নাও পাব, তবে একবার ফিরে যাবার পরে ফিরে আসার বিষয়টি সঠিক উত্তর হিসাবে নিশ্চিত করব
ম্যাট উইলিয়ামস

1
এটি এখন খুব হতাশ হয়ে পড়েছে ... কমপক্ষে UnAuthenticatedServerOAuth2AuthorisedClientRepository হ'ল ...
স্লেজহ্যামার

ধন্যবাদ @ স্লেজহ্যামার, আমি আমার উত্তর আপডেট করেছি।
আনার সুলতানভ

1

@ অনার সুলতানভের উপরের উত্তরটি আমাকে এই স্থানে পৌঁছাতে সহায়তা করেছে, তবে আমার OAuth টোকেন অনুরোধে আমাকে অতিরিক্ত কিছু শিরোনাম যুক্ত করতে হয়েছিল বলে আমি ভেবেছিলাম যে আমি কীভাবে আমার ব্যবহারের ক্ষেত্রে সমস্যাটি সমাধান করেছি তার একটি পূর্ণ উত্তর সরবরাহ করব।

সরবরাহকারীর বিশদটি কনফিগার করুন

নিম্নলিখিতটি যুক্ত করুন application.properties

spring.security.oauth2.client.registration.uaa.client-id=${CLIENT_ID:}
spring.security.oauth2.client.registration.uaa.client-secret=${CLIENT_SECRET:}
spring.security.oauth2.client.registration.uaa.scope=${SCOPE:}
spring.security.oauth2.client.registration.uaa.authorization-grant-type=client_credentials
spring.security.oauth2.client.provider.uaa.token-uri=${UAA_URL:}

প্রথা প্রয়োগ করুন ReactiveOAuth2AccessTokenResponseClient

এটি সার্ভার-থেকে-সার্ভার যোগাযোগ হিসাবে আমাদের ব্যবহার করা দরকার ServerOAuth2AuthorizedClientExchangeFilterFunction। এটি কেবল একটি গ্রহণ করে ReactiveOAuth2AuthorizedClientManager, অ-প্রতিক্রিয়াশীল নয় OAuth2AuthorizedClientManager। অতএব যখন আমরা ব্যবহার করি ReactiveOAuth2AuthorizedClientManager.setAuthorizedClientProvider()(OAuth2 অনুরোধটি করার জন্য এটি সরবরাহকারীর ব্যবহার করার জন্য) আমাদের ReactiveOAuth2AuthorizedClientProviderএটি অ-প্রতিক্রিয়াশীলের পরিবর্তে দিতে হবে OAuth2AuthorizedClientProvider। অনুযায়ী বসন্ত সুরক্ষার রেফারেন্স ডকুমেন্টেশন আপনি একটি ব্যবহার অ প্রতিক্রিয়াশীল DefaultClientCredentialsTokenResponseClientআপনি ব্যবহার করতে পারেন .setRequestEntityConverter()OAuth2 তে টোকেন অনুরোধ পরিবর্তন করতে পদ্ধতি, কিন্তু প্রতিক্রিয়াশীল সমতুল্য WebClientReactiveClientCredentialsTokenResponseClientএই সুবিধা উপলব্ধ করা হয় না, তাই আমরা আমাদের নিজস্ব (আমরা ব্যবহার করতে পারেন বাস্তবায়ন করতে হবে বিদ্যমান WebClientReactiveClientCredentialsTokenResponseClientযুক্তি)।

আমার বাস্তবায়ন ডাকা হয়েছিল UaaWebClientReactiveClientCredentialsTokenResponseClient(বাস্তবায়ন বাদ দেওয়া হয়েছে কারণ কিছু অতিরিক্ত শিরোনাম / বডি ফিল্ড যুক্ত করতে এটি ডিফল্ট থেকে কেবলমাত্র সামান্য headers()এবং body()পদ্ধতিগুলি পরিবর্তিত করে WebClientReactiveClientCredentialsTokenResponseClient, এটি অন্তর্নিহিত লেখার প্রবাহকে পরিবর্তন করে না)।

সজ্জিত করা WebClient

ServerOAuth2AuthorizedClientExchangeFilterFunction.setClientCredentialsTokenResponseClient()পদ্ধতি অবচিত হয়েছে, যাতে পদ্ধতি থেকে থামিয়ে দেওয়া পরামর্শ করুন:

অননুমোদিত। পরিবর্তে ব্যবহার ServerOAuth2AuthorizedClientExchangeFilterFunction(ReactiveOAuth2AuthorizedClientManager)করুন। ClientCredentialsReactiveOAuth2AuthorizedClientProviderএকটি WebClientReactiveClientCredentialsTokenResponseClient(বা একটি কাস্টম এক) দিয়ে এটি সরবরাহ করার চেয়ে কনফিগার করা একটি উদাহরণ তৈরি করুন DefaultReactiveOAuth2AuthorizedClientManager

এটি কনফিগারেশনের সাথে শেষ হওয়ার মতো শেষ হয়:

@Bean("oAuth2WebClient")
public WebClient oauthFilteredWebClient(final ReactiveClientRegistrationRepository 
    clientRegistrationRepository)
{
    final ClientCredentialsReactiveOAuth2AuthorizedClientProvider
        clientCredentialsReactiveOAuth2AuthorizedClientProvider =
            new ClientCredentialsReactiveOAuth2AuthorizedClientProvider();
    clientCredentialsReactiveOAuth2AuthorizedClientProvider.setAccessTokenResponseClient(
        new UaaWebClientReactiveClientCredentialsTokenResponseClient());

    final DefaultReactiveOAuth2AuthorizedClientManager defaultReactiveOAuth2AuthorizedClientManager =
        new DefaultReactiveOAuth2AuthorizedClientManager(clientRegistrationRepository,
            new UnAuthenticatedServerOAuth2AuthorizedClientRepository());
    defaultReactiveOAuth2AuthorizedClientManager.setAuthorizedClientProvider(
        clientCredentialsReactiveOAuth2AuthorizedClientProvider);

    final ServerOAuth2AuthorizedClientExchangeFilterFunction oAuthFilter =
        new ServerOAuth2AuthorizedClientExchangeFilterFunction(defaultReactiveOAuth2AuthorizedClientManager);
    oAuthFilter.setDefaultClientRegistrationId("uaa");

    return WebClient.builder()
        .filter(oAuthFilter)
        .build();
}

WebClientস্বাভাবিক হিসাবে ব্যবহার করুন

oAuth2WebClientশিম এখন অ্যাক্সেস সম্পদ উপায় আপনার যদি অন্য কোন অনুরোধে কোনো ব্যবহার করতে হবে আমাদের কনফিগার OAuth2 তে প্রদানকারী কর্তৃক সংরক্ষিত করতে ব্যবহার করা যেতে করার জন্য প্রস্তুত WebClient


আমি কীভাবে ক্লায়েন্ট-আইডি, ক্লায়েন্ট-সিক্রেট এবং একটি ওউথ এন্ডপয়েন্টটি প্রোগ্রামক্রমে পাস করব?
মন্টি

আমি এটি চেষ্টা করি নি, তবে দেখে মনে হচ্ছে আপনি ClientRegistrationপ্রয়োজনীয় বিবরণ দিয়ে এর উদাহরণ তৈরি করতে পারেন এবং সেগুলি নির্মাণকারীর কাছে InMemoryReactiveClientRegistrationRepository(এর ডিফল্ট বাস্তবায়নের জন্য ReactiveClientRegistrationRepository) পাস করতে পারেন । তারপরে আপনি সেই নতুন তৈরি InMemoryReactiveClientRegistrationRepositoryশিমটি আমার অটোওয়ার্ডের জায়গায় ব্যবহার করুন যা পদ্ধতিতে clientRegistrationRepositoryউত্তীর্ণ হয়েছেoauthFilteredWebClient
ম্যাট উইলিয়ামস

এমএইচ, তবে ClientRegistrationরানটাইমের সময় আমি আলাদাভাবে নিবন্ধন করতে পারছি না , আমি? আমি যতদূর বুঝতে পেরেছি আমার ClientRegistrationশুরুতে একটি শিম তৈরি করা দরকার to
মন্টি

আহ ঠিক আছে, আমি ভেবেছিলাম আপনি কেবল তাদের application.propertiesফাইলটিতে ঘোষণা করতে চান না । আপনার নিজের প্রয়োগ করে ReactiveOAuth2AccessTokenResponseClientআপনি OAuth2 টোকেন পেতে চাইলে যে কোনও অনুরোধ করতে পারবেন, তবে আপনি কীভাবে অনুরোধ অনুযায়ী এটিতে একটি গতিশীল "প্রসঙ্গ" সরবরাহ করতে পারেন তা আমি জানি না you আপনি যদি নিজের নিজস্ব ফিল্টারটি বাস্তবায়ন করেন তবে একই কাজ ঘটে this বহির্গামী অনুরোধটি আপনাকে অ্যাক্সেস দেবে, সুতরাং যদি আপনি সেখান থেকে যা প্রয়োজন তা নির্ধারণ করতে না পারলে আমি নিশ্চিত নই যে আপনার বিকল্পগুলি কী। আপনার ব্যবহারের ক্ষেত্রে কী? আপনি কেন শুরুতে সম্ভাব্য নিবন্ধগুলি জানেন না?
ম্যাট উইলিয়ামস

1

আমি @ ম্যাট উইলিয়ামস উত্তরটি বেশ সহায়ক বলে মনে করেছি। যদিও আমি যুক্ত করতে চাই যদি কেউ প্রোগ্রামক্রমে ক্লায়েন্টআইডি পাস করতে চান এবং ওয়েবক্লিয়েন্ট কনফিগারেশনের জন্য গোপনীয়। কীভাবে এটি সম্পন্ন করা যায় তা এখানে।

 @Configuration
    public class WebClientConfig {

    public static final String TEST_REGISTRATION_ID = "test-client";

    @Bean
    public ReactiveClientRegistrationRepository clientRegistrationRepository() {
        var clientRegistration = ClientRegistration.withRegistrationId(TEST_REGISTRATION_ID)
                .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
                .clientId("<client_id>")
                .clientSecret("<client_secret>")
                .tokenUri("<token_uri>")
                .build();
        return new InMemoryReactiveClientRegistrationRepository(clientRegistration);
    }

    @Bean
    public WebClient testWebClient(ReactiveClientRegistrationRepository clientRegistrationRepo) {

        var oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrationRepo,  new UnAuthenticatedServerOAuth2AuthorizedClientRepository());
        oauth.setDefaultClientRegistrationId(TEST_REGISTRATION_ID);

        return WebClient.builder()
                .baseUrl("https://.test.com")
                .filter(oauth)
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
    }
}

0

হাই সম্ভবত এটি খুব দেরী হয়ে গেছে তবে রিসটেম্পলেটটি এখনও স্প্রিং সিকিউরিটি 5 তে সমর্থিত, অ-প্রতিক্রিয়াশীল অ্যাপ্লিকেশনটিতে রেস্টটেম্পলেটটি এখনও ব্যবহার করা হয় যা আপনাকে যা করতে হবে তা কেবলমাত্র বসন্ত সুরক্ষাটি কনফিগার করতে পারে এবং মাইগ্রেশন গাইডে উল্লিখিতভাবে একটি ইন্টারসেপ্টর তৈরি করে

ক্লায়েন্ট_স্রেডিয়েন্টাল ফ্লো ব্যবহার করতে নিম্নলিখিত কনফিগারেশনটি ব্যবহার করুন

application.yml

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: ${okta.oauth2.issuer}/v1/keys
      client:
        registration:
          okta:
            client-id: ${okta.oauth2.clientId}
            client-secret: ${okta.oauth2.clientSecret}
            scope: "custom-scope"
            authorization-grant-type: client_credentials
            provider: okta
        provider:
          okta:
            authorization-uri: ${okta.oauth2.issuer}/v1/authorize
            token-uri: ${okta.oauth2.issuer}/v1/token

OauthResTemplate এ কনফিগারেশন

@Configuration
@RequiredArgsConstructor
public class OAuthRestTemplateConfig {

    public static final String OAUTH_WEBCLIENT = "OAUTH_WEBCLIENT";

    private final RestTemplateBuilder restTemplateBuilder;
    private final OAuth2AuthorizedClientService oAuth2AuthorizedClientService;
    private final ClientRegistrationRepository clientRegistrationRepository;

    @Bean(OAUTH_WEBCLIENT)
    RestTemplate oAuthRestTemplate() {
        var clientRegistration = clientRegistrationRepository.findByRegistrationId(Constants.OKTA_AUTH_SERVER_ID);

        return restTemplateBuilder
                .additionalInterceptors(new OAuthClientCredentialsRestTemplateInterceptorConfig(authorizedClientManager(), clientRegistration))
                .setReadTimeout(Duration.ofSeconds(5))
                .setConnectTimeout(Duration.ofSeconds(1))
                .build();
    }

    @Bean
    OAuth2AuthorizedClientManager authorizedClientManager() {
        var authorizedClientProvider = OAuth2AuthorizedClientProviderBuilder.builder()
                .clientCredentials()
                .build();

        var authorizedClientManager = new AuthorizedClientServiceOAuth2AuthorizedClientManager(clientRegistrationRepository, oAuth2AuthorizedClientService);
        authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);

        return authorizedClientManager;
    }

}

আটককারী

public class OAuthClientCredentialsRestTemplateInterceptor implements ClientHttpRequestInterceptor {

    private final OAuth2AuthorizedClientManager manager;
    private final Authentication principal;
    private final ClientRegistration clientRegistration;

    public OAuthClientCredentialsRestTemplateInterceptor(OAuth2AuthorizedClientManager manager, ClientRegistration clientRegistration) {
        this.manager = manager;
        this.clientRegistration = clientRegistration;
        this.principal = createPrincipal();
    }

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        OAuth2AuthorizeRequest oAuth2AuthorizeRequest = OAuth2AuthorizeRequest
                .withClientRegistrationId(clientRegistration.getRegistrationId())
                .principal(principal)
                .build();
        OAuth2AuthorizedClient client = manager.authorize(oAuth2AuthorizeRequest);
        if (isNull(client)) {
            throw new IllegalStateException("client credentials flow on " + clientRegistration.getRegistrationId() + " failed, client is null");
        }

        request.getHeaders().add(HttpHeaders.AUTHORIZATION, BEARER_PREFIX + client.getAccessToken().getTokenValue());
        return execution.execute(request, body);
    }

    private Authentication createPrincipal() {
        return new Authentication() {
            @Override
            public Collection<? extends GrantedAuthority> getAuthorities() {
                return Collections.emptySet();
            }

            @Override
            public Object getCredentials() {
                return null;
            }

            @Override
            public Object getDetails() {
                return null;
            }

            @Override
            public Object getPrincipal() {
                return this;
            }

            @Override
            public boolean isAuthenticated() {
                return false;
            }

            @Override
            public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
            }

            @Override
            public String getName() {
                return clientRegistration.getClientId();
            }
        };
    }
}

এটি প্রথম কল এবং যখনই টোকেনটির মেয়াদ শেষ হয়ে যাবে তখন অ্যাক্সেস_ টোকেন উত্পন্ন করবে। OAuth2AuthorisedClientManager আপনাকে এগুলি পরিচালনা করবে

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