class ApiAuthorize in FormAssembly 8
Service class for FormAssembly API: Handles authorization.
@author Shawn P. Duncan <code@sd.shawnduncan.org>
Copyright 2018 by Shawn P. Duncan. This code is released under the GNU General Public License. Which means that it is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. http://www.gnu.org/licenses/gpl.html @package Drupal\formassembly
Hierarchy
- class \Drupal\formassembly\ApiBase- class \Drupal\formassembly\ApiAuthorize
 
Expanded class hierarchy of ApiAuthorize
1 string reference to 'ApiAuthorize'
1 service uses ApiAuthorize
File
- src/ApiAuthorize.php, line 25 
Namespace
Drupal\formassemblyView source
class ApiAuthorize extends ApiBase {
  /**
   * Drupal State storage for Token.
   *
   * @var \Drupal\Core\State\StateInterface
   */
  protected $state;
  /**
   * Service to obtain oauth credentials.
   *
   * @var \Drupal\formassembly\FormAssemblyKeyService
   */
  protected $keyService;
  /**
   * ApiAuthorize constructor.
   *
   * @param \Drupal\Core\Config\ConfigFactory $config_factory
   *   Injected ConfigFactory service.
   * @param \Psr\Log\LoggerInterface $loggerChannel
   *   Injected Logger service.
   * @param \Drupal\Core\State\StateInterface $state
   *   Injected State service.
   * @param \Drupal\formassembly\FormAssemblyKeyService $keyService
   *   Injected Key service.
   */
  public function __construct(ConfigFactory $config_factory, LoggerInterface $loggerChannel, State $state, FormAssemblyKeyService $keyService) {
    parent::__construct($config_factory, $loggerChannel);
    $this->state = $state;
    $this->keyService = $keyService;
  }
  /**
   * Use the auth code provided by FormAssembly to authorize the application.
   *
   * @param string $code
   *   The authorization code returned by FormAssembly.
   */
  public function authorize($code) {
    // Configure the request:
    $provider = $this
      ->getOauthProvider();
    // Try to get an access token using the authorization code grant.
    try {
      $accessToken = $provider
        ->getAccessToken('authorization_code', [
        'code' => $code,
      ]);
      $this->state
        ->set('fa_form.access_token', $accessToken);
    } catch (\Exception $e) {
      $this->logger
        ->critical('FormAssembly authorization request failed with Exception: %exception_type.', [
        '%exception_type' => get_class($e),
      ]);
    }
  }
  /**
   * Retrieve an active access_token.
   *
   * Either returns the current valid token or if the expire date is passed
   * then the renewal process is used to obtain a new token.
   *
   * @return string
   *   An access token if available or an empty string.
   *
   * @throws \Exception
   *   Any exception passed through from the Oauth request.
   */
  public function getToken() {
    /** @var \League\OAuth2\Client\Token\AccessToken $accessToken */
    $accessToken = $this->state
      ->get('fa_form.access_token');
    if ($accessToken
      ->hasExpired()) {
      // Get the provider.
      $provider = $this
        ->getOauthProvider();
      // Try to get an access token using the authorization code grant.
      try {
        $newAccessToken = $provider
          ->getAccessToken('refresh_token', [
          'refresh_token' => $accessToken
            ->getRefreshToken(),
        ]);
        $this->state
          ->set('fa_form.access_token', $newAccessToken);
      } catch (\Exception $e) {
        $this->logger
          ->critical('FormAssembly new token request failed with Exception: %exception_type.', [
          '%exception_type' => get_class($e),
        ]);
        throw $e;
      }
      return $newAccessToken
        ->getToken();
    }
    return $accessToken
      ->getToken();
  }
  /**
   * Checks for a valid authorization token.
   *
   * @return bool
   *   If there is such a valid token.
   */
  public function isAuthorized() {
    /** @var \League\OAuth2\Client\Token\AccessToken $accessToken */
    $accessToken = $this->state
      ->get('fa_form.access_token');
    return isset($accessToken) && !$accessToken
      ->hasExpired();
  }
  /**
   * Configures and returns an OAuth provider for FormAssembly.
   *
   * @return \Fathershawn\OAuth2\Client\Provider\FormAssembly
   *   The configured provider.
   */
  protected function getOauthProvider() {
    $credentials = $this->keyService
      ->getOauthKeys();
    $provider = new OauthProvider([
      'clientId' => $credentials['cid'],
      'clientSecret' => $credentials['secret'],
      'redirectUri' => Url::fromRoute('fa_form.authorize.store', [], [
        'absolute' => TRUE,
      ])
        ->toString(TRUE)
        ->getGeneratedUrl(),
      'baseUrl' => $this
        ->getUrl('base')
        ->toString(TRUE)
        ->getGeneratedUrl(),
    ]);
    return $provider;
  }
}Members
| Name   | Modifiers | Type | Description | Overrides | 
|---|---|---|---|---|
| ApiAuthorize:: | protected | property | Service to obtain oauth credentials. | |
| ApiAuthorize:: | protected | property | Drupal State storage for Token. | |
| ApiAuthorize:: | public | function | Use the auth code provided by FormAssembly to authorize the application. | |
| ApiAuthorize:: | protected | function | Configures and returns an OAuth provider for FormAssembly. | |
| ApiAuthorize:: | public | function | Retrieve an active access_token. | |
| ApiAuthorize:: | public | function | Checks for a valid authorization token. | |
| ApiAuthorize:: | public | function | ApiAuthorize constructor. Overrides ApiBase:: | |
| ApiBase:: | protected | property | Injected config service. | |
| ApiBase:: | protected | property | An array of url objects to the formassembly api endpoints. | |
| ApiBase:: | protected | property | Flag reflecting formassembly.api.oauth.admin_index. | |
| ApiBase:: | protected | property | Default logger channel. | |
| ApiBase:: | constant | The path for admin api requests. | ||
| ApiBase:: | constant | The path for standard api requests. | ||
| ApiBase:: | public | function | Utility method to prepare a getUrl object. | 
