11月 032014
 

こんにちは。ファガイです。
本日は、Laravelのライブラリである、OAuth-4-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の方でちゃんと設定しよっと。

ではでは。

Pocket

 Posted by at 5:27 PM

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*