0

CORS フィルターに問題があると思います。Intellij Idea REST ツールで Authorization ヘッダーを使用してリクエストを送信すると、フィルターが Authorization ヘッダーをキャッチするためです。

しかし、別のサーバーからクライアント側からリクエストを送信しようとすると、フィルターはヘッダーを認識しません(nullを返します)。

ビルド トークンには、Spring Boot、angularjs、salelizer、および JWT を使用しています。

サーバー側でトークンを構築するためのパラメーター。

    private static final JWSHeader JWT_HEADER = new JWSHeader(JWSAlgorithm.HS256);
    private static final String TOKEN_SECRET = "Bearer";
    public static final String AUTH_HEADER_KEY = "Authorization";

私の認証フィルター

public class AuthFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        String authHeader = httpRequest.getHeader(AuthUtils.AUTH_HEADER_KEY);

        if (StringUtils.isBlank(authHeader) || authHeader.split(" ").length != 2) {
            httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, AUTH_ERROR_MSG);
        } else {
            JWTClaimsSet claimSet = null;
            try {
                claimSet = (JWTClaimsSet) AuthUtils.decodeToken(authHeader);
            } catch (ParseException e) {
                httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, JWT_ERROR_MSG);
                return;
            } catch (JOSEException e) {
                httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, JWT_INVALID_MSG);
                return;
            }


            // ensure that the token is not expired
            if (new DateTime(claimSet.getExpirationTime()).isBefore(DateTime.now())) {
                httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, EXPIRE_ERROR_MSG);
            } else {
                chain.doFilter(request, response);
            }
        }   
    }

    @Override
    public void destroy() { /* unused */ }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { /* unused */ }

}

Web Mvc 構成ファイルの CORS フィルター

 @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        config.addExposedHeader("Authorization");
        config.addExposedHeader("Content-Type");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }

私のセキュリティ設定

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers(HttpMethod.OPTIONS,"**").permitAll().and().authorizeRequests()
            .antMatchers( "/index","/api/**", "/auth/**", "/js/**", "/css/**", "/html/**")
            .permitAll().anyRequest().authenticated();

私のクライアント側の設定

function configHttp($httpProvider, $authProvider){
        console.log("sdfd");
        $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
        $httpProvider.defaults.headers.common["Accept"] = "application/json";
        $httpProvider.defaults.headers.common["Content-Type"] = "application/json";

        var token = sessionStorage.getItem("satellizer_token");
        if (token && $authProvider.httpInterceptor) {
            token = $authProvider.authHeader === 'Authorization' ? 'Bearer ' + token : token;
            $httpProvider.defaults.headers.common[$authProvider.authHeader] = token;
        }
    }

    function configAuth($authProvider) {
        $authProvider.httpInterceptor = function() { return true; };
        $authProvider.baseUrl = 'http://localhost:8080';
        $authProvider.loginUrl = '/auth/login';
        $authProvider.signupUrl = '/auth/registration';
        $authProvider.tokenName = 'token';
        $authProvider.storageType = 'sessionStorage';
        $authProvider.authToken = 'Bearer';
        $authProvider.authHeader = 'Authorization';
    }
4

1 に答える 1

0

ここでは、いくつかのオプションについて説明します

1 つのオプションは、コントローラーのメソッドまたはクラスに @CrossOrigin で注釈を付けることです。

グローバル設定が必要な場合は、新しい Bean を追加できます。上記の Spring doc からこれを取得し、マッピングが/*. アプリケーションに適したパスに変更できます。javadocによると、すべてのオリジンがデフォルトで許可されます。

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/*");
        }
    };
}
于 2016-02-20T18:56:13.833 に答える