Friday, July 15, 2016

Laravel 5.2 සිංහලෙන් - Social Authentication using Laravel Socialit

යාලුවනේ අපි බලමු කොහොමද FB, google වලින් login ගන්නේ කියලා. 
අපි මේකට socialite කියල package එකක් භාවිතා කරනවා. ඒ ගැන laravel doc එකේ link එක මම දාන්නම්. නමුත් එක කරන විදිය පැහැදිලිව නෑ. මම කියන්නම් කොහොමද කරන්නේ කියල. 
https://laravel.com/docs/5.0/authentication#social-authentication

මුලින්ම මම පළමුවෙනි පොස්ට් එකෙන් කියලා දුන්න විදියට laravel auth හදා ගන්න ඕන. එතකොට අපිට ඕන views, controllers හදාගන්න පුළුවන්.
දැන් Socialite package එක අපේ project එකට දා ගන්න ඕන. මුලින්ම cmd එක path එක අපේ project එකට browse කරලා මේ command එක run කරන්න.

composer require laravel/socialite  

ඊළගට  config/app.php  වල providers වලට මේ line එක දාන්න.

Laravel\Socialite\SocialiteServiceProvider::class,

alias වලට මේක දාන්න

'Socialite' => Laravel\Socialite\Facades\Socialite::class,

දැන් තියෙන්නේ facebook app එකක් හදාගන්න එක.මුලින්ම FB එකට ලොග් වෙලා මේ link එකට යන්න.
ඊළගට dashboard එකක් ඒවි. එකේ settings වල add platform කරලා අපේ project එකේ URL එක දාන්න.
 එකෙන් පස්සේ config/services.php එකට පහල විදියට FB app එකේ settings දාන්න.

'facebook' => [
    'client_id' => '690344774435367',
    'client_secret' => 'ebc50d3fd1d2f7286e02d247e5751ef4',
    'redirect' => 'http://localhost:8000/callback',
],
 මේකේ client_id සහ client_secret අපේ app එකේ දෙනඒවා දාන්න. redirect එකට FB app එක CALL කරාට පස්සේ run වෙන්න ඕන route එක ඇතුලත් link එක දාන්න.

දැන් අපි controller එක හදමු.
php artisan make:controller SocialAuthController    
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
//use App\SocialAccountService;
use Socialite;

class SocialAuthController extends Controller
{
    public function redirect()
    {
        return Socialite::driver('facebook')->redirect();   
    }   

    public function callback(SocialAccountService $service)
    {
        $user = $service->createOrGetUser(Socialite::driver('facebook')->user());

        auth()->login($user);

        return redirect()->to('/home');
    }
}
ඊළගට SocialAccountService.php file එක controller folder එක ඇතුලෙම හදන්න 
<?php

namespace App\Http\Controllers;

use Laravel\Socialite\Contracts\User as ProviderUser;
use App\SocialAccount;
use App\User; 

class SocialAccountService
{
    public function createOrGetUser(ProviderUser $providerUser)
    {
        $account = SocialAccount::whereProvider('facebook')
            ->whereProviderUserId($providerUser->getId())
            ->first();

        if ($account) {
            return $account->user;
        } else {

            $account = new SocialAccount([
                'provider_user_id' => $providerUser->getId(),
                'provider' => 'facebook'
            ]);

            $user = User::whereEmail($providerUser->getEmail())->first();

            if (!$user) {

                $user = User::create([
                    'email' => $providerUser->getEmail(),
                    'name' => $providerUser->getName(),
                ]);
            }

            $account->user()->associate($user);
            $account->save();

            return $user;

        }

    }
}
දැන් routes වලට මේ link දෙක දාන්න.
Route::get('/redirect', 'SocialAuthController@redirect');
Route::get('/callback', 'SocialAuthController@callback');
ඊළගට user table එකේ email field එක null able කරන්න. මොකද සමහර providers ල users mails දෙන්නේ නැ.
$table->string('email')->unique()->nullable();
 අපිට social account වලට migrations සහ model එකක් ඕන.
php artisan make:migration create_social_accounts_table --create="social_accounts"

php artisan make:model SocialAccount
migration table එකට මේ විදියට වෙනස් කරන්න.
Schema::table('social_accounts', function (Blueprint $table) {
        $table->integer('user_id');
        $table->string('provider_user_id');
        $table->string('provider');
        $table->timestamps();
    });
ඊළගට php artisan migrate:refresh run කරන්න cmd එකේ. එතකොට db එකේ tables
update වේවි
SocialAccount model එක මේ විදියට ලියන්න.
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class SocialAccount extends Model
{
    protected $fillable = ['user_id', 'provider_user_id', 'provider'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
 ඔක්කොම හරි දැන්. මේ link එක login view එකට දාන්න.

<a href="redirect">FB Login</a>
දන් project එක run කරාම cURL error 60: SSL certificate problem: unable to get local issuer certificate කියල error එකක් එන්න පුළුවන්. ඊට හේතු වන්නේ SSL හරියට අපේ machine එකේ වැඩ නොකිරිමයි. 
http://curl.haxx.se/ca/cacert.pem link එකේ තියෙන txt බාල txt එකක් විදියට php folder එකට දාන්න. ඊට පස්සේ php.ini file එකට මේ code එඅ දාන්න.
curl.cainfo="C:\xampp\php\cacert.pem.txt"

තව email එකට ලොග් වෙලා පහල ලින්ක් එකට යන්න. ඊට පස්සේ එක allow yes කරන්න
https://www.google.com/settings/security/lesssecureapps
දැන් අනිවා project එක වැඩ කරන්න ඕන.

ඉතින් යාලුවනේ ඊලග පොස්ට් එකෙන් google, fb, LinkedIn, වගේ accounts ඔක්කොමගෙන් log වෙන හැටි කියල දෙන්නම්
මේ ලිපිය ප්‍රයෝජනවත් කියලා හිතෙනවනම් මේ ලිපිය Share කරලා යාළුවන්ටත් කියන්න. Comment එකක් දාන්නත් අමතක කරන්න එපා. ජය වේවා..!!

Share/Bookmark

0 comments:

Post a Comment