我使用社交身份验证模块注册和登录用户。
我在用户配置文件中添加字段“field_first_name”、“field_last_name”。
如何在社交网络的用户个人资料中设置 FirstName 和 LastName 字段?
我试试这个:
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(例如)
这是如何为任何提供者身份验证管理器工作的?