ららベル

  • Lara-Bell.comについて
  • Contact
  • ホーム
  • PHP
  • PHP フレームワーク
  • Laravel

Multi AuthとSocial Loginを作ってみた。Social Login編

2017/11/30

SHARE

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

Sponsored Link

Sponsored Link

Multi AuthとSocial Loginを作ってみた。Social Login編

 

前回の続き

今回も簡潔に書いていきます。

今回実装したのはTwitterとGoogleです。

 

Github MIT License

使い方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
## 使い方
 
### Download
git clone https://github.com/Lara-Bell/Multi-Auth_Social-Login.git multi_auth
 
cd multi_auth
 
### Install
composer install
 
cp .env.example .env
 
php artisan key:generate
 
php artisan migrate
 
### NPM Install
npm install
 
bower install bootstrap-social
 
npm run dev
 
## Social Login
 
### .env Edit
 
TWITTER_CLIENT_ID=
TWITTER_CLIENT_SECRET=
TWITTER_URL_CALLBACK=http://YOUR_DOMAIN/login/twitter/callback
 
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_URL_CALLBACK=http://YOUR_DOMAIN/login/google/callback
 

Laravel Socialite インストール

ドキュメントどおりに使っていきます。

Laravel SocialiteはFacebook、Twitter、LinkedIn、Google、GitHub、Bitbucketによる認証をサポートしています。

1
composer require laravel/socialite

config/services.phpを下記追加

.envのアカウント情報にアクセスするようにします。

1
2
3
4
5
6
7
8
9
10
11
'twitter' => [
    'client_id' => env('TWITTER_CLIENT_ID'),
    'client_secret' => env('TWITTER_CLIENT_SECRET'),
    'redirect' => env('TWITTER_URL_CALLBACK'),
],
 
'google' => [
    'client_id' => env('GOOGLE_CLIENT_ID'),
    'client_secret' => env('GOOGLE_CLIENT_SECRET'),
    'redirect' => env('GOOGLE_URL_CALLBACK'),
],

 

.env追加

1
2
3
4
5
6
7
TWITTER_CLIENT_ID=
TWITTER_CLIENT_SECRET=
TWITTER_URL_CALLBACK=http://YOUR_DOMAIN/login/twitter/callback
 
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_URL_CALLBACK=http://YOUR_DOMAIN/login/google/callback

 

Model

LinkedSocialAccounts.phpとMigrationファイルの作成

1
php artisan make:model LinkedSocialAccount -m

 

App\LinkedSocialAccounts.php編集

プロバイダー名とプロバイダー固有のIDをfillableする。

Userモデルとリレーション

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class LinkedSocialAccount extends Model
{
    protected $fillable = [
        'provider_name', 'provider_id'
    ];
 
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

database/migrations/create_linked_social_accounts_table.php編集

1
2
3
4
5
6
7
8
Schema::create('linked_social_accounts', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id');
    $table->string('provider_name')->nullable();
    $table->string('provider_id')->unique()->nullable();
    $table->timestamps();
    $table->softDeletes();
});

 

Migrate

1
php artisan migrate

 

app/User.php

LinkedSocialAccount.phpとリレーション

1
2
3
4
public function linkedSocialAccount()
{
    return $this->hasMany(LinkedSocialAccount::class);
}

 

Controller

SocialAccountController.php作成

1
php artisan make:controller Auth/SocialAccountController

 

app/Http/Controllers/Auth/SocialAccountController.php編集

redirectToProviderはOAuthプロバイダへユーザーをリダイレクトするルート

handleProviderCallbackは認証後にプロバイダーからのコールバックを受けるルート

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
 
namespace App\Http\Controllers\Auth;
 
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Services\SocialAccountService;  //追加
use Laravel\Socialite\Facades\Socialite;  //追加
 
class SocialAccountController extends Controller
{
    //追加
    /**
     * Redirect the user to the GitHub authentication page.
     *
     * @return Response
     */
    public function redirectToProvider($provider)
    {
        return Socialite::driver($provider)->redirect();
    }
 
    /**
     * Obtain the user information
     *
     * @return Response
     */
    public function handleProviderCallback(SocialAccountService $socialAccountService, $provider)
    {
        try{
            $user = Socialite::driver($provider)->user();
        }
        // ERROR
        catch (\Exception $e){
            return redirect('/login');
        }
 
        $authUser = $socialAccountService->findOrCreate(
            $user,
            $provider
        );
 
        auth()->login($authUser, true);
 
        return redirect('/home');
    }
}

 

 

Services

app/Services/SocialAccountService.php作成
findOrCreate
LinkedSocialAccount_Tableからプロバイダー名+IDを確認
ない場合
User_Table内にMailアドレスがあるか確認
ない場合
User_Tableにユーザ登録
LinkedSocialAccount_Tableにリレーション
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
 
namespace App\Services;
 
use App\User;
use Laravel\Socialite\Contracts\User as ProviderUser;
use App\LinkedSocialAccount;
 
class SocialAccountService
{
    public function findOrCreate(ProviderUser $providerUser, $provider)
    {
        $account = LinkedSocialAccount::where('provider_name', $provider)
                   ->where('provider_id', $providerUser->getId())
                   ->first();
 
        if ($account) {
            return $account->user;
        } else {
 
            $user = User::where('email', $providerUser->getEmail())->first();
 
            if (! $user) {
                $user = User::create([
                    'email' => $providerUser->getEmail(),
                    'name'  => $providerUser->getName(),
                ]);
            }
 
            $user->linkedSocialAccount()->create([
                'provider_id'   => $providerUser->getId(),
                'provider_name' => $provider,
            ]);
 
            return $user;
 
        }
    }
}

route

route/web.php編集

1
2
3
//追加
Route::get('login/{provider}', 'Auth\SocialAccountController@redirectToProvider');
Route::get('login/{provider}/callback', 'Auth\SocialAccountController@handleProviderCallback');

 

view

Social Loginボタンを挿入します。

1
bower install bootstrap-social

resources/assets/sass/app.scssに追加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// FontAwesome
@import "./bower_components/font-awesome/scss/font-awesome.scss";
 
// Bootstrap-Social
@import "./bower_components/bootstrap-social/bootstrap-social.scss";
 
.register,.login{
  color: #666;
  font-size: 34px;
  font-weight: bold;
  padding: 15px;
  text-align: center;
  text-transform: uppercase;
}
 
.divider{
  background: #ddd;
  height: 2px;
  display: block;
  position: relative;
  width: 80%;
  margin: 30px auto;
}
.divider span{
  width: 30px;
  height: 20px;
  background: #fff;
  position: absolute;
  left: 50%;
  margin-left: -10px;
  top: -12px;
  text-align: center;
  color: #999;
}
.m-5{
  margin: 5px;
}

 

Sassをコンパイル

今回使ってないモジュールもインストールされるが、気にせずデフォルトのままインストールとコンパイル

1
2
3
npm install
 
npm run dev

 

resources/views/auth/login.blade.php・register.blade.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<div class="text-center login">Login</div>
  <form class="form-horizontal" method="POST" action="{{ route('login') }}">
 
    <div class="form-group">
        <div class="text-center">
            <a href="/login/twitter" class="btn btn-social btn-twitter m-5">
                <span class="fa fa-twitter"></span>
                Login with Twitter
            </a>
            <a href="/login/google" class="btn btn-social btn-google m-5">
                <span class="fa fa-google"></span>
                Login with Google
            </a>
        </div>
    </div>
 
    <div class="divider">
        <span>or</span>
    </div>

このような形でSocial Buttonを作成

これでLaravel側の設定ができた。

あとはTwitterとGoogleのApiの取得と設定になる。

 

Twitter Api

Twitterアカウントを作成後

https://apps.twitter.comに移動

Create New AppでApiを取得

必須項目を当てはめてAPI_KEYとAPI_SECRETを取得

Callback URLをhttp://YOUR_DOMAIN/login/twitter/callbackに設定をし、.envに設定をする。

 

Google+ Api

Gmailアカウントを作成後

https://console.developers.google.comに移動

左上のプロジェクト選択で選択か新規作成をする。

サイドバー、ライブラリからGoogle+ API選択後『有効にする』

承認済みのリダイレクト URIの欄を

http://YOUR_DOMAIN/login/google/callbackに設定をし、.envにAPI_KEY作成

 

これでSocial Loginの完了です。

お疲れ様でした。

 

エラーが出たりした際は一旦

1
php artisan migrate:fresh

で改善するかもしれません。

 

あとがき

個人的に初期の段階からLaravelのAuth関連が苦手意識が強く、なかなか踏み出せなかったので、今回ガッツリやってみました。

すごく勉強になったなぁと思います。特にオーバーライドって初めてw

まだまだだなぁって思いながらも、ちょこっとだけWebエンジニアになれた気がしてすごく満足しました。

おしまい。

Sponsored Link

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

この記事が気に入ったらフォローしよう

フォローする

CATEGORY :

  • Laravel
  • PHP フレームワーク

TAGS :

  • Bootstrap3
  • Laravel
  • Social Login

Sponsored Link

  • Laravel Pagination Mobile Template

    Laravel Pagination Mobile Template

  • Composerインストール

    Composerインストール

  • [Laravel5.4] Laravelインストール

    [Laravel5.4] Laravelインストール

  • Multi AuthとSocial Loginを作ってみた。Multi Auth編

    Multi AuthとSocial Loginを作ってみた。Multi Auth編

  • Laravel初心者がTodoアプリ作ってみた。MVC編

    Laravel初心者がTodoアプリ作ってみた。MVC編

  • Laravel初心者がTodoアプリ作ってみた。概要・設定編

    Laravel初心者がTodoアプリ作ってみた。概要・設定編

コメントを残す コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

前の記事

Multi AuthとSocial Loginを作ってみた。M…

次の記事

Unix timestampの罠。

サイト内検索

Sponsored Link

Recent Posts

  • 令和ドメイン
  • macOS スクリーンショットの小技
  • ping -c 10 api.bitflyer.jpをいろんなVMでしてみた。
  • Bitmex Error Code List
  • AttributeError: module ‘pandas’ has no attribute ‘rolling_max’

カテゴリー

  • Blog
  • Composer
  • Docker
  • Editor
  • El Capitan
  • High Sierra
  • iphone
  • Javascript
  • Laravel
  • macOS
  • NEM
  • Node.js
  • PHP
  • PHP フレームワーク
  • Python
  • React.js
  • Sierra
  • Visual Studio Code
  • Wordpress
  • 仮想通貨
  • 開発環境

アーカイブ

  • 2019年4月
  • 2018年12月
  • 2018年9月
  • 2018年8月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月
  • 2018年2月
  • 2017年12月
  • 2017年11月
  • 2017年10月
  • 2017年8月

Sponsored Link

Sponsored Link

 

 

HOME

© 2025 ららベル All rights reserved.