env('OAUTH_APP_ID'), 'clientSecret' => env('OAUTH_APP_PASSWORD'), 'redirectUri' => env('OAUTH_REDIRECT_URI'), 'urlAuthorize' => env('OAUTH_AUTHORITY') . env('OAUTH_AUTHORIZE_ENDPOINT'), 'urlAccessToken' => env('OAUTH_AUTHORITY') . env('OAUTH_TOKEN_ENDPOINT'), 'urlResourceOwnerDetails' => '', 'scopes' => env('OAUTH_SCOPES'), ]); $authUrl = $oauthClient->getAuthorizationUrl(); // Save client state so we can validate in callback session(['oauthState' => $oauthClient->getState()]); // Redirect to AAD signin page return redirect()->away($authUrl); } public function callback(Request $request) { // Validate state $expectedState = session('oauthState'); $request->session()->forget('oauthState'); $providedState = $request->query('state'); if (!isset($expectedState) || !isset($providedState) || $expectedState != $providedState) { return redirect('/') ->with('error', 'Invalid auth state') ->with('errorDetail', 'The provided auth state did not match the expected value'); } // Authorization code should be in the "code" query param $authCode = $request->query('code'); if (isset($authCode)) { // Initialize the OAuth client $oauthClient = new \League\OAuth2\Client\Provider\GenericProvider([ 'clientId' => env('OAUTH_APP_ID'), 'clientSecret' => env('OAUTH_APP_PASSWORD'), 'redirectUri' => env('OAUTH_REDIRECT_URI'), 'urlAuthorize' => env('OAUTH_AUTHORITY') . env('OAUTH_AUTHORIZE_ENDPOINT'), 'urlAccessToken' => env('OAUTH_AUTHORITY') . env('OAUTH_TOKEN_ENDPOINT'), 'urlResourceOwnerDetails' => '', 'scopes' => env('OAUTH_SCOPES'), ]); try { // Make the token request $accessToken = $oauthClient->getAccessToken('authorization_code', [ 'code' => $authCode, ]); $graph = new Graph(); $graph->setAccessToken($accessToken->getToken()); $user = $graph->createRequest('GET', '/me') ->setReturnType(Model\User::class) ->execute(); $tokenCache = new TokenCache(); $tokenCache->storeTokens($accessToken, $user); return redirect('/'); } catch (League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) { return redirect('/') ->with('error', 'Error requesting access token') ->with('errorDetail', $e->getMessage()); } } return redirect('/') ->with('error', $request->query('error')) ->with('errorDetail', $request->query('error_description')); } public function signout() { $tokenCache = new TokenCache(); $tokenCache->clearTokens(); return redirect('/'); } }