OAuth2 με τη Google - CORS σφάλματος (γωνιακή + Άνοιξη boot)

ψήφοι
-1

Έχω πρόβλημα με το λάθος CORS. Να κάνω αίτηση για το Google OAuth2 και να πάρω ένα ΣΦΑΛΜΑ CORS: Θέλω να πάρω πιστοποίηση google και να δημιουργήσουν μια συμβολική JWT. Όταν το κάνω χωρίς να χρησιμοποιήσετε το ό, τι πελάτης είναι μια χαρά. Όταν στέλνω γωνιακή αιτήσεις αυτό είναι ένα πρόβλημα με CORS. Θα επιτρέψει σε όλους τους τύπους των CORS. Γιατί λαμβάνω αυτό το λάθος;

Access to XMLHttpRequest at 'https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=1020159669873-d9r35ssmnejud852bam87d8gqtcj5qf1.apps.googleusercontent.com&scope=openid%20profile%20email&state=8nizHP1X2z9sA8m0vqM4Lzd6VT24R15eSw5flteTywM%3D&redirect_uri=http://localhost:8080/oauth2/callback/google' (redirected from 'http://localhost:8080/oauth2/authorization/google')
from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Cross-Origin Read Blocking (CORB) blocked cross-origin response https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=1020159669873-d9r35ssmnejud852bam87d8gqtcj5qf1.apps.googleusercontent.com&scope=openid%20profile%20email&state=8nizHP1X2z9sA8m0vqM4Lzd6VT24R15eSw5flteTywM%3D&redirect_uri=http://localhost:8080/oauth2/callback/google with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.

Γωνιακή αίτημά μου:

 googleLogin(): Observable<LoginResponse> {
    return this.http.get<LoginResponse>
    (environment.baseUrl + '/oauth2/authorization/google')
      .pipe(tap(response => {
        localStorage.setItem('access_token', response.accessToken);
      }));
  }

//...

public onGoogleLogin(): void {
   this.authService.googleLogin().subscribe();
 }

//...

CORS ΡΥΘΜΙΣΕΙΣ:

 @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry
                .addMapping(/**)
                .allowedOrigins(*)
                .allowedMethods(HEAD, OPTIONS, GET, POST, PUT, PATCH, DELETE)
                .maxAge(MAX_AGE_SECS);
    }

ρυθμίσεων ασφαλείας:

   @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .cors()
                    .and()
                .csrf()
                    .disable()
                .exceptionHandling()
                    .authenticationEntryPoint(unauthorizedHandler)
                    .and()
                .sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                    .and()
                .authorizeRequests()
                    .antMatchers(/,
                /favicon.ico,
                /**/*.png,
                /**/*.gif,
                /**/*.svg,
                /**/*.jpg,
                /**/*.html,
                /**/*.css,
                /**/*.js)
                        .permitAll()
                .antMatchers(/api/v1/oauth0/**)
                        .permitAll()
                .antMatchers(/api/v1/oauth2/**)
                    .permitAll()
                .anyRequest()
                    .authenticated()
                    .and()
                // włączenie obslugi oauth2
                .oauth2Login()
                .successHandler(this.successHandler)
                .redirectionEndpoint()
                    .baseUri(/oauth2/callback/*)
                    .and()
                .userInfoEndpoint()
                    .oidcUserService(customOidcUserService);
        http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    }

Χειριστών επιτυχίας:

@Autowired
    private UserRepository userRepository;

    @Autowired
    private JwtTokenProvider tokenProvider;

    private final static String URL = http://localhost:8080/api/v1/oauth2/authenticate;

    @Override
    public void onAuthenticationSuccess(
            HttpServletRequest request,
            HttpServletResponse response,
            Authentication authentication) throws IOException, ServletException {

        if (response.isCommitted()) {
            return; }

        DefaultOidcUser oidcUser = (DefaultOidcUser) authentication.getPrincipal();
        System.out.println(oidcUser);
        Map attributes = oidcUser.getAttributes();
        String email = attributes.get(email).toString();
        User user = userRepository.findByEmail(email).orElseThrow(
                () -> new ResourceNotFoundException(User, email, email)
        );
        String token = tokenProvider.generateToken(user);
        String redirectionUrl = UriComponentsBuilder.fromUriString(URL).queryParam(token, token)
                .build().toUriString();
        getRedirectStrategy().sendRedirect(request, response, redirectionUrl);
    }
}

Ελεγκτής:

@RestController
@RequestMapping(/api/v1/oauth2)
public class OAuth2Controller {

    @GetMapping(/authenticate)
    public ResponseEntity<?> authenticateUser(@RequestParam String token) {
        return ResponseEntity.ok(new JwtAuthenticationResponse(token));
    }
}
Δημοσιεύθηκε 09/10/2019 στις 18:49
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
1

Δεν μπορείτε να πάρετε το κουπόνι στο παράδειγμα αυτό που χρειάζεστε για να κάνετε την πραγματική ανακατευθύνσεις. Υπάρχουν δύο τρόποι που θα μπορούσαν να παρακάμψουν αυτή την απαίτηση η οποία περιγράφεται στο RFC https://tools.ietf.org/html/rfc6749#section-1.2

  1. Ξεκινήστε τη ροή άδεια σε ένα αναδυόμενο παράθυρο και να περάσει πίσω το δείγμα που ελήφθη από το server μέσω postMessage()του API που προβλέπονται στο πρόγραμμα περιήγησης, από το αναδυόμενο παράθυρο πίσω στο webapp.
  2. Σώσει την κατάσταση, όποια και αν είναι, ανακατευθύνει σε server που θα ξεκινήσει τη ροή της άδειας και μετά από συμβολική ανταλλάσσεται για επιχορήγηση, ανακατευθύνει πίσω στο webapp με ένα συμβολικό ως παράμετρο συμβολοσειράς ερωτήματος. Στη συνέχεια, το χρησιμοποιούν και να αποκαταστήσει την κατάσταση.
Απαντήθηκε 09/10/2019 στις 19:10
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more