मैं क्लाइंट से OAuth2 उपयोगकर्ता सेवा में अतिरिक्त पैरामीटर पास करने में सक्षम होना चाहता हूं। इस स्प्रिंग संदर्भ के बाद https://docs.spring.io/spring-security/site/docs/5.1.1.RELEASE/reference/htmlsingle/#oauth2Client-authorization-request-resolver, मैं जोड़ने में सक्षम हूं OAuth2AuthorizationRequest के लिए अतिरिक्त पैरामीटर। जब मैं अपने कस्टम DefaultOAuth2UserService में पैरामीटर पुनर्प्राप्त करने का प्रयास करता हूं तो यह अब OAuth2UserRequest का हिस्सा नहीं है।

मुझे लगता है कि समस्या OAuth2AuthorizationRequest की समाधान विधि से संबंधित है जिसे दो बार बुलाया जा रहा है, दूसरी बार प्राधिकरण अनुरोध शून्य है। नीचे डिबग लॉग देखें

इस समस्या का निवारण/ठीक करने के बारे में कोई सुझाव?

ग्राहक अनुरोध

http://localhost:8080/oauth2/authorize/github?redirect_uri=http://localhost:3000/oauth2/redirect&action=signup

विस्तृत लॉग

CustomAuthorizationRequestResolver : in CustomAuthorizationRequestResolver.resolve() authorizationRequest is [Initialized]
CustomAuthorizationRequestResolver: action parameter from HttpServletRequest is [signup]
CustomAuthorizationRequestResolver: number of additional parameters added to OAuth2AuthorizationRequest is [1]
CustomAuthorizationRequestResolver: in CustomAuthorizationRequestResolver.resolve() authorizationRequest is [null]
CustomOAuth2UserService: in CustomOAuth2UserService.loadUser() size of additional parameters [0]

CustomAuthorizationRequestResolver

public class CustomAuthorizationRequestResolver implements OAuth2AuthorizationRequestResolver {
    private final static Logger logger = LoggerFactory.getLogger(CustomAuthorizationRequestResolver.class);
    private final OAuth2AuthorizationRequestResolver defaultAuthorizationRequestResolver;

    public CustomAuthorizationRequestResolver(ClientRegistrationRepository clientRegistrationRepository) {
        this.defaultAuthorizationRequestResolver = new DefaultOAuth2AuthorizationRequestResolver(clientRegistrationRepository,
                "/oauth2/authorize");
    }

    @Override
    public OAuth2AuthorizationRequest resolve(HttpServletRequest request) {
        OAuth2AuthorizationRequest authorizationRequest = this.defaultAuthorizationRequestResolver.resolve(request);
        logger.debug("in CustomAuthorizationRequestResolver.resolve() authorizationRequest is [{}]", 
            authorizationRequest == null ? "null" : "Initialized");
        return authorizationRequest != null ? customAuthorizationRequest(request, authorizationRequest) : null;
    }

    @Override
    public OAuth2AuthorizationRequest resolve(HttpServletRequest request, String clientRegistrationId) {
        OAuth2AuthorizationRequest authorizationRequest = this.defaultAuthorizationRequestResolver.resolve(
                request, clientRegistrationId);
        return authorizationRequest != null ? customAuthorizationRequest(request, authorizationRequest) : null;
    }

    private OAuth2AuthorizationRequest customAuthorizationRequest(HttpServletRequest request,
            OAuth2AuthorizationRequest authorizationRequest) {
        String action = request.getParameter("action");
        logger.debug("action parameter from HttpServletRequest is [{}]", action);

        Map<String, Object> additionalParameters = new LinkedHashMap<>(authorizationRequest.getAdditionalParameters());
        additionalParameters.put("action", action);

        OAuth2AuthorizationRequest rtn = OAuth2AuthorizationRequest.from(authorizationRequest).additionalParameters(
                additionalParameters).build();

        logger.debug("number of additional parameters added to OAuth2AuthorizationRequest is [{}]", rtn.getAdditionalParameters()
                .size());

        return rtn;
    }
}

CustomOAuth2UserService

public class CustomOAuth2UserService extends DefaultOAuth2UserService {
    private final Logger logger = LoggerFactory.getLogger(CustomOAuth2UserService.class);

    @Autowired
    private UserRepository userRepository;

    @Override
    public OAuth2User loadUser(OAuth2UserRequest oAuth2UserRequest) throws OAuth2AuthenticationException {
        OAuth2User oAuth2User = super.loadUser(oAuth2UserRequest);

        logger.debug("in CustomOAuth2UserService.loadUser() size of additional parameters [{}]", oAuth2UserRequest
                .getAdditionalParameters().size());
        // other processing
    }
    
    // other methods
}
0
Timothy Vogel 19 जुलाई 2021, 20:53
OAuth2AuthorizationRequest और OAuth2UserRequest अलग-अलग एंडपॉइंट के लिए अलग-अलग अनुरोध हैं। OAuth2AuthorizationRequest, http://localhost:8080/oauth2/authorize/github?redirect_uri=http://localhost:3000/oauth2/redirect&action=signup के अनुरोध का प्रतिनिधित्व करता है, और OAuth2UserRequest, उदाहरण के लिए, http://localhost:3000/userinfo के अनुरोध का प्रतिनिधित्व करता है। अतिरिक्त पैरामीटर कभी भी OAuth2UserRequest का हिस्सा नहीं था।
 – 
Eleftheria Stein-Kousathana
20 जुलाई 2021, 12:39
आपकी सहायता के लिए धन्यवाद! इससे मुझे OAuth प्रक्रिया के बारे में मेरी समझ दोनों को परिशोधित करने और व्यावसायिक आवश्यकताओं को संभालने के तरीके में सुधार करने में मदद मिली। मैंने अपने द्वारा उपयोग किए जा रहे उदाहरण कोड के माध्यम से वापस पता लगाया और महसूस किया कि क्लाइंट ने प्रोफाइल पेज पर रीडायरेक्ट किया है। यदि आप अपनी टिप्पणी को उत्तर के रूप में पोस्ट करते हैं, तो मैं इसे स्वीकृत के रूप में चिह्नित करूंगा।
 – 
Timothy Vogel
20 जुलाई 2021, 14:02

1 उत्तर

सबसे बढ़िया उत्तर

OAuth2AuthorizationRequest और OAuth2UserRequest अलग-अलग एंडपॉइंट के लिए अलग-अलग अनुरोध हैं।

OAuth2AuthorizationRequest, http://localhost:8080/oauth2/authorize/github?redirect_uri=http://localhost:3000/oauth2/redirect&action=signup के अनुरोध का प्रतिनिधित्व करता है, जबकि OAuth2UserRequest, उदाहरण के लिए, http://localhost:3000/userinfo के अनुरोध का प्रतिनिधित्व करता है।

अतिरिक्त पैरामीटर कभी भी OAuth2UserRequest का हिस्सा नहीं था।

1
Eleftheria Stein-Kousathana 20 जुलाई 2021, 14:09