こんにちは。ファガイです。
本日は、Laravelのライブラリである、OAuth-4-Laravelを使おうと思います。
インストール
では、公式に沿ってインストールします。
composer.jsonのrequireパラメータに追加
"artdarek/oauth-4-laravel": "dev-master"
composer update
app.phpのprovidersに以下を追加
'providers' => array(
// ...
'Artdarek\OAuth\OAuthServiceProvider'
)
app.phpのaliasesに以下を追加
'aliases' => array(
// ...
'OAuth' => 'Artdarek\OAuth\Facade\OAuth',
)
configファイルのパブリッシュ化
php artisan config:publish artdarek/oauth-4-laravel
twitterのdeveloper登録やって、アプリ作って、keyやsecretの登録
'Twitter' => array(
'client_id' => 'xxxxxxxxxxxxxx',
'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxx',
)
今回は仮なので、route.phpに以下追加
Route::get('login/twitter', function(){
// get data from input
$token = Input::get( 'oauth_token' );
$verify = Input::get( 'oauth_verifier' );
// get twitter service
$tw = OAuth::consumer( 'Twitter' );
// check if code is valid
// if code is provided get user data and sign in
if ( !empty( $token ) && !empty( $verify ) ) {
// This was a callback request from twitter, get the token
$token = $tw->requestAccessToken( $token, $verify );
// Send a request with it
$result = json_decode( $tw->request( 'account/verify_credentials.json' ), true );
$message = 'Your unique Twitter user id is: ' . $result['id'] . ' and your name is ' . $result['name'];
echo $message. "<br/>";
//Var_dump
//display whole array().
dd($result);
}
// if not ask for permission first
else {
// get request token
$reqToken = $tw->requestRequestToken();
// get Authorization Uri sending the request token
$url = $tw->getAuthorizationUri(array('oauth_token' => $reqToken->getRequestToken()));
// return to twitter login url
return Redirect::to( (string)$url );
}
});
どうしてもFailed to request resourceで取得出来ない
何故かサンプル通りにしているにもかかわらず、Failed to request resourceとなり、動かなかった。
最初にStreamClient.phpの方にXdebugを使用してデバッグしてみたが、問題がある感じではなかった。しかし、戻り値がfalseになっていて、どうしても動かない。
探していくと、configの部分でscopeも一応指定したほうがいいという点が書いてあったので、記載する。
'Twitter' => array(
'client_id' => 'xxxxxxxxxxxxxx',
'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxx',
'scope' => array(),
)
やってみたのだが、動かなかった。同じエラーである。
その後、色々調べた。
どうやらStreamClientを使わずにCurlを使う方法があるようだ。
使うためにはOAuth::consumerを使う前に以下の記載をする。
OAuth::setHttpClient('CurlClient');
こちらを使用して行ってみたところ、Error in retrieving token. というエラーが発生。エラーは発生したが、parse_strメソッドが前に呼ばれていたので、こちらの中身を確認してみた。
[xml]
<?xml version="1.0" encoding="UTF-8"?>
<hash>
<error>Desktop applications only support the oauth_callback value 'oob'</error>
<request>/oauth/request_token</request>
</hash>
[/xml]
oobという値が使われてるけど、それはDesktop applicationだけだよって帰ってきてた。
調べていくと以下の記事を発見。
TwitterのOAuthでCallbackさせるときの注意点 – speg03の雑記帳
どうやら、twitterのアプリの設定でcallback urlを設定してないとブラウザアプリケーションと認識してくれないようだ。
おう。。。まじかよ・・・って感じですが、そうみたい。callback_urlはこっち側で指定したらOKだと思ってたのでこれは想定していなかった。
ちゃんと設定をやった上で実行してみたところ、responseBodyにはデータが入っていることを確認出来、問題なく動作してくれるようになりました。
良かったぁー。
最後に
一応CurlClientを消してみたけど問題なく動いてくれたので、どうもtwitterのcallbackの設定忘れによるものだということが分かった。
今度からちゃんとcallback_urlをdeveloperの方でちゃんと設定しよっと。
ではでは。
コメント