2017-09-07 62 views
1

錯誤如何解決在ServiceNotFoundException的Symfony3

ServiceNotFoundException in CheckExceptionOnInvalidReferenceBehaviorPass.php 
The service "token_authenticator" has a dependency on a non-existent service "lexik_jwt_authentication.jwt_encoder". 

我需要

  • 我需要驗證用symfony angular2應用。

config.yml

lexik_jwt_authentication: 
private_key_path: '%kernel.root_dir%/../var/jwt/private.pem' 
public_key_path: '%kernel.root_dir%/../var/jwt/public.pem' 
pass_phrase:  '%jwt_key_pass_phrase%' 
token_ttl: 3600 

security.yml

firewalls: 
    main: 
     pattern: ^/ 
     logout:  true 
     anonymous: true 
     stateless: true 

     guard: 
      authenticators: 
       - 'token_authenticator' 

services.yml

services: 

token_authenticator: 
    class: AcmeStoreBundle\Security\TokenAuthenticator 
    arguments: ['@lexik_jwt_authentication.jwt_encoder', '@doctrine_mongodb'] 

的routing.yml

acme_store_login_user: 
    type: rest 
    path:  /login_check 
    defaults: { _controller: AcmeStoreBundle:Login:login } 
name_prefix: api_ 

登錄控制器代碼

public function loginAction(Request $request) { 

    $data = json_decode(file_get_contents('php://input'), true); 
    $userName = $data['username']; 
    $password = $data['password']; 

    $user = $this->get('doctrine_mongodb') 
      ->getRepository('AcmeStoreBundle:User') 
      ->findOneBy(['username' => $userName]); 

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

    $isValid = $this->get('security.password_encoder') 
      ->isPasswordValid($user, $password); 

    if (!$isValid) { 
     throw new BadCredentialsException(); 
    } 

    $response = new Response(Response::HTTP_OK); 
    $token = $this->getToken($user); 

    $response = new Response($this->serialize(['token' => $token]), Response::HTTP_OK); 
    return $this->setBaseHeaders($response); 
} 


public function serialize($data) { 
    $context = new SerializationContext(); 
    $context->setSerializeNull(true); 

    return $this->get('jms_serializer') 
        ->serialize($data, 'json', $context); 
} 

public function getToken(User $user) { 

    return $this->container->get('lexik_jwt_authentication.encoder') 
        ->encode([ 
         'username' => $user->getUsername(), 
         'exp' => time() + 3600 , 
    ]); 
} 

refrence:

https://github.com/chalasr/lexik-jwt-authentication-sandbox https://knpuniversity.com/screencast/symfony-rest4/create-json-web-token#play

  • 任何一個可以建議我怎麼能解決這個問題。
+0

您使用哪個LexikJWTAuthenticationBundle的版本? – Federkun

+0

正如你可以看到我已經從上面的鏈接給上述鏈接2.0 2.0 – afeef

回答

2

您使用的是2.x版本,其中(從更改日誌中可以看到)lexik_jwt_authentication.jwt_encoder服務(來自1.x版本)不在此列。您應該使用lexik_jwt_authentication.encoder.default

服務lexik_jwt_authentication.jwt_encoder已 青睞lexik_jwt_authentication.encoder.default的支持 OpenSSL和phpseclib加密引擎被刪除。

token_authenticator: 
    class: Acme\StoreBundle\Security\TokenAuthenticator 
    arguments: ['@lexik_jwt_authentication.encoder.default', '@doctrine_mongodb'] 
+0

感謝餵我會嘗試這 – afeef

+0

現在我有新問題試圖從名稱空間「AcmeStoreBundle \安全」加載類「TokenAuthenticator」。 你忘記了另一個命名空間的「使用」語句嗎? – afeef

+0

發佈'AcmeStoreBundle/Security/TokenAuthenticator.php'文件 – Federkun