如何在 Drupal 8 社交身份验证模块中设置名字和姓氏字段

时间:2021-03-16 07:59:28

标签: drupal-8 social-authentication

我使用社交身份验证模块来注册和登录用户。

我正在用户个人资料中添加字段“field_first_name”、“field_last_name”。

如何在社交网络的用户个人资料中设置名字和姓氏字段?

我试试这个:

helper.services.yml

services:
  helper.event_subscriber:
    class: Drupal\helper\EventSubscriber\SocialAuthSubscriber
    arguments:
      - '@messenger'
      - '@social_auth.data_handler'
      - '@plugin.network.manager'
      - '@social_auth_google.manager' # Should use the appropriate provider auth manager.
    tags:
      - { name: 'event_subscriber' }

SocialAuthSubscriber.php

namespace Drupal\helper\EventSubscriber;

use Drupal\Core\Messenger\MessengerInterface;
use Drupal\social_auth\AuthManager\OAuth2ManagerInterface;
use Drupal\social_api\Plugin\NetworkManager;
use Drupal\social_auth\Event\SocialAuthUserEvent;
use Drupal\social_auth\Event\UserEvent;
use Drupal\social_auth\Event\SocialAuthEvents;
use Drupal\social_auth\SocialAuthDataHandler;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Reacts on Social Auth events.
 */
class SocialAuthSubscriber implements EventSubscriberInterface {

  /**
   * The messenger service.
   *
   * @var \Drupal\Core\Messenger\MessengerInterface
   */
  private $messenger;

  /**
   * The data handler.
   *
   * @var \Drupal\social_auth\SocialAuthDataHandler
   */
  private $dataHandler;

  /**
   * The network plugin manager.
   *
   * @var \Drupal\social_auth\SocialAuthDataHandler
   */
  private $networkManager;

  /**
   * The provider auth manager.
   *
   * @var \Drupal\social_auth\AuthManager\OAuth2ManagerInterface
   */
  private $providerAuth;

  /**
   * SocialAuthSubscriber constructor.
   *
   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
   *   The messenger service.
   * @param \Drupal\social_auth\SocialAuthDataHandler $data_handler
   *   Used to manage session variables.
   * @param \Drupal\social_api\Plugin\NetworkManager $network_manager
   *   Used to get an instance of the social auth implementer network plugin.
   * @param \Drupal\social_auth\AuthManager\OAuth2ManagerInterface $providerAuth
   *   Used to get the provider auth manager.
   */
  public function __construct(MessengerInterface $messenger,
                              SocialAuthDataHandler $data_handler,
                              NetworkManager $network_manager,
                              OAuth2ManagerInterface $providerAuth) {
    $this->messenger = $messenger;
    $this->dataHandler = $data_handler;
    $this->networkManager = $network_manager;
    $this->providerAuth = $providerAuth;
  }

  /**
   * {@inheritdoc}
   *
   * Returns an array of event names this subscriber wants to listen to.
   * For this case, we are going to subscribe for user login event and call the
   * methods to react on these events.
   */
  public static function getSubscribedEvents() {
    $events[SocialAuthEvents::USER_CREATED] = ['onUserCreated'];

    return $events;
  }

  /**
   * Sets a drupal message when a user logs in.
   *
   * @param \Drupal\social_auth\Event\UserEvent $event
   *   The Social Auth user event object.
   */
  public function onUserCreated(UserEvent $event) {
    $this->messenger->addStatus('Вы вошли на сайт');

    // Sets prefix.
    $this->dataHandler->setSessionPrefix($event->getPluginId());

    // Gets client object.
    $client = $this->networkManager->createInstance($event->getPluginId())->getSdk();

    // Create provider OAuth2 manager.
    // Can also use $client directly and request data using the library/SDK.
    $this->providerAuth->setClient($client)
      ->setAccessToken($this->dataHandler->get('access_token'));

    // Gets user info.
    $userInfo = $this->providerAuth->getUserInfo();

    // Sets fields.
    $fields['first_name'] = '';
    $fields['last_name'] = '';

    $fields['first_name'] = $userInfo->getFirstName();
    $fields['last_name'] = $userInfo->getLastName();

     /*
     * @var Drupal\user\UserInterface $user
     *
     * For all available methods, see User class
     * @see https://api.drupal.org/api/drupal/core!modules!user!src!Entity!User.php/class/User
     */
    $user = $event->getUser();
    
    $user->setUsername($user->getDisplayName());

    if (!empty($fields['first_name'])) {
        $user->set("field_first_name", $fields['first_name']);
    } else {
        $user->set("field_first_name", $user->getDisplayName());
    }

    if (!empty($fields['last_name'])) {
        $user->set("field_last_name", $fields['last_name']);
    }
    
    $user->save();
  
  }

}

但它仅适用于 social_auth_google 而不适用于 social_auth_vk(例如)

如何使任何提供商身份验证管理器都能正常工作?

0 个答案:

没有答案