2014-09-03 1 views
0

Symfony 2.0 애플리케이션에 대한 symfony 기능 테스트를 작성하고 있습니다. FOSFacebookBundle (v2.0). 내가 지금처럼 인증 확인을 테스트하고있어 컨트롤러 :Symfony2 테스트에서의 가짜 인증 - 컨트롤러의 get ('security.context') -> getToken()이 TestCase에 설정된 토큰과 다른 토큰을 반환합니다.

if($this->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')){...} 

그래서 나는 시험의 $client (유형 Symfony\Bundle\FrameworkBundle\Client의)를 인증 할 필요가있다.

아마 내가 유효한 토큰을 생성하고이에 설정해야 $clientsecurity.context, session, 그리고 $client에 대한 cookieJar가 인증되는, 맞죠?

컨트롤러의 security.context은 테스트의 $client에서 설정 한 유효한 토큰과 다른 토큰을 반환합니다.

요청을 한 후에 토큰이 재설정되는 이유를 아는 사람이 있습니까? 테스트 케이스에이 true 반환이 설정 한 후

use FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider; 
use FOS\FacebookBundle\Security\Authentication\Token\FacebookUserToken; 
use Symfony\Component\BrowserKit\Cookie; 

$providerKey = 'public'; 

$facebookMock = $this->getMockBuilder('\Facebook') 
    ->disableOriginalConstructor() 
    ->getMock(); 
$facebookMock->expects($this->once()) 
    ->method('getUser') 
    ->will($this->returnValue('DevTestUsername')); 

$facebookProvider = new FacebookProvider($providerKey, $facebookMock); 

$tokenMock = new FacebookUserToken(
    'public', 
    'DevTestUsername', 
    array('ROLE_MEMBER', 'ROLE_MANAGER', 'ROLE_USER') 
); 

$authenticatedToken = $facebookProvider->authenticate($tokenMock); 

$client->getContainer()->get('security.context')->setToken($authenticatedToken); 
$client->getContainer()->get('session')->set('_security_public', serialize($authenticatedToken)); 
$client->getContainer()->get('session')->save(); 

$client->getCookieJar()->set(new Cookie(session_name(), $client->getContainer()->get('session')->getId())); 

: 여기

내가 테스트 케이스 클래스에서이 설정에있어 방법

if($client->getContainer()->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')){...} 

그러나 컨트롤러

, 그것은 돌아 가기 false

if($this->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')){...} 

security.context 또는 세션에서? facebook.id 서비스가

이 클래스는 페이스 북의 PHP API를 (사용 심포니 \ 구성 요소 \ 보안 \ 코어 \ 사용자 \의 UserProviderInterface를 구현하는 클래스가

security: 
    factories: 
     - "%kernel.root_dir%/../vendor/bundles/FOS/FacebookBundle/Resources/config/security_factories.xml" 

    encoders: 
     FOS\UserBundle\Model\UserInterface: sha512 

    role_hierarchy: 
     ROLE_ADMIN:  [ROLE_USER, ROLE_ALLOWED_TO_SWITCH] 
     ROLE_SUPER_ADMIN: [ROLE_ADMIN] 

    providers: 
     chain_provider: 
      providers: [fos_userbundle, facebook_provider] 
     fos_userbundle: 
      id: fos_user.user_manager 
     facebook_provider: 
      id: facebook.user 

    firewalls: 
     public: 
      pattern: ^/.* 
      fos_facebook: 
       provider: facebook_provider 
       app_url: "http://apps.facebook.com/myapp" 
       server_url: "http://myapp.local/" 
       login_path: /login 
       check_path: /login_check 
       default_target_path: /target 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
       login_path: /login 
       check_path: /login_check 
      anonymous: true 
      switch_user: { role: ROLE_ADMIN } 
      logout: 
       target: http://myapp.com 
       handlers: ["fos_facebook.logout_handler"] 
      context: primary_auth 

: 여기

응용 프로그램의 보안 설정입니다 BaseFacebook 클래스)를 사용하여 페이스 북 그래프 api (BaseFacebook-> api ('/ me'))를 호출합니다. 그러나 이것은 결코 일어나지 않습니다.

댓글, 포인터 또는 리소스에 대한 링크가 크게 감사드립니다. 감사!

답변

0

문제는 Symfony 2의 버그입니다.0

내가 $this->contextKey'primary_auth' 내부 equals 메소드 것으로 나타났습니다 : \Symfony\Component\Security\Http\Firewall\ContextListener::handle(GetResponseEvent $event) 내 테스트 스위트 너무

내가 할 :

$client->getContainer()->get('session')->set('_security_primary_auth', serialize($authenticatedToken)); 

대신

$client->getContainer()->get('session')->set('_security_public', serialize($authenticatedToken)); 

(이 문제는 여기에 설명되어 있습니다 : https://github.com/symfony/symfony/issues/5228 (전체 읽기)

1

아마도 가장 쉬운 방법은 Facebook에서 개발자 계정을 열고 개발자 웹 사이트로 이동하는 것입니다. 그 위에 도구를 찾을 수 있습니다. 그 중 하나가 "토큰 디버거"입니다. 그것은 당신을 위해 토큰을 만들 수 있습니다. 또한 통화 할 때 가져 오는 토큰 중 하나를 복사하여 붙여 넣을 수도 있습니다.이 도구는 토큰의 내용을 표시합니다.

무슨 일이 일어나고 있는지를 이해하고받은 토큰에 생각하는 가치가 있는지 확인하는 것이 유용합니다.

+0

의견을 보내 주셔서 감사합니다.하지만 FB 토큰이 아닙니다. 문제는 Symfony의 보안 계층을 지나치는 것이 아니라는 것입니다. FB의 토큰 디버거를 확인했는데, 그것에 대해 잘 알고 있습니다.) – gtb

관련 문제