Abstract Class yii\authclient\BaseOAuth
| Inheritance | yii\authclient\BaseOAuth » yii\authclient\BaseClient » yii\base\Component |
|---|---|
| Implements | yii\authclient\ClientInterface |
| Subclasses | yii\authclient\OAuth1, yii\authclient\OAuth2, yii\authclient\clients\Facebook, yii\authclient\clients\GitHub, yii\authclient\clients\GoogleHybrid, yii\authclient\clients\GoogleOAuth, yii\authclient\clients\LinkedIn, yii\authclient\clients\Live, yii\authclient\clients\Twitter, yii\authclient\clients\VKontakte, yii\authclient\clients\YandexOAuth |
| Available since extension's version | 2.0 |
| Source Code | https://github.com/yiisoft/yii2-authclient/blob/master/BaseOAuth.php |
BaseOAuth is a base class for the OAuth clients.
See also http://oauth.net/.
Public Properties
Public Methods
Protected Methods
Constants
| Constant | Value | Description | Defined By |
|---|---|---|---|
| CONTENT_TYPE_AUTO | 'auto' | yii\authclient\BaseOAuth | |
| CONTENT_TYPE_JSON | 'json' | yii\authclient\BaseOAuth | |
| CONTENT_TYPE_URLENCODED | 'urlencoded' | yii\authclient\BaseOAuth | |
| CONTENT_TYPE_XML | 'xml' | yii\authclient\BaseOAuth |
Property Details
Auth token instance. Note that the type of this property differs in getter and setter. See getAccessToken() and setAccessToken() for details.
Whether to automatically perform 'refresh access token' request on expired access token.
CURL options. This property is read-only.
Signature method instance. Note that the type of this property differs in getter and setter. See getSignatureMethod() and setSignatureMethod() for details.
Method Details
Performs request to the OAuth API.
| public api( string $apiSubUrl, string $method = 'GET', array $params = [], array $headers = [] ): array | ||
| $apiSubUrl | string |
API sub URL, which will be append to $apiBaseUrl, or absolute API URL. |
| $method | string |
Request method. |
| $params | array |
Request parameters. |
| $headers | array |
Additional request headers. |
| return | array |
API response |
|---|---|---|
| throws | \yii\base\Exception |
on failure. |
public function api($apiSubUrl, $method = 'GET', array $params = [], array $headers = [])
{
if (preg_match('/^https?:\\/\\//is', $apiSubUrl)) {
$url = $apiSubUrl;
} else {
$url = $this->apiBaseUrl . '/' . $apiSubUrl;
}
$accessToken = $this->getAccessToken();
if (!is_object($accessToken) || !$accessToken->getIsValid()) {
throw new Exception('Invalid access token.');
}
return $this->apiInternal($accessToken, $url, $method, $params, $headers);
}
Performs request to the OAuth API.
| protected abstract apiInternal( yii\authclient\OAuthToken $accessToken, string $url, string $method, array $params, array $headers ): array | ||
| $accessToken | yii\authclient\OAuthToken |
Actual access token. |
| $url | string |
Absolute API URL. |
| $method | string |
Request method. |
| $params | array |
Request parameters. |
| $headers | array |
Additional request headers. |
| return | array |
API response. |
|---|---|---|
| throws | \yii\base\Exception |
on failure. |
abstract protected function apiInternal($accessToken, $url, $method, array $params, array $headers);
Composes HTTP request CUrl options, which will be merged with the default ones.
| protected abstract composeRequestCurlOptions( string $method, string $url, array $params ): array | ||
| $method | string |
Request type. |
| $url | string |
Request URL. |
| $params | array |
Request params. |
| return | array |
CUrl options. |
|---|---|---|
| throws | \yii\base\Exception |
on failure. |
abstract protected function composeRequestCurlOptions($method, $url, array $params);
Composes URL from base URL and GET params.
| protected composeUrl( string $url, array $params = [] ): string | ||
| $url | string |
Base URL. |
| $params | array |
GET params. |
| return | string |
Composed URL. |
|---|---|---|
protected function composeUrl($url, array $params = [])
{
if (strpos($url, '?') === false) {
$url .= '?';
} else {
$url .= '&';
}
$url .= http_build_query($params, '', '&', PHP_QUERY_RFC3986);
return $url;
}
Converts XML document to array.
| protected convertXmlToArray( string|SimpleXMLElement $xml ): array | ||
| $xml | string|SimpleXMLElement |
Xml to process. |
| return | array |
XML array representation. |
|---|---|---|
protected function convertXmlToArray($xml)
{
if (!is_object($xml)) {
$xml = simplexml_load_string($xml);
}
$result = (array) $xml;
foreach ($result as $key => $value) {
if (is_object($value)) {
$result[$key] = $this->convertXmlToArray($value);
}
}
return $result;
}
Creates signature method instance from its configuration.
| protected createSignatureMethod( array $signatureMethodConfig ): yii\authclient\signature\BaseMethod | ||
| $signatureMethodConfig | array |
Signature method configuration. |
| return | yii\authclient\signature\BaseMethod |
Signature method instance. |
|---|---|---|
protected function createSignatureMethod(array $signatureMethodConfig)
{
if (!array_key_exists('class', $signatureMethodConfig)) {
$signatureMethodConfig['class'] = signature\HmacSha1::className();
}
return Yii::createObject($signatureMethodConfig);
}
Creates token from its configuration.
| protected createToken( array $tokenConfig = [] ): yii\authclient\OAuthToken | ||
| $tokenConfig | array |
Token configuration. |
| return | yii\authclient\OAuthToken |
Token instance. |
|---|---|---|
protected function createToken(array $tokenConfig = [])
{
if (!array_key_exists('class', $tokenConfig)) {
$tokenConfig['class'] = OAuthToken::className();
}
return Yii::createObject($tokenConfig);
}
Returns default cURL options.
| protected defaultCurlOptions( ): array | ||
| return | array |
CURL options. |
|---|---|---|
protected function defaultCurlOptions()
{
return [
CURLOPT_USERAGENT => Yii::$app->name . ' OAuth ' . $this->version . ' Client',
CURLOPT_CONNECTTIMEOUT => 30,
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => false,
];
}
Defined in: yii\authclient\BaseClient::defaultName()
Generates service name.
| protected defaultName( ): string | ||
| return | string |
Service name. |
|---|---|---|
protected function defaultName()
{
return Inflector::camel2id(StringHelper::basename(get_class($this)));
}
Defined in: yii\authclient\BaseClient::defaultNormalizeUserAttributeMap()
Returns the default $normalizeUserAttributeMap value.
Particular client may override this method in order to provide specific default map.
| protected defaultNormalizeUserAttributeMap( ): array | ||
| return | array |
Normalize attribute map. |
|---|---|---|
protected function defaultNormalizeUserAttributeMap()
{
return [];
}
Composes default $returnUrl value.
| protected defaultReturnUrl( ): string | ||
| return | string |
Return URL. |
|---|---|---|
protected function defaultReturnUrl()
{
return Yii::$app->getRequest()->getAbsoluteUrl();
}
Defined in: yii\authclient\BaseClient::defaultTitle()
Generates service title.
| protected defaultTitle( ): string | ||
| return | string |
Service title. |
|---|---|---|
protected function defaultTitle()
{
return StringHelper::basename(get_class($this));
}
Defined in: yii\authclient\BaseClient::defaultViewOptions()
Returns the default $viewOptions value.
Particular client may override this method in order to provide specific default view options.
| protected defaultViewOptions( ): array | ||
| return | array |
List of default $viewOptions |
|---|---|---|
protected function defaultViewOptions()
{
return [];
}
Attempts to determine HTTP request content type by headers.
| protected determineContentTypeByHeaders( array $headers ): string | ||
| $headers | array |
Request headers. |
| return | string |
Content type. |
|---|---|---|
protected function determineContentTypeByHeaders(array $headers)
{
if (isset($headers['content_type'])) {
if (stripos($headers['content_type'], 'json') !== false) {
return self::CONTENT_TYPE_JSON;
}
if (stripos($headers['content_type'], 'urlencoded') !== false) {
return self::CONTENT_TYPE_URLENCODED;
}
if (stripos($headers['content_type'], 'xml') !== false) {
return self::CONTENT_TYPE_XML;
}
}
return self::CONTENT_TYPE_AUTO;
}
Attempts to determine the content type from raw content.
| protected determineContentTypeByRaw( string $rawContent ): string | ||
| $rawContent | string |
Raw response content. |
| return | string |
Response type. |
|---|---|---|
protected function determineContentTypeByRaw($rawContent)
{
if (preg_match('/^\\{.*\\}$/is', $rawContent)) {
return self::CONTENT_TYPE_JSON;
}
if (preg_match('/^[^=|^&]+=[^=|^&]+(&[^=|^&]+=[^=|^&]+)*$/is', $rawContent)) {
return self::CONTENT_TYPE_URLENCODED;
}
if (preg_match('/^<.*>$/is', $rawContent)) {
return self::CONTENT_TYPE_XML;
}
return self::CONTENT_TYPE_AUTO;
}
| public getAccessToken( ): yii\authclient\OAuthToken | ||
| return | yii\authclient\OAuthToken |
Auth token instance. |
|---|---|---|
public function getAccessToken()
{
if (!is_object($this->_accessToken)) {
$this->_accessToken = $this->restoreAccessToken();
}
return $this->_accessToken;
}
| public getCurlOptions( ): array | ||
| return | array |
CURL options. |
|---|---|---|
public function getCurlOptions()
{
return $this->_curlOptions;
}
Defined in: yii\authclient\BaseClient::getId()
| public getId( ): string | ||
| return | string |
Service id |
|---|---|---|
public function getId()
{
if (empty($this->_id)) {
$this->_id = $this->getName();
}
return $this->_id;
}
Defined in: yii\authclient\BaseClient::getName()
| public getName( ): string | ||
| return | string |
Service name. |
|---|---|---|
public function getName()
{
if ($this->_name === null) {
$this->_name = $this->defaultName();
}
return $this->_name;
}
| public getNormalizeUserAttributeMap( ): array | ||
| return | array |
Normalize user attribute map. |
|---|---|---|
public function getNormalizeUserAttributeMap()
{
if ($this->_normalizeUserAttributeMap === null) {
$this->_normalizeUserAttributeMap = $this->defaultNormalizeUserAttributeMap();
}
return $this->_normalizeUserAttributeMap;
}
| public getReturnUrl( ): string | ||
| return | string |
Return URL. |
|---|---|---|
public function getReturnUrl()
{
if ($this->_returnUrl === null) {
$this->_returnUrl = $this->defaultReturnUrl();
}
return $this->_returnUrl;
}
| public getSignatureMethod( ): yii\authclient\signature\BaseMethod | ||
| return | yii\authclient\signature\BaseMethod |
Signature method instance. |
|---|---|---|
public function getSignatureMethod()
{
if (!is_object($this->_signatureMethod)) {
$this->_signatureMethod = $this->createSignatureMethod($this->_signatureMethod);
}
return $this->_signatureMethod;
}
Returns persistent state value.
| protected getState( string $key ): mixed | ||
| $key | string |
State key. |
| return | mixed |
State value. |
|---|---|---|
protected function getState($key)
{
if (!Yii::$app->has('session')) {
return null;
}
/* @var \yii\web\Session $session */
$session = Yii::$app->get('session');
$key = $this->getStateKeyPrefix() . $key;
$value = $session->get($key);
return $value;
}
Returns session key prefix, which is used to store internal states.
| protected getStateKeyPrefix( ): string | ||
| return | string |
Session key prefix. |
|---|---|---|
protected function getStateKeyPrefix()
{
return get_class($this) . '_' . sha1($this->authUrl) . '_';
}
Defined in: yii\authclient\BaseClient::getTitle()
| public getTitle( ): string | ||
| return | string |
Service title. |
|---|---|---|
public function getTitle()
{
if ($this->_title === null) {
$this->_title = $this->defaultTitle();
}
return $this->_title;
}
Defined in: yii\authclient\BaseClient::getUserAttributes()
| public getUserAttributes( ): array | ||
| return | array |
List of user attributes |
|---|---|---|
public function getUserAttributes()
{
if ($this->_userAttributes === null) {
$this->_userAttributes = $this->normalizeUserAttributes($this->initUserAttributes());
}
return $this->_userAttributes;
}
Defined in: yii\authclient\BaseClient::getViewOptions()
| public getViewOptions( ): array | ||
| return | array |
View options in format: optionName => optionValue |
|---|---|---|
public function getViewOptions()
{
if ($this->_viewOptions === null) {
$this->_viewOptions = $this->defaultViewOptions();
}
return $this->_viewOptions;
}
Defined in: yii\authclient\BaseClient::initUserAttributes()
Initializes authenticated user attributes.
| protected initUserAttributes( ): array | ||
| return | array |
Auth user attributes. |
|---|---|---|
protected function initUserAttributes()
{
throw new NotSupportedException('Method "' . get_class($this) . '::' . __FUNCTION__ . '" not implemented.');
}
Merge CUrl options.
If each options array has an element with the same key value, the latter will overwrite the former.
| protected mergeCurlOptions( array $options1, array $options2 ): array | ||
| $options1 | array |
Options to be merged to. |
| $options2 | array |
Options to be merged from. You can specify additional arrays via third argument, fourth argument etc. |
| return | array |
Merged options (the original options are not changed.) |
|---|---|---|
protected function mergeCurlOptions($options1, $options2)
{
$args = func_get_args();
$res = array_shift($args);
while (!empty($args)) {
$next = array_shift($args);
foreach ($next as $k => $v) {
if (is_array($v) && !empty($res[$k]) && is_array($res[$k])) {
$res[$k] = array_merge($res[$k], $v);
} else {
$res[$k] = $v;
}
}
}
return $res;
}
Defined in: yii\authclient\BaseClient::normalizeUserAttributes()
Normalize given user attributes according to $normalizeUserAttributeMap.
| protected normalizeUserAttributes( array $attributes ): array | ||
| $attributes | array |
Raw attributes. |
| return | array |
Normalized attributes. |
|---|---|---|
| throws | \yii\base\InvalidConfigException |
on incorrect normalize attribute map. |
protected function normalizeUserAttributes($attributes)
{
foreach ($this->getNormalizeUserAttributeMap() as $normalizedName => $actualName) {
if (is_scalar($actualName)) {
if (array_key_exists($actualName, $attributes)) {
$attributes[$normalizedName] = $attributes[$actualName];
}
} else {
if (is_callable($actualName)) {
$attributes[$normalizedName] = call_user_func($actualName, $attributes);
} elseif (is_array($actualName)) {
$haystack = $attributes;
$searchKeys = $actualName;
$isFound = true;
while (($key = array_shift($searchKeys)) !== null) {
if (is_array($haystack) && array_key_exists($key, $haystack)) {
$haystack = $haystack[$key];
} else {
$isFound = false;
break;
}
}
if ($isFound) {
$attributes[$normalizedName] = $haystack;
}
} else {
throw new InvalidConfigException('Invalid actual name "' . gettype($actualName) . '" specified at "' . get_class($this) . '::normalizeUserAttributeMap"');
}
}
}
return $attributes;
}
Processes raw response converting it to actual data.
| protected processResponse( string $rawResponse, string $contentType = self::CONTENT_TYPE_AUTO ): array | ||
| $rawResponse | string |
Raw response. |
| $contentType | string |
Response content type. |
| return | array |
Actual response. |
|---|---|---|
| throws | \yii\base\Exception |
on failure. |
protected function processResponse($rawResponse, $contentType = self::CONTENT_TYPE_AUTO)
{
if (empty($rawResponse)) {
return [];
}
switch ($contentType) {
case self::CONTENT_TYPE_AUTO: {
$contentType = $this->determineContentTypeByRaw($rawResponse);
if ($contentType == self::CONTENT_TYPE_AUTO) {
throw new Exception('Unable to determine response content type automatically.');
}
$response = $this->processResponse($rawResponse, $contentType);
break;
}
case self::CONTENT_TYPE_JSON: {
$response = Json::decode($rawResponse, true);
break;
}
case self::CONTENT_TYPE_URLENCODED: {
$response = [];
parse_str($rawResponse, $response);
break;
}
case self::CONTENT_TYPE_XML: {
$response = $this->convertXmlToArray($rawResponse);
break;
}
default: {
throw new Exception('Unknown response type "' . $contentType . '".');
}
}
return $response;
}
Gets new auth token to replace expired one.
| public abstract refreshAccessToken( yii\authclient\OAuthToken $token ): yii\authclient\OAuthToken | ||
| $token | yii\authclient\OAuthToken |
Expired auth token. |
| return | yii\authclient\OAuthToken |
New auth token. |
|---|---|---|
abstract public function refreshAccessToken(OAuthToken $token);
Removes persistent state value.
| protected removeState( string $key ): boolean | ||
| $key | string |
State key. |
| return | boolean |
Success. |
|---|---|---|
protected function removeState($key)
{
if (!Yii::$app->has('session')) {
return true;
}
/* @var \yii\web\Session $session */
$session = Yii::$app->get('session');
$key = $this->getStateKeyPrefix() . $key;
$session->remove($key);
return true;
}
Restores access token.
| protected restoreAccessToken( ): yii\authclient\OAuthToken | ||
| return | yii\authclient\OAuthToken |
Auth token. |
|---|---|---|
protected function restoreAccessToken()
{
$token = $this->getState('token');
if (is_object($token)) {
/* @var $token OAuthToken */
if ($token->getIsExpired() && $this->autoRefreshAccessToken) {
$token = $this->refreshAccessToken($token);
}
}
return $token;
}
Saves token as persistent state.
| protected saveAccessToken( yii\authclient\OAuthToken $token ): $this | ||
| $token | yii\authclient\OAuthToken |
Auth token |
| return | $this |
The object itself. |
|---|---|---|
protected function saveAccessToken(OAuthToken $token)
{
return $this->setState('token', $token);
}
Sends HTTP request.
| protected sendRequest( string $method, string $url, array $params = [], array $headers = [] ): array | ||
| $method | string |
Request type. |
| $url | string |
Request URL. |
| $params | array |
Request params. |
| $headers | array |
Additional request headers. |
| return | array |
Response. |
|---|---|---|
| throws | \yii\base\Exception |
on failure. |
protected function sendRequest($method, $url, array $params = [], array $headers = [])
{
$curlOptions = $this->mergeCurlOptions(
$this->defaultCurlOptions(),
$this->getCurlOptions(),
[
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => $url,
],
$this->composeRequestCurlOptions(strtoupper($method), $url, $params)
);
$curlResource = curl_init();
foreach ($curlOptions as $option => $value) {
curl_setopt($curlResource, $option, $value);
}
$response = curl_exec($curlResource);
$responseHeaders = curl_getinfo($curlResource);
// check cURL error
$errorNumber = curl_errno($curlResource);
$errorMessage = curl_error($curlResource);
curl_close($curlResource);
if ($errorNumber > 0) {
throw new Exception('Curl error requesting "' . $url . '": #' . $errorNumber . ' - ' . $errorMessage);
}
if (strncmp($responseHeaders['http_code'], '20', 2) !== 0) {
throw new InvalidResponseException($responseHeaders, $response, 'Request failed with code: ' . $responseHeaders['http_code'] . ', message: ' . $response);
}
return $this->processResponse($response, $this->determineContentTypeByHeaders($responseHeaders));
}
| public setAccessToken( array|yii\authclient\OAuthToken $token ): mixed | ||
| $token | array|yii\authclient\OAuthToken | |
public function setAccessToken($token)
{
if (!is_object($token)) {
$token = $this->createToken($token);
}
$this->_accessToken = $token;
$this->saveAccessToken($token);
}
| public setCurlOptions( array $curlOptions ): mixed | ||
| $curlOptions | array |
CURL options. |
public function setCurlOptions(array $curlOptions)
{
$this->_curlOptions = $curlOptions;
}
Defined in: yii\authclient\BaseClient::setId()
| public setId( string $id ): mixed | ||
| $id | string |
Service id. |
public function setId($id)
{
$this->_id = $id;
}
Defined in: yii\authclient\BaseClient::setName()
| public setName( string $name ): mixed | ||
| $name | string |
Service name. |
public function setName($name)
{
$this->_name = $name;
}
| public setNormalizeUserAttributeMap( array $normalizeUserAttributeMap ): mixed | ||
| $normalizeUserAttributeMap | array |
Normalize user attribute map. |
public function setNormalizeUserAttributeMap($normalizeUserAttributeMap)
{
$this->_normalizeUserAttributeMap = $normalizeUserAttributeMap;
}
| public setReturnUrl( string $returnUrl ): mixed | ||
| $returnUrl | string |
Return URL |
public function setReturnUrl($returnUrl)
{
$this->_returnUrl = $returnUrl;
}
| public setSignatureMethod( array|yii\authclient\signature\BaseMethod $signatureMethod ): mixed | ||
| $signatureMethod | array|yii\authclient\signature\BaseMethod |
Signature method instance or its array configuration. |
| throws | \yii\base\InvalidParamException |
on wrong argument. |
|---|---|---|
public function setSignatureMethod($signatureMethod)
{
if (!is_object($signatureMethod) && !is_array($signatureMethod)) {
throw new InvalidParamException('"' . get_class($this) . '::signatureMethod" should be instance of "\yii\autclient\signature\BaseMethod" or its array configuration. "' . gettype($signatureMethod) . '" has been given.');
}
$this->_signatureMethod = $signatureMethod;
}
Sets persistent state.
| protected setState( string $key, mixed $value ): $this | ||
| $key | string |
State key. |
| $value | mixed |
State value |
| return | $this |
The object itself |
|---|---|---|
protected function setState($key, $value)
{
if (!Yii::$app->has('session')) {
return $this;
}
/* @var \yii\web\Session $session */
$session = Yii::$app->get('session');
$key = $this->getStateKeyPrefix() . $key;
$session->set($key, $value);
return $this;
}
Defined in: yii\authclient\BaseClient::setTitle()
| public setTitle( string $title ): mixed | ||
| $title | string |
Service title. |
public function setTitle($title)
{
$this->_title = $title;
}
Defined in: yii\authclient\BaseClient::setUserAttributes()
| public setUserAttributes( array $userAttributes ): mixed | ||
| $userAttributes | array |
List of user attributes |
public function setUserAttributes($userAttributes)
{
$this->_userAttributes = $this->normalizeUserAttributes($userAttributes);
}
Defined in: yii\authclient\BaseClient::setViewOptions()
| public setViewOptions( array $viewOptions ): mixed | ||
| $viewOptions | array |
View options in format: optionName => optionValue |
public function setViewOptions($viewOptions)
{
$this->_viewOptions = $viewOptions;
}