takaya030の備忘録

PHP、Laravel、Docker などの話がメインです

Laravel で Tumblr API の Access Token を取得

Laravel で Tumblr API のアクセストークンを取得するプログラムを動かしたときのメモ

検証環境

$ php --version
PHP 7.1.4 (cli) (built: May 11 2017 17:22:31) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

$ php artisan --version
Laravel Framework 5.4.33

Tumblr API の認証についての注意点

  • 認証プロトコルは OAuth 1.0a
  • Twitter などと違い、開発コンソール画面で Access Token の確認ができないため、Web アプリケーションなどで Access Token が必要な場合は認証プログラムを使って取得する必要がある

OAuth パッケージについて

今回は Laravel5 対応の以下のパッケージを使用します
github.com

oriceon/oauth-5-laravel のインストール

composer.jsonrequire セクションに下記内容を追加

    "require": {
        "oriceon/oauth-5-laravel": "dev-master"
    }

その後 composer update でインストール

$ composer update

config/app.php を下記のように変更してパッケージを登録

--- config/app.php.orig Fri Aug 18 12:25:23 2017
+++ config/app.php      Wed Aug 16 16:55:38 2017
@@ -177,6 +177,11 @@
         App\Providers\EventServiceProvider::class,
         App\Providers\RouteServiceProvider::class,

+        /*
+         * OAuth
+         */
+        Artdarek\OAuth\OAuthServiceProvider::class,
+
     ],

     /*
@@ -212,6 +217,7 @@
         'Log' => Illuminate\Support\Facades\Log::class,
         'Mail' => Illuminate\Support\Facades\Mail::class,
         'Notification' => Illuminate\Support\Facades\Notification::class,
+        'OAuth'     => Artdarek\OAuth\Facade\OAuth::class,
         'Password' => Illuminate\Support\Facades\Password::class,
         'Queue' => Illuminate\Support\Facades\Queue::class,
         'Redirect' => Illuminate\Support\Facades\Redirect::class,

以下の内容で config/oauth-5-laravel.php を作成

<?php

return [

	/*
	|--------------------------------------------------------------------------
	| oAuth Config
	|--------------------------------------------------------------------------
	*/

	/**
	 * Storage
	 */
	'storage' => '\\OAuth\\Common\\Storage\\Session',

	/**
	 * Consumers
	 */
	'consumers' => [

		'Tumblr' => [
			'client_id'     => env('TUMBLR_CLIENT_ID'),
			'client_secret' => env('TUMBLR_CLIENT_SECRET'),
			// No scope - oauth1 doesn't need scope
		],

	]

];

.env に Consumer Key, Consumer Secret を追加

TUMBLR_CLIENT_ID=Your-Consumer-Key
TUMBLR_CLIENT_SECRET=Your-Consumer-Secret

OAuth 認証プログラム

app/Http/Controllers/TumblrAuthController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TumblrAuthController extends Controller
{
	public function loginWithTumblr(Request $request)
	{
		// get data from request
		$token  = $request->get('oauth_token');
		$verify = $request->get('oauth_verifier');
		
		// get tumblr service
		$tmb = \OAuth::consumer('Tumblr');
		
		// check if code is valid
		
		// if code is provided get user data and sign in
		if ( ! is_null($token) && ! is_null($verify))
		{
			// This was a callback request from tumblr, get the token
			$token = $tmb->requestAccessToken($token, $verify);
			
			//Var_dump
			//display whole array.
			dd($token);
		}
		// if not ask for permission first
		else
		{
			// get request token
			$reqToken = $tmb->requestRequestToken();
			
			// get Authorization Uri sending the request token
			$url = $tmb->getAuthorizationUri(['oauth_token' => $reqToken->getRequestToken()]);

			// return to tumblr login url
			return redirect((string)$url);
		}
	}
}

routes/web.php

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/tumblr', 'TumblrAuthController@loginWithTumblr');

OAuth 認証プログラムの実行

以下のコマンドで開発用サーバーが起動します

$ php artisan serve

web ブラウザで http://127.0.0.1:8000/tumblr にアクセスします
途中、以下の画面が表示されたときは Allow をクリックします
f:id:takaya030:20170818161156p:plain

web ブラウザに以下のような Access Token の表示が出れば成功です

StdOAuth1Token {#175 ▼
  #requestToken: "xxxxx...."
  #requestTokenSecret: "xxxxx..."
  #accessTokenSecret: "xxxxx..."
  #accessToken: "xxxxx..."
  #refreshToken: null
  #endOfLife: -9002
  #extraParams: []
}