diff --git a/src/Plugin/migrate_plus/authentication/RESTAuth.php b/src/Plugin/migrate_plus/authentication/RESTAuth.php
new file mode 100644
index 0000000..30a8bde
--- /dev/null
+++ b/src/Plugin/migrate_plus/authentication/RESTAuth.php
@@ -0,0 +1,90 @@
+<?php
+
+namespace Drupal\migrate_plus\Plugin\migrate_plus\authentication;
+
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\migrate\MigrateException;
+use Drupal\migrate_plus\AuthenticationPluginBase;
+use GuzzleHttp\Client;
+use Exception;
+
+/**
+ * Provides REST authentication for the HTTP resource.
+ *
+ * To set this migration up properly, a few configuration items are required.
+ *
+ * id: migrate_using_REST_Authentication
+ * label: 'REST Authentication Plugin example'
+ * migration_tags: null
+ * migration_group: migrate_products
+ * source:
+ *   plugin: url
+ *   # Specifies the http fetcher plugin.
+ *   data_fetcher_plugin: http
+ *   # Specifies the JSON parser plugin.
+ *   data_parser_plugin: json
+ *   authentication:
+ *     plugin: rest_auth
+ *     username: 'auth_name'
+ *     password: 'auth_pass'
+ *     method: 'POST' # Defaults to POST.
+ *     token_name: 'some_response_token' # Defaults to 'token'
+ *     response_header: 'x-different-header-' # Defaults to Authorization.
+ *     resposne_prefix: '' # defaults to 'Bearer ' which is for Authorization.
+ *   headers:
+ *     Accept: 'application/json; charset=utf-8'
+ *     Content-Type: 'application/json'
+ *   # One or more URLs from which to fetch the source data.
+ *   urls: https:/...some.source/object.json?
+ *   <<<<CONTINUES>>>>
+ *
+ * @Authentication(
+ *   id = "rest_auth",
+ *   title = @Translation("REST Auth Token")
+ * )
+ */
+class RESTAuth extends AuthenticationPluginBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAuthenticationOptions() {
+    $method = !empty($this->configuration['method']) ? $this->configuration['method'] : 'POST';
+    $token_name = !empty($this->configuration['token_name']) ? $this->configuration['token_name'] : 'token';
+    $response_header = !empty($this->configuration['response_header']) ? $this->configuration['response_header'] : 'Authorization';
+    $response_prefix = !empty($this->configuration['response_prefix']) ? $this->configuration['response_prefix'] : 'Bearer ';
+    $client = new Client();
+    $error = FALSE;
+    try {
+      $token_response = $client->request($method, $this->configuration['uri'], $this->configuration['options']);
+      if ($token_response->getStatusCode() == 200) {
+        $token_response_array = json_decode($token_response->getBody(), TRUE);
+      }
+      else {
+        $error = TRUE;
+        $error_response = [
+          'code' => $token_response->getStatusCode(),
+          'reason' => $token_response->getReasonPhrase(),
+          'payload' => json_decode($token_response->getBody(), TRUE),
+        ];
+        \Drupal::logger('migrate_plus')->error('Attempt to retrieve authorization token failed. Detail: <pre>@detail</pre>', [
+          '@detail' => print_r($error_response),
+        ]);
+      }
+    }
+    catch (Exception $e) {
+      $error = TRUE;
+      watchdog_exception('error', $e->getMessage());
+    }
+
+    if ($error || empty($token_response_array[$token_name])) {
+      throw new MigrateException('Error occurred while retrieving authorization token.');
+    }
+    return [
+      'headers' => [
+        $response_header => $response_prefix . $token_response_array[$token_name],
+      ],
+    ];
+  }
+
+}
