Клиентское расширение Yii2 для Tumblr

Я пытаюсь использовать Auth Client Extension в Yii2 (http://www.yiiframework.com/doc-2.0/ext-authclient-index.html). Я скопировал класс Twitter Auth Client, который поставляется вместе с YiiFramework, и создал свою собственную версию Tumblr. Твиттер работает нормально, но когда я использую свою версию Tumblr, я получаю сообщение об ошибке на экране после того, как «Это приложение имеет право на доступ к некоторым вашим данным и публикацию сообщений в вашей учетной записи? Вы вошли как **** ***** «. (Страница Tumblr oauth)

Ошибка: запрос не выполнен с кодом: 401, сообщение: oauth_signature не соответствует ожидаемому значению

Вот мой код клиента аутентификации Tumblr:


namespace yii\authclient\clients;

use yii\authclient\OAuth1;

/** * * Example application configuration: * * ~~~ * 'components' => [ * 'authClientCollection' => [ * 'class' => 'yii\authclient\Collection', * 'clients' => [ * 'tumblr' => [ * 'class' => 'yii\authclient\clients\Tumblr', * 'consumerKey' => 'tumblr_consumer_key', * 'consumerSecret' => 'tumblr_consumer_secret', * ], * ], * ] * ... * ] * ~~~ * */ class Tumblr extends OAuth1 { /** * @inheritdoc */ public $authUrl = 'https://www.tumblr.com/oauth/authorize'; /** * @inheritdoc */ public $requestTokenUrl = 'https://www.tumblr.com/oauth/request_token'; /** * @inheritdoc */ public $requestTokenMethod = 'POST'; /** * @inheritdoc */ public $accessTokenUrl = 'https://www.tumblr.com/oauth/access_token'; /** * @inheritdoc */ public $accessTokenMethod = 'GET'; /** * @inheritdoc */ public $apiBaseUrl = 'http://api.tumblr.com/v2';

/**
* @inheritdoc
*/
protected function initUserAttributes()
{
return $this->api('/user/info', 'GET');
}

/**
* @inheritdoc
*/
protected function defaultName()
{
return 'tumblr';
}

/**
* @inheritdoc
*/
protected function defaultTitle()
{
return 'Tumblr';
}

}
[/ NOEDIT]

6

Решение

Вы можете попробовать Версия Гибридаута. Я использовал версию Google и Facebook в Yii2, и она отлично работает.

1

Другие решения

Для текущей версии yii - вы должны расширить класс yii Oauth1, используя следующий код, чтобы иметь возможность использовать ваш класс.

<?php

namespace your_vendor\authclient;

use yii\authclient\OAuthToken;
use yii\base\Exception;
use Yii;

class OAuth1 extends \yii\authclient\OAuth1
{
public function fetchAccessToken(OAuthToken $requestToken = null, $oauthVerifier = null, array $params = [])
{
if (!is_object($requestToken)) {
$requestToken = $this->getState('requestToken');
if (!is_object($requestToken)) {
throw new Exception('Request token is required to fetch access token!');
}
}

$defaultParams = [
'oauth_consumer_key' => $this->consumerKey,
'oauth_token' => $requestToken->getToken()
];
if ($oauthVerifier === null) {
if (isset($_REQUEST['oauth_verifier'])) {
$oauthVerifier = $_REQUEST['oauth_verifier'];
}
}
if (!empty($oauthVerifier)) {
$defaultParams['oauth_verifier'] = $oauthVerifier;
}
$response = $this->sendSignedRequest($this->accessTokenMethod, $this->accessTokenUrl, array_merge($defaultParams, $params));
$this->removeState('requestToken');
$token = $this->createToken([
'params' => $response
]);
$this->setAccessToken($token);

return $token;
}

protected function composeSignatureKey() {
$signatureKeyParts = [
$this->consumerSecret
];
if (is_null($accessToken = $this->getState('requestToken'))) {
$accessToken = $this->getAccessToken();
}
if (is_object($accessToken)) {
$signatureKeyParts[] = $accessToken->getTokenSecret();
} else {
$signatureKeyParts[] = '';
}
$signatureKeyParts = array_map('rawurlencode', $signatureKeyParts);

return implode('&', $signatureKeyParts);
}
}
0

По вопросам рекламы [email protected]