providers = $providers; $this->session = $session; $this->request = $request; $this->stateGenerator = $stateGenerator; } public function registerProvider(string $alias, Provider $provider) { $this->providers->registerProvider($alias, $provider); } public function authorize(string $providerAlias) { $state = $this->stateGenerator->generate(); $this->session->put('oauth.state', $state); return $this->getProvider($providerAlias)->authorizeUrl($state); } public function getUser(string $providerAlias) { $this->verifyState(); return $this->getProvider($providerAlias)->getUser(); } protected function getProvider(string $providerAlias) { return $this->providers->getProvider($providerAlias); } protected function verifyState() { if ($this->session->get('oauth.state') !== $this->request->state()) { throw new InvalidAuthorizationCodeException("State failed to verify"); } } }