You are here

final class AuthenticationLinkProvider in JSON:API Hypermedia 8

Adds an `authenticate` link for unauthenticated requests.

This presumes the only available authentication method is Drupal core's default `cookie` authentication, using the `/user/login?_format=json` URL.

Plugin annotation


@JsonapiHypermediaLinkProvider(
  link_context = {
    "top_level_object" => true,
  }
)

Hierarchy

Expanded class hierarchy of AuthenticationLinkProvider

See also

https://www.drupal.org/node/2720655

File

examples/Plugin/jsonapi_hypermedia/LinkProvider/AuthenticationLinkProvider.php, line 29

Namespace

Drupal\jsonapi_hypermedia\Plugin\jsonapi_hypermedia\LinkProvider
View source
final class AuthenticationLinkProvider extends LinkProviderBase implements ContainerFactoryPluginInterface {

  /**
   * The current account.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $currentUser;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    $provider = new static($configuration, $plugin_id, $plugin_definition);
    $provider
      ->setCurrentUser($container
      ->get('current_user'));
    return $provider;
  }

  /**
   * Sets the current account.
   *
   * @param \Drupal\Core\Session\AccountInterface $current_user
   *   The current account.
   */
  public function setCurrentUser(AccountInterface $current_user) {
    $this->currentUser = $current_user;
  }

  /**
   * {@inheritdoc}
   */
  public function getLinkRelationType() {
    return $this->currentUser
      ->isAuthenticated() ? 'logout' : 'authenticate';
  }

  /**
   * {@inheritdoc}
   */
  public function getLink($context) {
    assert($context instanceof JsonApiDocumentTopLevel);
    $is_authenticated = $this->currentUser
      ->isAuthenticated();
    $route_name = !$is_authenticated ? 'user.login.http' : 'user.logout.http';
    $login_url = Url::fromUri($route_name, [
      'query' => [
        '_format' => 'json',
      ],
    ]);
    $link_cacheability = new CacheableMetadata();
    $link_cacheability
      ->addCacheContexts([
      'session.exists',
      'user.roles:anonymous',
    ]);

    // The link is always accessible, but the link location and link relation
    // type depend on the request. This example also uses the link's target
    // attributes to indicate the media type of the link target, since it is not
    // `application/vnd.api+json` as might be expected.
    return AccessRestrictedLink::createLink(AccessResult::allowed(), $link_cacheability, $login_url, $this
      ->getLinkRelationType(), [
      'type' => 'application/json',
    ]);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
AuthenticationLinkProvider::$currentUser protected property The current account.
AuthenticationLinkProvider::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create
AuthenticationLinkProvider::getLink public function Adds, alters or removes hyperlinks from a link collection. Overrides LinkProviderInterface::getLink
AuthenticationLinkProvider::getLinkRelationType public function Gets the link relation type for the provided link. Overrides LinkProviderBase::getLinkRelationType
AuthenticationLinkProvider::setCurrentUser public function Sets the current account.
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
LinkProviderBase::getLinkKey public function Gets the link object key for the provided link. Overrides LinkProviderInterface::getLinkKey
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PluginBase::__construct public function Constructs a \Drupal\Component\Plugin\PluginBase object. 92
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.