View source
<?php
namespace Drupal\social_auth_facebook\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\social_api\Plugin\NetworkManager;
use Drupal\social_auth_facebook\FacebookAuthManager;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\user\Entity\User;
use Drupal\Core\Routing\TrustedRedirectResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
class FacebookLinkController extends ControllerBase {
protected $networkManager;
protected $authManager;
public function __construct(NetworkManager $network_manager, FacebookAuthManager $auth_manager) {
$this->networkManager = $network_manager;
$this->authManager = $auth_manager;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('plugin.network.manager'), $container
->get('social_auth_facebook.auth_manager'));
}
public function linkAccount() {
$sdk = $this
->getSdk();
if ($sdk instanceof RedirectResponse) {
return $sdk;
}
$this->authManager
->setSdk($sdk);
$url = $this->authManager
->getAuthenticationUrl('link');
return new TrustedRedirectResponse($url);
}
public function linkAccountCallback() {
$sdk = $this
->getSdk();
if ($sdk instanceof RedirectResponse) {
return $sdk;
}
$this->authManager
->setSdk($sdk);
if (!$this->authManager
->getAccessToken('link')) {
drupal_set_message($this
->t('@network login failed. Token is not valid.', [
'@network' => $this
->t('Facebook'),
]), 'error');
return $this
->redirect('entity.user.edit_form', [
'user' => $this
->currentUser()
->id(),
]);
}
if (!($profile = $this->authManager
->getProfile()) || !($account_id = $profile
->getField('id'))) {
drupal_set_message($this
->t('@network login failed, could not load @network profile. Contact site administrator.', [
'@network' => $this
->t('Facebook'),
]), 'error');
return $this
->redirect('entity.user.edit_form', [
'user' => $this
->currentUser()
->id(),
]);
}
$account = $this
->entityTypeManager()
->getStorage('user')
->loadByProperties([
'facebook_id' => $account_id,
]);
$account = current($account);
if ($account && (int) $account
->id() !== (int) $this
->currentUser()
->id()) {
drupal_set_message($this
->t('Your @network account has already connected to another account on this site.', [
'@network' => $this
->t('Facebook'),
]), 'warning');
return $this
->redirect('entity.user.edit_form', [
'user' => $this
->currentUser()
->id(),
]);
}
$account = User::load($this
->currentUser()
->id());
$account
->get('facebook_id')
->setValue($account_id);
$account
->save();
drupal_set_message($this
->t('You are now able to log in with @network', [
'@network' => $this
->t('Facebook'),
]));
return $this
->redirect('entity.user.edit_form', [
'user' => $account
->id(),
]);
}
public function getSdk() {
$network_manager = $this->networkManager
->createInstance('social_auth_facebook');
if (!$network_manager
->isActive()) {
drupal_set_message($this
->t('@network is disallowed. Contact site administrator.', [
'@network' => $this
->t('Facebook'),
]), 'error');
return $this
->redirect('entity.user.edit_form', [
'user' => $this
->currentUser()
->id(),
]);
}
if (!($sdk = $network_manager
->getSdk())) {
drupal_set_message($this
->t('@network Auth not configured properly. Contact site administrator.', [
'@network' => $this
->t('Facebook'),
]), 'error');
return $this
->redirect('entity.user.edit_form', [
'user' => $this
->currentUser()
->id(),
]);
}
return $sdk;
}
}