2016-06-27 2 views
1

私はSymfony2用のバンドルを作成しています。ガード付きカスタム認証システムを作成する必要があります。システム全体はトークンに基づいています。私はPOSTリクエストを送る必要があると仮定しましょう。ヘッダーには「TOKEN:testtoken」を含める必要があります。Symfony2カスタム認証システムは、ユーザが使用しないときに渡す

  1. 私はせずにリクエストを送信:私は 'TOKEN:badtoken' でリクエストを送信ヘッダーに、私は

    { "message": "Authentication Required" } 
    
  2. を取得し、私は

    { "message": "Username could not be found." } 
    

    を得る 'TOKEN testtoken' を'username'を見ないでください。間違いです。

  3. は、私が 'TOKEN:testtoken' でリクエストを送信し、私はそれはちょうど例のページです

    { "token": "testtoken" } 
    

    を取得します。

  4. 今私は「TOKEN:testtoken」を削除ヘッダからの(私はREST APIをテストするために郵便配達を使用)し、私は私がなぜ分からない

    { "token": "testtoken" } 
    

    を取得します。私の意見では、この場合、私のシステムは、ここに私のTokenAuthenticator.php

    <?php 
    namespace WLN\AuthTokenBundle\Security; 
    
    use Doctrine\ORM\EntityManager; 
    use Symfony\Component\HttpFoundation\Request; 
    use Symfony\Component\HttpFoundation\JsonResponse; 
    use Symfony\Component\Security\Core\User\UserInterface; 
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
    use Symfony\Component\Security\Core\Exception\AuthenticationException; 
    use Symfony\Component\Security\Core\User\UserProviderInterface; 
    use Symfony\Component\Security\Guard\AbstractGuardAuthenticator; 
    use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException; 
    
    class TokenAuthenticator extends AbstractGuardAuthenticator 
    { 
        private $em; 
        private $user_repository; 
    
        public function __construct(EntityManager $em) 
        { 
         $this->em = $em; 
        } 
    
        public function setConfig($user_repo) 
        { 
         $this->user_repository = $user_repo; 
        } 
    
        public function getCredentials(Request $request) 
        { 
         if($token = $request->headers->get('WLN-AUTH-TOKEN')) 
         { 
          return [ 
           'token' => $token 
          ]; 
         } 
    
         return null; 
        } 
    
        public function getUser($credentials, UserProviderInterface $userProvider) 
        { 
         $token = $credentials['token']; 
    
         return $this->em->getRepository($this->user_repository) 
          ->findOneBy(array('token' => $token)); 
        } 
    
        public function checkCredentials($credentials, UserInterface $user) 
        { 
         return true; 
        } 
    
        public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) 
        { 
         return null; 
        } 
    
        public function onAuthenticationFailure(Request $request, AuthenticationException $exception) 
        { 
         $data = array(
          'message' => strtr($exception->getMessageKey(), $exception->getMessageData()) 
         ); 
    
         return new JsonResponse($data, 403); 
        } 
    
        public function start(Request $request, AuthenticationException $authException = null) 
        { 
         $data = array(
          'message' => 'Authentication Required' 
         ); 
    
         return new JsonResponse($data, 401); 
        } 
    
        public function supportsRememberMe() 
        { 
         return false; 
        } 
    } 
    

    P.S.だ

    { "message": "Authentication Required" } 
    

を返す必要があります私のアプリは共有ホスティングになっています。キャッシングがそれか何かを引き起こすかもしれませんか?

+0

多分セッションに保存されていますか? – GuyT

+0

@GuyT公式ドキュメントでは、すべてのリクエストでgetCredentails()が呼び出されています。セッションで保存されているにもかかわらず、私のアプリはそれを知ってはいけません。それは私が提供する情報だけを処理する必要があります。 –

+0

ヘッダーの代わりに$ request-> get( "token")を試すことができますか? – goto

答えて

0

私は何が間違っていたかを理解しました。私のセッションで有効なトークンを要求していたら、PHPSESSIDが形成されました。そのため、私は自分のAPIの動作が非常にばかげていました。私の場合、解決策はsecurity.firewalls.main.statelessをtrueに設定することです:)。

関連する問題