2016-04-28 9 views
0

何も手間がかからないうちに、私はあなたの助けが必要です。RestyGWTとベーシック認証

GWTでは、RESTサーバーと通信しようとしていますが、サーバーは別のURL(CORSが必要)にあります。
私の設定:
サーバー
- 春 - ブート1.3.3

クライアント
- GWT 1.7
- restygwt 2.0.3

サーバー側、私はそれがだと思いますOK。
春のセキュリティを無効にすると、GWTクライアントでデータを取得できます。
しかし、私はそれを有効にすると、私は常に401要求を取得します。 REST URLリクエストは、Webブラウザで直接動作します(認証ダイアログが表示されます)。

クライアント側、私はこのページを踏襲しています。ここ
https://ronanquillevere.github.io/2014/04/11/restygwt-basic-auth.html

は私のコードです:

dispacherヘッダーに資格証明

public class BasicAuthHeaderDispatcherFilter implements DispatcherFilter { 

    public static final String AUTHORIZATION_HEADER = "Authorization"; 

    @Override 
    public boolean filter(Method method, RequestBuilder builder) { 
     try { 

      String basicAuthHeaderValue = createBasicAuthHeader(
        UserCredentials.INSTANCE.getUserName(), 
        UserCredentials.INSTANCE.getPassword()); 

      builder.setHeader(AUTHORIZATION_HEADER, basicAuthHeaderValue); 

     } catch (UnsupportedEncodingException e) { 
      return false; 
     } 
     return true; 
    } 

    private String createBasicAuthHeader(String userName, String password) 
      throws UnsupportedEncodingException { 
     String credentials = userName + ":" + password; 
     String encodedCredentials = new String(Base64.encode(credentials 
       .getBytes()), "UTF-8"); 

     GWT.log("encodedCredentials=["+encodedCredentials+"]"); 

     return " Basic " + encodedCredentials; 
    } 
} 

を追加してフィルタ:

public class MyDispatcher extends DefaultFilterawareDispatcher { 

    public MyDispatcher() { 
     addFilter(new BasicAuthHeaderDispatcherFilter()); 
    } 

} 

そして、私のテストコール:

@Override 
      public void onClick(ClickEvent event) { 
       Defaults.setDispatcher(new MyDispatcher()); 

       UserCredentials.INSTANCE.setUserName("user"); 
       UserCredentials.INSTANCE.setPassword("psswd"); 

       String url = "http://localhost:8080/race"; 
       Resource resource = new Resource(url); 

       resource.get().send(new JsonCallback() { 

        @Override 
        public void onSuccess(Method method, JSONValue response) { 
         GWT.log(response.toString()); 
        } 

        @Override 
        public void onFailure(Method method, Throwable exception) { 
         GWT.log("Erreur: ", exception); 
        } 
       }); 

      } 

そして今、Webブラウザの開発ツールで結果のヘッダ。 Webブラウザで直接


要求

Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding gzip, deflate 
Accept-Language fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3 
Authorization Basic R3V5OnR5Y29vbg== 
Cache-Control max-age=0 
Connection keep-alive 
Host localhost:8080 
User-Agent Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Firefox/45.0 

回答

Cache-Control no-cache, no-store, max-age=0, must-revalidate 
Content-Type application/json;charset=UTF-8 
Date Thu, 28 Apr 2016 17:35:31 GMT 
Expires 0 
Pragma no-cache 
Server Apache-Coyote/1.1 
Set-Cookie JSESSIONID=A496281DBD6E9B797887B9C34B47DA52; Path=/; HttpOnly 
Transfer-Encoding chunked 
X-Frame-Options DENY 
X-XSS-Protection 1; mode=block 
x-content-type-options nosniff 

GWTクライアント
要求

Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding gzip, deflate 
Accept-Language fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3 
Access-Control-Request-He... authorization,x-http-method-override 
Access-Control-Request-Me... GET 
Connection keep-alive 
Host localhost:8080 
Origin http://127.0.0.1:8888 
User-Agent Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Firefox/45.0 

私は2つのことに気づいた

回答:
を - GWTヘッダー要求では、私は、認証値を持っていません。しかし、コンソールログには、フィルタがトリガーされたことを確認するトレースがあります。
- ファイアウォールでのみ、私がリクエストしたとき、ファイヤーバグはネットワークパケットを2つ捕捉します。最初のものは認証値ですが応答はありません.2番目は上記の結果です。

ありがとうございました。

答えて

0

解決済み。

私のサーバーは、ウェブブラウザから送信されたフライト前のリクエストを拒否します。

が、私は自分のサーバーにCorsFilterを追加し、それは無視してOPTIONSが

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

     HttpServletResponse theResponse = (HttpServletResponse) response; 
     HttpServletRequest theRequest = (HttpServletRequest) request; 

     theResponse.setHeader("Access-Control-Allow-Origin", theRequest.getHeader("Origin")); 

     if ("OPTIONS".equalsIgnoreCase(theRequest.getMethod())) { 
      theResponse.setHeader("Access-Control-Allow-Credentials", "true"); 
      theResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, HEAD, OPTIONS, DELETE"); 
      theResponse.setHeader("Access-Control-Allow-Headers", "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization, X-HTTP-Method-Override"); 
     }else{ 
      chain.doFilter(request, response); 
     } 
    } 
を要求します