Thursday, July 14, 2016

Laravel 5.2 සිංහලෙන් - user verification and validate the e-mail verification link - 2

යාලුවනේ මම කලින් පොස්ට් එකෙන් කියලා දුන්නා කොහොමද laravel වලින් authentication කරන්නේ කියලා. මං හිතනවා ඔයාලා තනියම කරලා බලන්න ඇති කියලා.

මම එකට package එකක් භාවිතා කරනවා. cmd ඒක අපේ laravel වල core folder එකට browse කරලා පහල command එක run කරන්න.

"composer require jrean/laravel-user-verification"

ඊට පස්සේ config/app.php file එකේ providers වලට පහල තියෙන line එක දන්න.

Jrean\UserVerification\UserVerificationServiceProvider::class

එකේම aliases වලට පහල link එක දාන්න.
  
'UserVerification' => Jrean\UserVerification\Facades\UserVerification::class

User model එක අපි  දිගටම පාවිච්චි කරනවා. email verification කරන්නේ ටෝකන් එකක් හරහා. එකට අපි verified හා verification_token කියලා field දෙකක් users table එකට දාගන්න ඕන. එකට ඕන migration එක හදාගන්න මේ code එක cmd එකේ run කරන්න ඕන. 

php artisan make:migration add_verification_to_users_table --table="users"

දැන් මේ විදියට ඒ migration file එක වෙනස් කරන්න.

    public function up()
    {
        Schema::table(':table', function (Blueprint $table) {
            $table->boolean('verified')->default(false);
            $table->string('verification_token')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table(':table', function (Blueprint $table) {
            $table->dropColumn('verified');
            $table->dropColumn('verification_token');
        });
    }
ඊළගට migration run කරන්න ඕන database එකේ user table එක update කරන්න

php artisan migrate

දැන් මොඩෙල් එකේ පහල fillable ටික දාන්න


protected $fillable = [
        'name', 'email', 'password', 'verified', 'verification_token',
    ];

දැන් email setting හදන්න ඕන එකට config/mail.php file එක පහල විදියට update කරන්න.

<?php

return [

    'driver' => env('MAIL_DRIVER', 'smtp'),

    'host' => env('MAIL_HOST', 'smtp.gmail.com'),

    'port' => env('MAIL_PORT', 587),

   'from' => ['address' => 'norply@fos.cmb.ac.lk', 'name' => 'Prabhath'],

    'encryption' => env('MAIL_ENCRYPTION', 'tls'),

    'username' => env('MAIL_USERNAME'),

    'password' => env('MAIL_PASSWORD'),

    'sendmail' => '/usr/sbin/sendmail -bs',

];


මේකේ email login un & password env file එකේ දාන්න.
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=noreply@fos.cmb.ac.lk
MAIL_PASSWORD=
MAIL_ENCRYPTION=tls

දැන් තියෙන්නේ verification link එක send කරන view එක ගහන එක. අපි පාව්ච්චි කරන package එකේ emails.user-verification කියල තමයි use කරන්නේ. 
resources/views/emails/user-verification.blade.php විදියට view එක හදන්න. 
Click here to verify your account: <a href="{{ $link = url('verification', $user->verification_token) . '?email=' . urlencode($user->email) }}"> {{ $link }}</a>


අහ් resources/views/auth/register.blade.php එකට verified කියල hidden field එකක් දාන්න ඕනේ. නැත්නම් AuthController එකේ user ව array එකට දානකොට verified field එක නෑ කියනවා.


<input type="hidden" name="verified">

දැන් අපිට route, controllers තමයි හදාගන්න තියෙන්නේ.

මුලින්ම route.php එක පහත ආකාරයට වෙනස් කර ගන්න.

Route::group(['middleware'=> ['web']], function() {

    Route::auth();
    Route::get('verification/error', 'Auth\AuthController@getVerificationError');
    Route::get('verification/{token}', 'Auth\AuthController@getVerification');
    Route::get('/home', 'HomeController@index');
});

දැන් app/Http/Controllers/Auth/AuthController.php එක මේ විදියට වෙනස් කරන්න.


<?php

namespace App\Http\Controllers\Auth;

use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

use Jrean\UserVerification\Traits\VerifiesUsers;
use Jrean\UserVerification\Facades\UserVerification;

//use VerifiesUsers;


class AuthController extends Controller
{

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    //protected $redirectTo = '/';

    protected $redirectIfVerified = '/';
    protected $redirectAfterVerification = '/';
    protected $redirectIfVerificationFails = '/verification/error';
    protected $verificationErrorView = 'errors.user-verification';
    protected $userTable = 'users';

    public function __construct()
    {
        //$this->middleware($this->guestMiddleware(), ['except' => 'logout']);
        $this->middleware('guest', ['except' => ['logout', 'getVerification', 'getVerificationError']]);
    }

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|min:6|confirmed',
        ]);
    }

    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'verified' => $data['verified'],
            'password' => bcrypt($data['password']),
        ]);
    }
}


දැන් RegistersUsers trait එක edit කරන්න ඕන. එක AuthController එකට extend කරලා තියෙන්නේ. එකේ register method එක තමයි අපි වෙනස් කරන්නේ. මුලින්ම පහල link ටික import කරන්න.


use Jrean\UserVerification\Traits\VerifiesUsers;
use Jrean\UserVerification\Facades\UserVerification;

use Session;

use Flash;

use VerifiesUsers; කියන line එක class එක ඇතුලට දාන්න. 

දැන් register method එක පහල විදියට වෙනස් කරන්න.

public function register(Request $request)
 {

  $validator = $this->validator($request->all());

  if ($validator->fails()) {
   $this->throwValidationException(
    $request, $validator
   );
  }

  $user = $this->create($request->all());

  // Authenticating the user is not mandatory at all.

  // Laravel <= 5.2.7
  //Auth::login($user);

  // Laravel > 5.2.7
  //Auth::guard($this->getGuard())->login($user);

  UserVerification::generate($user);
  UserVerification::send($user, 'My Custom E-mail Subject');
  return redirect($this->redirectPath());

 }

මම RegistersUsers trait එක පහලින් දානවා. උඩ තියෙන්නේ වෙනස් කරන්න ඕන method එක විතරයි. එක වෙනස් කරාම ඇති. flash massage send කරන code එකකුත් ඔකේ තියෙනවා. flash massage ගැන මම post එකක් ලියනවා ලගදීම.


<?php

namespace Illuminate\Foundation\Auth;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

use Jrean\UserVerification\Traits\VerifiesUsers;
use Jrean\UserVerification\Facades\UserVerification;

use Session;
use Flash;

trait RegistersUsers
{
 //use RedirectsUsers;
 use VerifiesUsers;

 public function getRegister()
 {
  return $this->showRegistrationForm();
 }

 public function showRegistrationForm()
 {
  if (property_exists($this, 'registerView')) {
   return view($this->registerView);
  }

  return view('auth.register');
 }

 public function postRegister(Request $request)
 {
  return $this->register($request);
 }

 public function register(Request $request)
 {
  $validator = $this->validator($request->all());

  if ($validator->fails()) {
   $this->throwValidationException(
    $request, $validator
   );
  }

  $user = $this->create($request->all());

  // Authenticating the user is not mandatory at all.

  // Laravel <= 5.2.7
  //Auth::login($user);

  // Laravel > 5.2.7
  //Auth::guard($this->getGuard())->login($user);


  UserVerification::generate($user);

  UserVerification::send($user, 'My Custom E-mail Subject');

  //Session::flash('flash_message','Your activation lin has been sent as email');
  flash()->success('You are a shit.');
  //Flash::message('Welcome aboard!');

  //dd(Session::all());
                //return view('Welcome');
               return redirect($this->redirectPath());
}

 protected function getGuard()
 {
  return property_exists($this, 'guard') ? $this->guard : null;
 }
}


මම RegistersUsers trait එක පහලින් දානවා. උඩ තියෙන්නේ වෙනස් කරන්න ඕන method එක විතරයි. එක වෙනස් කරාම ඇති.

ඔය ටික තමයි කරන්න ඕන.... 

වැඩි විස්තර github එකේ අපි භාවිතා කරපු package එකේ link එකෙන් බලන්න 
https://github.com/jrean/laravel-user-verification 

තව video tutorial එකක link එක දානවා. එකේ තියෙනවා package use කරන නැතුව email verification කරන විදිය. මේ ගැනත් පොස්ට් එකක් ලගදීම ලියන්නම් example code එක්කම.
https://laracasts.com/series/laravel-authentication-techniques  

මම ඊලග post එකෙන් facebook, google, LinkedIn, වගේ social account වලින් users ල authenticate කරන විදිය කියන්නනම්.

මේ ලිපිය ප්‍රයෝජනවත් කියලා හිතෙනවනම් මේ ලිපිය Share කරලා යාළුවන්ටත් කියන්න. Comment එකක් දාන්නත් අමතක කරන්න එපා. ජය වේවා..!!




Share/Bookmark

0 comments:

Post a Comment