Я пытаюсь подписать пользователя с помощью Yahoo. Я использую Yos Social Php5 SDK. Он запрашивает разрешение и после этого умирает с ошибкой token_rejected.
Это все, что я вернусь. Вот как выглядит мой код (примечание: я использую это в codeigniter):
function yahoo($url) {
if($url == 'login') {
$url = base_url('user/yahoologin');
} else {
$url = base_url('user/yahooregister');
}
set_include_path(APPPATH . "libraries/Yahoo");
require_once APPPATH . "libraries/Yahoo/OAuth/OAuth.php";
require_once APPPATH . "libraries/Yahoo/Yahoo/YahooOAuthApplication.class.php";
$CONSUMER_KEY = 'consumerkey--';
$CONSUMER_SECRET = 'secret';
$APPLICATION_ID = 'appid';
$CALLBACK_URL = $url;
$oauthapp = new YahooOAuthApplication($CONSUMER_KEY, $CONSUMER_SECRET, $APPLICATION_ID, $CALLBACK_URL);
# Fetch request token
$request_token = $oauthapp->getRequestToken($CALLBACK_URL);
# Redirect user to authorization url
$redirect_url = $oauthapp->getAuthorizationUrl($request_token);
redirect($redirect_url);
}
public function yahoologin() {
set_include_path(APPPATH . "libraries/Yahoo");
require_once APPPATH . "libraries/Yahoo/OAuth/OAuth.php";
require_once APPPATH . "libraries/Yahoo/Yahoo/YahooOAuthApplication.class.php";
$CONSUMER_KEY = 'consumerkey--';
$CONSUMER_SECRET = 'secret';
$APPLICATION_ID = 'appid';
$CALLBACK_URL = base_url("user/yahoologin");
$oauthapp = new YahooOAuthApplication($CONSUMER_KEY, $CONSUMER_SECRET, $APPLICATION_ID, $CALLBACK_URL);
# Fetch request token
$request_token = $oauthapp->getRequestToken($CALLBACK_URL);
# Exchange request token for authorized access token
$access_token = $oauthapp->getAccessToken($request_token, $_REQUEST['oauth_verifier']);
# update access token
$oauthapp->token = $access_token;
# fetch user profile
$profile = $oauthapp->getProfile();
var_dump($profile);
}
Единственная ошибка, которую я получаю, это:
YahooOAuthAccessToken Object
(
[key] =>
[secret] =>
[expires_in] =>
[session_handle] =>
[authorization_expires_in] =>
[yahoo_guid] =>
[oauth_problem] => token_rejected
)
И это на $access_token = $oauthapp->getAccessToken($request_token, $_REQUEST['oauth_verifier']);
линия. Любая помощь, чтобы заставить это работать? Я серьезно думаю, что у Yahoo самый худший API.
Поскольку существует не так уж много, что может помочь с Yahoo API, я думал, что опубликую свое решение, чтобы люди, которые борются, могли получить ответы.
То, что я не понимал, это то, что каждый раз, когда вы звоните $oauthapp->getRequestToken($url)
Yahoo возвращает случайную подпись и ключ, и вы можете сохранить их в сеансе, переменной, базе данных или где-либо еще. Я выбрал сеанс. Поэтому сразу после получения токена запроса я сохраняю его в сеансе:
function yahoo($url) {
if($url == 'login') {
$url = base_url('user/yahoologin');
} else {
$url = base_url('user/yahooregister');
}
set_include_path(APPPATH . "libraries/Yahoo");
require_once APPPATH . "libraries/Yahoo/OAuth/OAuth.php";
require_once APPPATH . "libraries/Yahoo/Yahoo/YahooOAuthApplication.class.php";
$CONSUMER_KEY = 'xxxx';
$CONSUMER_SECRET = 'xxxx';
$APPLICATION_ID = 'xxxx';
$CALLBACK_URL = $url;
$oauthapp = new YahooOAuthApplication($CONSUMER_KEY, $CONSUMER_SECRET, $APPLICATION_ID, $CALLBACK_URL);
# Fetch request token
$request_token = $oauthapp->getRequestToken($CALLBACK_URL);
$this->session->set_userdata('request_token',json_encode($request_token));
# Redirect user to authorization url
$redirect_url = $oauthapp->getAuthorizationUrl($request_token);
redirect($redirect_url);
}
Теперь просто для пояснения: эта функция вызывается по ссылке, предоставленной Yahoo! Кнопка входа на моей домашней странице (это в codeigniter):
<?php
echo form_button(
array(
'name' => 'yahoo-login',
'id' => 'yahoo-login',
'title' => 'Yahoo Login',
'class' => 'btn span12 btn-yahoo',
'type' => 'button',
'onclick' => "javascript:void openWindow('" . base_url('user/yahoo') . "/login','Yahoo! Login',580,400);return false;"),
"<i class='icon icon-yahoo'></i> Log in with Yahoo!"); ?>
Как видите, я установил сеанс пользователя с request_token в виде строки json_encoded. В моей функции входа в систему я получаю токен из сессии и просто декодирую его. и передать его любой функции, которая в ней нуждается:
public function yahoologin() {
set_include_path(APPPATH . "libraries/Yahoo");
require_once APPPATH . "libraries/Yahoo/OAuth/OAuth.php";
require_once APPPATH . "libraries/Yahoo/Yahoo/YahooOAuthApplication.class.php";
$CONSUMER_KEY = 'xxxx';
$CONSUMER_SECRET = 'xxxx';
$APPLICATION_ID = 'xxxx';
$CALLBACK_URL = base_url("user/yahoologin");
$oauthapp = new YahooOAuthApplication($CONSUMER_KEY, $CONSUMER_SECRET, $APPLICATION_ID, $CALLBACK_URL);
# Fetch request token
$request_token = json_decode($this->session->userdata('request_token'));
# Exchange request token for authorized access token
$access_token = $oauthapp->getAccessToken($request_token, $_REQUEST['oauth_verifier']);
# update access token
$oauthapp->token = $access_token;
# fetch user profile
$profile = $oauthapp->getProfile();
var_dump($profile);
}
Примечание. Очевидно, что в данный момент это никого не регистрирует, но оно продвигает меня дальше, чем я был в течение недели.
Я надеюсь, что это поможет кому-то, кто борется с API Yahoo !.
Других решений пока нет …