2016-08-02 8 views
0

ここでインターセプタ。トークンはうまく見えますが、クロムデバッガのリクエストヘッダーを確認するとヘッダーはまだ空です。インターセプタのJWT認証ヘッダーを設定していません

function httpInterceptor($q, $rootScope, $location, $localStorage) { 
    return { 
     'request': function(config) { 
      if ($localStorage.authToken) { 
       config.headers.Authorization = 'Bearer ' + $localStorage.authToken; // SET HEADER HERE!!! 
      } 
      console.debug('intercepting request to url: ' + config.url); 
      return config; 
     }, 
     'response': function(response) { 
      console.debug('intercepting response'); 
      return response; 
     }, 
     'responseError': function(response) { 
      console.debug('intercepting response error'); 
      if (response.status === 401 && $location.path().indexOf('login') == -1) { 
       console.debug('authentification required redirecting to login page.'); 
       response.data = ''; 
       if ($location.path().indexOf('login') == -1) { 
        $rootScope.preLoginUrl = $location.path(); 
       } 
       $location.path('/login'); 
       return {}; 
      } else { 
       console.debug(response.config.method + ' on ' + response.config.url + ' failed with status ' + response.status); 
      } 
      return $q.reject(response); 
     } 
    }; 
} 

angular.module('hop').service('httpInterceptor', httpInterceptor); 

私は一体何が問題であるかを把握カント...たぶん私は盲目:-)

enter image description here

+0

あなたはインターセプタ配列(したがって、それを登録する)にそれを追加しました:ちょうどアプリで私のサーブレットフィルタを強化 - 私の場合は

は私も有効にCORSが同じクラスでこれをやりましたか? – AranS

+0

はい、私はしました。また、クロムデバッガがこのコードにジャンプします。 –

+0

承認ヘッダにブレークポイントを設定すると、「Bearer + yourToken」が表示されますか? – AranS

答えて

0

OKここに解決しています...

に足すと同様に私の最後のコメントは、すべての理由は、それを扱うブラウザの設定と性質です。私の場合、UIアプリケーションはバックエンド・レスト・サービスとは異なるサーバー/ドメイン上で動作します。 UIがREST経由でリソースを要求しようとするたびに、ブラウザは暗黙的に要求メソッド "OPTIONS"で事前呼び出しを行います。セキュアでないエンドポイントの場合、これは問題ではありません。しかし、エンドポイントがクライアント要求を許可するために認証ヘッダーが設定されることを期待すると、ブラウザーで生成された要求がアプリケーションスコープ外であり、ヘッダーが設定されていないため、これは失敗します。これを回避するには、サーバー側でOPTIONS型の要求をキャッチして、「OK」を返すだけです。

import java.io.IOException; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class CORSFilter implements Filter { 
    private static final String OPTIONS = "OPTIONS"; 

    public void destroy() { 
    } 

    public static String VALID_METHODS = "DELETE, HEAD, GET, OPTIONS, POST, PUT"; 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws ServletException, IOException { 
     HttpServletRequest httpRequest = (HttpServletRequest) request; 
     HttpServletResponse httpResponse = (HttpServletResponse) response; 
     httpResponse.setHeader("Access-Control-Allow-Origin", "*"); 
     httpResponse.setHeader("Access-Control-Allow-Methods", VALID_METHODS); 
     httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, Authorization"); 
     httpResponse.setHeader("Access-Control-Max-Age", "3600"); 

     if (OPTIONS.equals(httpRequest.getMethod())) { 
      httpResponse.setStatus(HttpServletResponse.SC_OK); 
     } else { 
      chain.doFilter(request, response); 
     } 
    } 

    public void init(FilterConfig config) throws ServletException { 
    } 

} 
関連する問題