2017-06-08 9 views
0

OAuth 2接続でガードを設定しようとしています。 私は、MicrosoftログインWebサイトへのgetCredentials関数のリダイレクトでこれを実行しようとしていますが、動作させることはできません。私はそれをどのように働かせることができるのか分かりません。 この機能ではリダイレクトができないようです。symfony Oauth2 with 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); 
} 

答えて

1

機能getCredentials()は、それがgetUser()で使用される資格情報を提供する、Responseを返すことが想定されていません。

getUser()ドキュメントで:

資格情報はgetCredentials(からの戻り値です)

ご希望の場合は含むAuthenticationExceptionをスローすることがあります。 を返すと、UsernameNotFoundExceptionがスローされます。

例外がスローされた場合はonAuthenticationFailure()が呼び出され、RedirectResponseを返すことができます。

詳しい情報については、\Symfony\Component\Security\Guard\GuardAuthenticatorInterfaceのソースコードを参照してください。このソースコードのメソッドには多くの説明が含まれています。