при попытке опубликовать мое приложение на heroku получена ошибка: «На запрашиваемом ресурсе отсутствует заголовок« Access-Control-Allow-Origin »» - PullRequest
0 голосов
/ 20 апреля 2020

Добрый день, разработчики, я просто пытаюсь загрузить это простое приложение в мой Herokuapp, но каждый раз, когда я пытаюсь войти или зарегистрироваться, устанавливая соединение с бэкэндом, получаю эту ошибку: "Доступ к выборке в ' https://xxxxxxxxx.herokuapp.com//mini/all_product/registering 'from origin' http://localhost: 8080 'заблокировано политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Если он непрозрачный Ответ отвечает вашим потребностям, установите режим запроса в 'no-cors', чтобы получить ресурс с отключенным CORS. " Оба пытаются войти в систему или зарегистрироваться из внешнего интерфейса. Видя ошибку, я пытаюсь добавить в свой объект заголовка во внешнем интерфейсе, сортируйте вид аргумента, подобный этому. Давайте скажем, что мое действие регистрации:

VUEX

const herokuUrl = "https://xxxxxxxxxxxxx.herokuapp.com/";

ACTION
     getUserSignedUp({ commit, dispatch }, payload) {
      // console.log(payload);

      fetch(herokuUrl + "mini/all_product/registering", {
        credentials: "include",
        headers: {
          "Content-Type": "application/json",
          "mode":"Access-Control-Allow-Origin",----------------------->PUT THIS HERE
        },
        method: "POST",
        body: JSON.stringify(payload),
      })
        .then((userData) => {
          // console.log("data sent :", JSON.stringify(userData));
          return userData.json();
        })
        .then((userData1) => {
          if (userData1.Error) {
            alert("fail on register", userData1);
            commit("setUserAuth", false);
          } else {
            alert("Success", userData1);
            dispatch("getUserLogIn", payload);
            commit("setUserAuth", true);
           }
        })
        .catch((error) => {
         alert("error", error);
        });
    },

Но не сработало.

Я также добавляю свою конфигурацию cors для внутренних приложений

package com.miniAmazon;

import com.fasterxml.jackson.annotation.JsonFormat;
import org.hibernate.mapping.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.authentication.configuration.GlobalAuthenticationConfigurerAdapter;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.WebAttributes;
import org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;


@Configuration
@EnableWebSecurity
class WebSecurityConfiguration extends GlobalAuthenticationConfigurerAdapter {
    @Autowired
    UserRepository userRepository;

    @Override
    public void init(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(inputName-> {
            User user =userRepository.findByuserName(inputName);
            if (user != null) {
                return new org.springframework.security.core.userdetails.User(user.getUserName(), user.getUserPassword(),
                        AuthorityUtils.createAuthorityList("USER"));
            }
            else {
                throw new UsernameNotFoundException("Unknown user: " + inputName);
            }
        });
    }
}
@Configuration
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors();
        http.authorizeRequests()
                .antMatchers("/mini/all_products/user").permitAll()
                .antMatchers("/mini/all_products/provider").permitAll()
                .antMatchers("mini/all_products/user_dashboard/purchase/{id}").permitAll()
                .antMatchers("/mini/all_products/allpurchase_view").permitAll()
                .antMatchers("/mini/all_products/provider/product_added").permitAll()
                .antMatchers("/mini/all_products/delete/{id}").permitAll()
                .antMatchers("/mini/all_products/provider/product_edited/{id}").permitAll()
                .antMatchers("/mini/all_products/user/product_rated/{id}").permitAll()
                .antMatchers("/mini/all_products/one_selected/purchase_view/{id}").permitAll()
                .antMatchers("/mini/all_products/user_dashboard/detail_each_purchase/final_view/{idPurchase}").permitAll()
                .antMatchers("/mini/all_products/user_dashboard/final_view").permitAll()
                .antMatchers("/mini/all_products/one_selected/purchase_view/{id}").permitAll()
                .antMatchers("/mini/all_product/registering").permitAll()
//              .antMatchers("/mini/all_product/registering/provider").permitAll()
                .antMatchers("/h2-console/**").permitAll()
                .antMatchers("/rest/**").hasAuthority("ADMIN")
                .antMatchers("/**").hasAuthority("USER")
//              .antMatchers("/**").hasAuthority("PROVIDER")
                .anyRequest().fullyAuthenticated();
        /////Autorizaciones y permisos para los distintos niveles de seguridad que tendria el usuario segun su casificacion
        http.formLogin()
                .usernameParameter("name")
                .passwordParameter("password")
                .loginPage("/api/login");

        http.logout().logoutUrl("/api/logout");

        http.csrf().disable();

        http.exceptionHandling().authenticationEntryPoint((req, res, exc) -> res.sendError(HttpServletResponse.SC_UNAUTHORIZED));

        http.formLogin().successHandler((req, res, auth) -> clearAuthenticationAttributes(req));

        http.formLogin().failureHandler((req, res, exc) -> res.sendError(HttpServletResponse.SC_UNAUTHORIZED));

        http.logout().logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler());
//        http.headers().frameOptions().disable();
        http.headers().frameOptions().sameOrigin();
    }

    private void clearAuthenticationAttributes(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
        }
    }
    @Bean////importando Heroku a la base de datos
    public CorsConfigurationSource corsConfigurationSource() {
        final CorsConfiguration configuration = new CorsConfiguration();
        // The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.
        configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("HEAD",
                "GET", "POST", "PUT", "DELETE", "PATCH"));
        // setAllowCredentials(true) is important, otherwise:
        // will fail with 403 Invalid CORS request
        configuration.setAllowCredentials(true);
        // setAllowedHeaders is important! Without it, OPTIONS preflight request
        configuration.setAllowedHeaders(Arrays.asList("Authorization", "Cache-Control", "Content-Type"));
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

Любой совет, почему это происходит? Спасибо заранее !!! хорошего дня !!!

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Проблема из бэкэнда, вам нужно включить cors на вашем бэкэнд-сервере, пожалуйста, следуйте этим шагам с официального сайта весны: https://spring.io/guides/gs/rest-service-cors/#_enabling_cors

Спасибо, и я надеюсь, что это ответ будет полезным

0 голосов
/ 20 апреля 2020

Вы активируете функцию CORS по вашей инструкции http.cors(); Попробуйте удалить ее или что-то вроде http.cors().disable()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...