2016-11-08 15 views
1

私は私ののsecurity.ymlファイル内に2つのファイアウォールがあります。私は、POSTで/api/v1/authにPOSTリクエストを送信しJWTとルートSymfony3

/** 
* @param ParamFetcherInterface $paramFetcher 
* 
* @Rest\Post("/auth") 
* @Rest\RequestParam(name="email", strict=true) 
* @Rest\RequestParam(name="password", strict=true) 
* 
* @return array 
*/ 
public function postTokenAuthAction (ParamFetcherInterface $paramFetcher) 
{ 
    if($user = $this->getUser()) { 
     return $user->getRoles(); 
    } 

    $email = $paramFetcher->get('email'); 
    $password = $paramFetcher->get('password'); 

    /** @var User|null $user */ 
    $user = $this->getDoctrine()->getRepository('AppBundle:User')->findOneByEmail($email); 

    if(!$user || !$this->get('security.password_encoder')->isPasswordValid($user, $password)) { 
     throw new HttpException(403, $this->get('translator')->trans('auth.error')); 
    } 

    $token = $this->get('lexik_jwt_authentication.encoder')->encode([ 
     'email' => $user->getEmail() 
    ]); 

    return ['access_token' => $token]; 

} 

/** 
* @param ParamFetcherInterface $paramFetcher 
* 
* @Rest\Post("/auth/check") 
* 
* @return array 
*/ 
public function postCheckLoginAction (ParamFetcherInterface $paramFetcher) 
{ 
    /** @var User $user */ 
    $user = $this->getUser(); 

      if (!$user) { 
     throw $this->createAccessDeniedException(); 
    } 

    return $user->getRoles(); 

} 

AuthController

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: bcrypt 
    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username_email 

    firewalls: 
     login: 
      pattern: ^/api/v1/auth$ 
      stateless: true 
      anonymous: true 
      provider: fos_userbundle 
      form_login: 
       check_path:    /api/v1/auth 
       success_handler:   lexik_jwt_authentication.handler.authentication_success 
       failure_handler:   lexik_jwt_authentication.handler.authentication_failure 
       require_previous_session: false 

     api: 
      pattern: ^/api/v1 
      stateless: true 
      provider: fos_userbundle 
      guard: 
       authenticators: 
        - lexik_jwt_authentication.jwt_token_authenticator 

そして、二つの経路をget access_tokenのパラメータはemail=&password=です。しかし、私は401エラー "不正な資格情報"を得た。

次に、loginファイアウォールのパラメータpattern^/api/v1/authに、form_login.check_path/api/v1/auth/checkに変更しました。うまくいきます。 メールとパスワードでログインし、access_tokenを取得できます。

しかし、/api/v1/auth/checkルートは不正な資格情報を返すようになりました。このルートでメールパスワードで私を認証しようとしていますが、私は承認ヘッダーで認証しようとします。

なぜうまくいかないのですか?

は最終的に、私はaccess tokenを取得するため/api/v1/authemailpasswordを送信し、次の/api/v1/auth/checkaccess_tokenを送信し、ユーザの役割を取得します。

+0

メール=&パスワードの作品を​​期待 - それは私が知っているGETメソッドの構文 – Fky

+0

です。それは疑問の例です。 POST本体にこのパラメータを送ります。 –

+0

どのバージョンのjwtを使用していますか? – LBA

答えて

0

あなたは_usernameと_password(低ダッシュではなく)を使用してみますか?、デフォルトではこの値を格納するフィールドです。

は私が<=これがあなた