2017-06-08 3 views
0

Ich versuche Guard mit einer OAuth 2 Verbindung zu konfigurieren. Ich versuche dies mit einer Umleitung in der getCredentials-Funktion auf die Microsoft-Login-Website zu tun, aber ich kann es nicht funktionieren. Ich weiß nicht, wie ich es zum Laufen bringen kann. Es scheint, dass in dieser Funktion keine Umleitung möglich ist.Symfony Oauth2 mit Gard

public function getCredentials(Request $request) 
{ 
    $provider = new Microsoft([ 
      'clientId'   => '0000000032624', 
      'clientSecret'  => 'my-secret', 
      'redirectUri'  => 'https://mysite/oauthlogin' 
    ]); 

    if(!$request->query->has('code')){ 
     // If we don't have an authorization code then get one 
     $authUrl = $provider->getAuthorizationUrl(); 
     $request->getSession()->set('oauth2state', $provider->getState()); 
     //This doesn't work 
     return new RedirectResponse($authUrl); 

    // Check given state against previously stored one to mitigate CSRF attack 
    }elseif (empty($request->query->get('state')) || ($request->query->get('state')!==$request->getSession()->get('oauth2state'))){ 
     return null; 
    }else{ 
     // Try to get an access token (using the authorization code grant) 
     $token = $provider->getAccessToken('authorization_code', [ 
      'code' => $request->query->get('code') 
     ]); 
     try { 
      //when log with microsoft, check if user is allowed 
      // We got an access token, let's now get the user's details 
      $user = $provider->getResourceOwner($token); 
      } catch (Exception $e) { 
      // Failed to get user details 
     } 
    } 

} 

public function getUser($credentials, UserProviderInterface $userProvider) 
{  
    return $userProvider->loadUserByUsername($user->getEmail()); 
} 

public function checkCredentials($credentials, UserInterface $user) 
{ 
    // check credentials - e.g. make sure the password is valid 
    // no credential check is needed in this case 

    // return true to cause authentication success 
    return true; 
} 

public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) 
{ 
    $url = $this->router->generate('homepage'); 
    return new RedirectResponse($url); 
} 

public function onAuthenticationFailure(Request $request, AuthenticationException $exception) 
{ 
    $data = array(
      'message' => strtr($exception->getMessageKey(), $exception->getMessageData())   
      // or to translate this message 
      // $this->translator->trans($exception->getMessageKey(), $exception->getMessageData()) 
    ); 
    $request->getSession()->set(Security::AUTHENTICATION_ERROR, $data); 
    $url = $this->router->generate('login'); 
    return new RedirectResponse($url); 
} 

Antwort

1

Funktion getCredentials() sollte keine Response zurückzukehren, die Anmeldeinformationen in getUser() verwendet liefern.

In der getUser() Dokumentation:

Die Credentials sind der Rückgabewert von GetCredentials()

Sie können einen AuthenticationException werfen, wenn Sie es wünschen. Wenn Sie null zurückgeben, wird eine UsernameNotFoundException für Sie ausgelöst.

Bei geworfen Ausnahme wird onAuthenticationFailure() genannt und hier können Sie Ihre RedirectResponse zurück.

Weitere Informationen finden Sie im Quellcode der \Symfony\Component\Security\Guard\GuardAuthenticatorInterface, die eine Vielzahl von Erklärungen in ihren Methoden enthält.