PHP Junkie

  • ホーム
  • フレームワーク
  • Laravel

Socialiteの使い方を世界一丁寧に解説した

2019/01/26 2020/08/15

SHARE

  • ツイート
  • シェア
  • はてブ
  • Google+
  • Pocket
  • LINE

こんにちは!むちょこです。

今日はリクエストでいただいたsocialiteを使ったOAuth認証の実装方法について書いてみようと思います☆

既にたくさんの類似記事があるのですが、私の周りには「読んでもよくわからなかった…」という方がたくさんいたので
その方々の疑問にできる限り丁寧に答える形で書きました。たぶんこれ以上丁寧な記事はないと思います……!

その代わりかなり長いので、不要なところはどんどん飛ばして読んでくださいね。

目次
  1. 前提条件
  2. OAuth認証の流れ
  3. Socialiteのインストール
  4. Twitter API Keyの取得
  5. API Keyの設定
  6. リダイレクト処理
  7. 認証結果の受け取り
  8. ユーザ登録とログイン処理

1. 前提条件

環境

Laravel Framework 5.7.13

要件

  • 通常のパスワード認証と共存する。
  • 認証方法に関わらず、メールアドレスが一致すれば同一人物とみなす。
  • メールアドレス情報は必須とする。
  • SNSの情報を認証以外には使用しない。
  • 今回の対象プロバイダはTwitterのみだが、今後Facebookなど他のプロバイダを追加する可能性がある。

実装済みの機能

以下のコマンドで通常のパスワード認証機能は実装済みのものとします。

コマンド
$ php artisan make:auth
$ php artisan migrate

詳しく知りたい方は、以前の記事のartisanコマンドで基本機能をサクッと生成をご覧ください 。

2018.07.21Laravelでサクッとログイン機能を実装する方法

2. OAuth認証の流れ

「そもそもOAuth認証ってよくわかんない。どういう動きしてるの?」という方向けに、全体の処理の流れをフローチャート風にして書きました。

OAuth認証時の全体の流れ

実際にOAuth認証と呼ばれるのは③④の部分で、他の部分は一般的にOAuth認証に付随する処理です。今回もこの流れで実装していきます。

3. Socialiteのインストール

それでは実装していきましょう。
まずはベースとなるSocialiteパッケージのインストールです。

方法はたった一行のコマンドを実行するだけ。

コマンド
$ composer require laravel/socialite 
MEMO

Socialiteの公式情報はこちら

https://readouble.com/laravel/5.7/ja/socialite.html

https://github.com/laravel/socialite

4. Twitter API Keyの取得

今回はTwitterのソーシャルログインを実装するため、TwitterのAPI Keyが必要です。

Twitterの場合はまず、こちらのURLからアプリケーションの新規作成を行います。
https://developer.twitter.com/en/apps

アプリケーション作成ボタン

入力時のポイント

アプリケーションの作成の際に、気を付けてほしいポイントが3つあります。

1)Enable Sign in with Twitterにチェックを入れる

→OAuth機能を使うために必要です。

Enable Sign in with Twitter
2)Callback URLsに認証結果を受け取るURLを記入する

→フローチャートの④を行うURLです。

Callback URLs
3)Terms of Service URL, Privary policy URLにそれぞれ利用規約とプライバシーポリシーのURLを入力する

→メールアドレスを取得するために必要です。

Terms of Service URL, Privacy policy URL

権限の編集

アプリケーションの作成ができたら、Permissionsタブを開いてEditを押し、メールアドレス情報をリクエストしましょう。

Permissions
Request email address from users

これでTwitterのアプリケーション登録は完了です。

5. API Keyの設定

.envファイルを開き、API Keyやコールバックのパスを設定していきます。

コールバックのパスは、 フローチャートの④にあたるURLで、TwitterのCallBackURLsにも入力したものです。書き方は絶対パスor相対パスどちらでも構いません。

API Keyは、TwitterアプリページのKeys and tokensタブに記載してあります。

.env
TWITTER_CLIENT_ID=(API Key)
TWITTER_CLIENT_SECRET=(API secret key)
TWITTER_CLIENT_CALLBACK=/login/twitter/callback

.envファイルに値が書けたら、config/services.phpでそれを使うよう指定します。

config/services.php
'twitter' => [
    'client_id' => env('TWITTER_CLIENT_ID'),
    'client_secret' => env('TWITTER_CLIENT_SECRET'),
    'redirect' => env('TWITTER_CLIENT_CALLBACK')
],
MEMO

Twitter以外のプロバイダを利用する場合は、.envとconfig/services.phpに同様に記載するだけでOKです。

この後のプログラム部分に変更や追記の必要はありません。

6. リダイレクト処理

自分のサイトのとあるページにアクセスしたら、プロバイダの認証画面にリダイレクトする処理を書きます。

よくあるのがこんな感じのボタンのリンク先です。

Twitterで登録/ログイン

フローチャートでいうと②の部分です。

routes/web.php
Route::get('/login/{provider}', 'Auth\LoginController@redirectToProvider');
app/Http/Controllers/Auth/LoginController.php
use Socialite;
class LoginController extends Controller
{

    /**
     * OAuth認証先にリダイレクト
     *
     * @param str $provider
     * @return \Illuminate\Http\Response
     */
    public function redirectToProvider($provider)
    {
        return Socialite::driver($provider)->redirect();
    }
}

redirectToProviderメソッドの引数$providerには、/login/{provider}の{provider}部分の文字列が渡され、各プロバイダの認証ページにリダイレクトされます。

今回の場合は
/login/twitterにアクセスするとTwitterの認証ページにリダイレクトされるので、このようなページ(Twitterに未ログインの場合はログインフォーム)が表示されるはずです。

Twitter認証ページ

7. 認証結果の受け取り

プロバイダの認証が済むと、コールバックに指定したURL宛に認証結果が渡されます。

受け取るための準備をしていきましょう。フローチャートの④にあたる部分です。

routes/web.php
Route::get('login/{provider}/callback', 'Auth\LoginController@handleProviderCallback');

TwitterのCallback URLsや.envに/login/twitter/callbackを設定したので、それに対応するようルーティングに書きます。
“twitter”部分はリダイレクトのときと同様に、他のプロバイダも使えるよう変数にしておきます。

app/Http/Controllers/Auth/LoginController.php
class LoginController extends Controller
{
    /**
     * OAuth認証の結果受け取り
     *
     * @param str $provider
     * @return \Illuminate\Http\Response
     */
    public function handleProviderCallback($provider)
    {
        try {
            $providerUser = \Socialite::with($provider)->user();
        } catch(\Exception $e) {
            return redirect('/login')->with('oauth_error', '予期せぬエラーが発生しました');
        }
    }
}

プロバイダから送られたユーザ情報は、\Socialite::with($provider)->user();で取得することができます。

無効なトークンが使われるなどの予期せぬエラーが起こる可能性があるので、ここは例外処理を使うのがオススメです☆

リダイレクト先でwithメソッドのフラッシュメッセージを表示するためには、対応するbladeファイルに以下のように書きます。

resources/views/auth/login.php
@if (session('oauth_error'))
    {{ session('oauth_error') }}
@endif

8. ユーザ登録とログイン処理

そろそろ完成が見えてきましたね。

フローチャート⑥⑦部分を実装していきましょう。

まずはDBの調整です。

コマンド
$ php artisan make:migration change_users_table

OAuthで新規登録するユーザにはパスワード情報がないので、passwordカラムをnullableにします。

database/migrations/xxxx_xx_xx_xxxxxx_change_users_table.php
class ChangeUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            //passwordカラムにnullを許可
            $table->string('password')->nullable()->change();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('password')->nullable(false)->change();
        });
    }
}

doctrine/dbalをインストールしてから、マイグレーションを実行します。

コマンド
$ composer require doctrine/dbal
$ php artisan migrate
MEMO

doctrine/dbalはカラムの変更に必要なライブラリです。

もし既に追加済みでしたらマイグレーションの実行のみ行ってください。

DBの準備ができたら、ロジックを書いていきます。

メールアドレスが既に登録されている場合はログイン、
未登録の場合はユーザ名と共に登録してからログインを行う処理を書きます。

app/Http/Contorllers/Auth/LoginController.php
use Illuminate\Support\Facades\Auth;
use App\User;

class LoginController extends Controller
{
    /**
     * OAuth認証の結果受け取り
     *
     * @param str $provider
     * @return \Illuminate\Http\Response
     */
    public function handleProviderCallback($provider)
    {
        try {
            $providerUser = \Socialite::with($provider)->user();
        } catch(\Exception $e) {
            return redirect('/login')->with('oauth_error', '予期せぬエラーが発生しました');
        }

        if ($email = $providerUser->getEmail()) {
            Auth::login(User::firstOrCreate([
                'email' => $email
            ], [
                'name' => $providerUser->getName()
            ]));

            return redirect($this->redirectTo);
        } else {
            return redirect('/login')->with('oauth_error', 'メールアドレスが取得できませんでした');
        }
    }
}

firstOrCreateメソッドはLaravel側が用意しているメソッドで、第一引数で検索し、結果が空なら第二引数の値を加えて作成してから返してくれるという便利メソッドです。

Auth::login()でログインさせたら、LoginControllerクラスのメンバ変数$redirectToにリダイレクトさせています。

ログイン後画面

これでsocialiteを使ったログイン機能の実装は終わりです。
お疲れ様でした!

SHARE
  • ツイート
  • シェア
  • はてブ
  • Pocket
  • LINE

CATEGORY :

  • Laravel
  • テスト

TAGS :

  • login
  • OAuth認証
  • Socialite
この記事を書いた人
muchoco
webエンジニア

フリーランス Web エンジニア。 フルリモート専門で15年近く PHP やってます。 PHP 大好き。 commew 代表。 お仕事のご依頼は Twitter DM か Website のお問い合わせフォームでお待ちしております。

Twitter YouTube Website

Commew

現役フリーランスとフリーランスを目指す方のためのオンラインサロンやってます☆ ✅フリーランス同士で情報共有できる! ✅仲間とスキルアップできる! ✅毎月オンラインイベントを開催! 初心者歓迎の優しいサロンです。 お気軽にお試しください♪

公式サイトを見てみる

  • Laravel Livewire を使うときの Controller の扱い

    Laravel Livewire を使うときの Controller の扱い

  • 【要対応】Socialite で Twitter API v2 へ切り替える

    【要対応】Socialite で Twitter API v2 へ切り替える

  • 【Laravel Breeze】2行で完成!メール検証機能を実装する方法

    【Laravel Breeze】2行で完成!メール検証機能を実装する方法

  • Laravelで会員登録完了メールを送る方法[前編]

    Laravelで会員登録完了メールを送る方法[前編]

  • Laravelのアップグレード手順

    Laravelのアップグレード手順

  • Socialiteで連携したSNSのプロフィールリンクを貼る方法

    Socialiteで連携したSNSのプロフィールリンクを貼る方法

2 Comments

【人気急上昇中】Laravelとは?できること、Web職人と呼ばれる理由を初心者向けに解説 | HikoPro Blog 2019年7月25日

[…] → Socialiteの使い方を世界一丁寧に解説した […]

Socialite導入時のテストコード例 | PHP Junkie 2020年6月26日

[…] 今回は、以前書いたSocialite導入の記事を基にしたテストコード例をご紹介してみようと思います。 […]

現在コメントは受け付けておりません。

前の記事

Laravelで登録完了メールを送る方法
Laravelで会員登録完了メールを送る方法[後編]

次の記事

Socialiteで連携したSNSのプロフィールリンクを貼る方…
Socialiteで連携したプロフィールリンクを貼る方法

PHP以外の記事はこちら

0からのweb開発手順

0からのweb開発手順

はじめてのMySQL

はじめてのMySQL

運営サービス

commew

commew

現役フリーランスやフリーランスを目指す方のためのオンラインサロンです。
フリーランスのデメリットをすべて解決することを目指して始めました!
"ゆるく つながる たすけあう"をモットーに活動しています。

Stairs

Stairs

Webエンジニアのためのオンライン学習サービスです。独学では手が届きにくいところをピンポイントでサポートしていきます。

人気記事

  • 1
    Laravelで画像をアップロードする方法
  • 2
    GETとPOSTの使い分け方法
  • 3
    PHP初心者の方にオススメの勉強方法[前編]
  • 4
    PHP初心者の方にオススメの勉強方法[後編]
  • 5
    CentOS7にPHP8.0をyumインストールする方法

広告


エンジニアスタイル

アーカイブ

カテゴリー

  • CodeIgniter 3
  • Laravel 31
  • エラー 2
  • セキュリティ 2
  • テスト 3
  • ニュース 2
  • フレームワーク 6
  • 入門 8
  • 定義済みの変数 1
  • 環境 7
  • 設計 3
  • 関数リファレンス 3
Tweets by PHPJunkie
HOME

© 2025 PHP Junkie All rights reserved.