JWT

2017-11-01 16 views
1

とバックエンドの春に角度クライアントログインをしてください私は、このガイド以下の私の春のバックエンドにJWTを追加しました:https://auth0.com/blog/securing-spring-boot-with-jwts/JWT

を私はポストマンのすべてが、すぐに私はとして正常に動作しますが、同様にソフトウェアを使用してPUTリクエストを送信すると私のAngularクライアントでログインしようとすると、HttpServletRequestのデータは空です。

@Override 
public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res) 
     throws AuthenticationException, IOException, ServletException { 
    String reqBody = req.getReader().lines().collect(Collectors.joining(System.lineSeparator())); 

    // this appears to be empty on angular client calls 
    System.out.println(reqBody); 

    ObjectMapper objectMapper = new ObjectMapper().configure(Feature.AUTO_CLOSE_SOURCE, true) 
      .enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); 
    AccountCredentials creds = objectMapper.readValue(reqBody, AccountCredentials.class); 

    return getAuthenticationManager().authenticate(new UsernamePasswordAuthenticationToken(creds.getUsername(), 
       creds.getPassword(), Collections.emptyList())); 
} 

私はこのようなクライアントのうち、要求を送信しています:

const user = { 
    username: "asdf", 
    password: "asdf" 
}; 

// imported from '@angular/http' 
const headers = new Headers({ 
    'Content-Type': 'application/json' 
}); 
const body = JSON.stringify(user); 
return this.http 
    .put("http://localhost:8080/api/login", body, {headers}) 
    .toPromise() 
    .then(response => response.json().data as User) 
    .catch(this.handleError); 

私の提案だろう

私は次のようにJWTLoginFilterattemptAuthentication方法でデータをチェック私がリクエストボディを間違った方法で送っているのですが、私が間違っていることはわかりません。

私が試した:代わりにPOSTを使用して、実施例

  • に示すよう

    • は、それが別のオブジェクトJSON文字列として送信
    • に包まれた送信正規JSオブジェクト
    • として身体を送信します(PUTのPUTで動作しますが)
    • コンテンツタイプヘッダーを他の値に変更する

    これで、バックエンドにデータが表示されませんでした。

    さらに詳しい情報が必要な場合は、私にお尋ねください。

  • +0

    あなたは 'spring-security-oauth2'依存関係を使用していますか? –

    +0

    @PraveenMいいえ、私は 'spring-boot-starter-security @ 1.5.8.RELEASE'と' jjwt @ 0.7.0'を使用しています。 – Froxx

    答えて

    0

    これは、Spring OAuth 2では通常、URLがユーザ名とパスワードでエンコードされたPOSTリクエストを期待しているためです。だからこのようなものを試してみてください。

    return this.http.post(Url, "grant_type=password&username=" + username + "&password=" + password) 
    

    は、私は私のように、この場合はSpring-MVCした場合は100%わからないんだけど、私はそれが非常に類似していると期待しています。

    +0

    これはSpringのものだけでなく、通常のものでなければなりません。ですから、Angularのhttpモジュールはすでにこれを気にしているはずです。角度のあるホームページ上のチュートリアルのポストコールとプットコールは、bodyデータをJSオブジェクト – Froxx

    +0

    として渡します。これは、あなたのSpring OAuth設定に依存します。 Postmanを使用すると、POST本体またはURLにユーザー名とパスワードがエンコードされますか? –

    +0

    私は体内の生のJSON文字列として送信します。 – Froxx

    2

    私はそれを得ました。

    は、私は次のようにも私のHttpSecurityオブジェクトにCORSを可能にするために必要:

    @Configuration 
    @EnableWebSecurity 
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
        @Override 
        protected void configure(HttpSecurity http) throws Exception { 
        http.cors() 
         .and() 
         .so() 
         .on(); 
        } 
    } 
    

    私は本当にわからないんだけど、私はポストマンで送信された要求は、私のHttpSecurityで有効CORSなしで受信取得しなかった理由が、それにもかかわらず、それは今働いている。

    今後これを他の人に手伝ってもらいたいと思います。