9 Ağustos 2017 Çarşamba

Laravel5.4 Sosyal Hesaplar ile Kimlik Doğrulaması

Herkese selamlar, yeni yeni öğrenmeye başladığım Laravel Framework hakkında güzel şeyler öğrendikçe sizlerle paylaşmak istiyorum. Hem de her şey ingiliççe diyenler için belki güzel bir Türkçe kaynak oluşturmuş olurum.

Bu blogumda Sosyal Hesaplar(Facebook, Twitter vs.) ile Kimlik Doğrulaması yaparak nasıl bir Laravel Projesi oluştururuz onu anlatacağım. Laravel tüm hesapları desteklemiyor. Desteklediği hesaplar için dökümana bakalım :

 "Socialite currently supports authentication with Facebook, Twitter, Google, GitHub and Bitbucket." diyor. Bende bugün sizlere GitHub hesabı için nasıl yapıyoruz onu anlatayım diyorum.

Öncelikle bir proje oluşturuyoruz.
$ composer create-project laravel/laravel PROJECT_NAME

Login sayfasını otomatik oluşturmak için aşağıdaki komutu yazıyoruz. 
$ php artisan make:auth


Projemiz için bir veritabanı oluşturmamız gerekiyor. Veritabanını oluşturduktan sonra .env dosyasına giderek veritabanı bilgilerini dolduruyoruz.

DB_HOST=localhost
DB_DATABASE=databasename
DB_USERNAME=username
DB_PASSWORD=**pasw**

Şimdi database -> migrations klasörüne giderek
database/migrations/{titmestamp}_create_users_table.php dosyasını açarak aşağıdaki veritabanı bilgilerini kayıt edelim. Ben birkaç tane sosyal medya hesabından girişi olacak şekilde projeyi geliştirdiğim için genel bir isim olarak provider ve provider_id verdim. Siz oralara github ve github_id şeklinde sadece Github hesabınızdan girecek şekilde ayarlayabilirsiniz.

public function up()
    {
       Schema::create('users', function (Blueprint $table) {
           $table->increments('id');
           $table->string('name');
           $table->string('email')->unique();
           $table->string('password', 60)->nullable();
           $table->string('provider');
           $table->string('provider_id');
           $table->rememberToken();
           $table->timestamps();
       });
    }

$ php artisan migrate komutu belirlediğimiz veritabanında gerekli tabloları oluşturur.

NOT : Bunu yaptıktan sonra MySQL'de "Specified key was too long error"
hatası alabilirsiniz. Çözümü buraya bırakıyorum.


app/User.php dosyasına giderek aşağıdaki bilgileri yazalım.


protected $fillable = [
       'name', 'email', 'password', 'provider', 'provider_id',
    ];


$ composer require laravel/socialite bu komutu çalıştırarak socialite'yi etkinleştiriyoruz.

config/app.php dosyasına giderek aşağıdaki providers'i ekliyoruz.

'providers' => [
   // Other service providers...

   Laravel\Socialite\SocialiteServiceProvider::class,
],

config/app.php dosyasına giderek aşağıdaki aliases'i ekliyoruz.

'aliases' => [
   // Other aliases...

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

Şimdi de config/services.php aşağıdaki bilgileri ekliyoruz.

'github' => [
       'client_id'     => env('GITHUB_ID'),
       'client_secret' => env('
GITHUB_SECRET'),
       'redirect'      => env('
GITHUB_URL'),
   ],

Şimdi sırada GitHub'dan API key ve API secret alacağız. Bunun için 

  1. GitHub hesabımıza giriş yapıyoruz.
  2.  Ayarlara (Settings) gidiyoruz.
  3.  OAuth applications menüsüne gidiyoruz.(Sol altta olması lazım)
  4. Developer applications geliyor.
  5. Register new application'ı seçiyoruz.
  6. Benim yerelimde projem oyüzden localhost:8000: yazıyoruz.                                                                             Home page : http://localhost:8000/
          Authorization callback URL : http://localhost:8000/auth/github/callback
  7. Register application diyerek kayıt ediyoruz.
 














.env dosyasına giderek Github'dan aldığımız Client_ID ve Client_Secret ve kayıt ettiğimiz callbackurl'i yazıyoruz.

GITHUB_ID=Client Key
GITHUB_SECRET=Client Secret
GITHUB_URL=callbackurl
 
routes/web.php dosyasına giriş için atılacak isteği, istekten gelen verileri almak için callback metodlarını yazıyoruz.

// OAuth Routes
Route::get('auth/{provider}', 'Auth\AuthController@redirectToProvider');
Route::get('auth/{provider}/callback', 'Auth\AuthController@handleProviderCallback');


app/Http/Controllers/Auth/AuthController.php dosyasına giderek aşağıdakileri yazıyoruz.
 
<?php

namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

use App\User;
use Auth;
use Socialite; /*for Socialite */

class AuthController extends Controller
{
    /**
     * Kullanıcıyı OAuth Providera yönlendiriyoruz.
     * @return Response
     */

    public function redirectToProvider($provider)
    {
        return Socialite::driver($provider)->redirect();
    }

    /**
     * Kullanıcı bilgilerini sağlayıcıdan(provider) ediniyoruz. Kullanıcının zaten var olup olmadığını kontrol ediyoruz.
     * Veritabanında provider_id var mı bakıyoruz.
     * Kullanıcı mevcutsa, mevcut olan kaydı döndürüyoruz. Aksi halde, yeni bir kullanıcı oluşturtup daha sonra bu kullanıcı ile giriş yaptırıyoruz. Bundan sonra
     * Kimliği doğrulanmış kullanıcının ana sayfasına yönlendiriyoruz.
     * @return Response
     */

    public function handleProviderCallback($provider)
    {
        $user = Socialite::driver($provider)->user();

        $authUser = $this->findOrCreateUser($user, $provider);
        Auth::login($authUser, true);
        return redirect('/home');
    }

    /**
     *Eğer bu üye daha önce sosyal medya hesaplarından biri ile giriş               
     *yapmamışsa yeni bir üye oluşturuyoruz, eğer kaydı varsa ilgili kaydı bulup
     *kullanıcıyı login ediyoruz
     * @param  $user Socialite kullanıcısı nesnesi
     * @param $provider Social kimlik doğrulama sağlayıcısı
     * @return  User
     */
    public function findOrCreateUser($user, $provider)
    {
        $authUser = User::where('provider_id', $user->id)->first();

        if ($authUser) {
            return $authUser;
        }

        $newUser = User::create([
            'name'     => $user->name,
            'email'    => $user->email,
            'provider' => $provider,
            'provider_id' => $user->id
        ]);
        return $newUser;
    }
}

Resources/Views/Auth/register.blade.php dosyasına giderek kayıt için Github girişini ekliyoruz.

<form class="form-horizontal" role="form" method="POST" action="{{ url('/register') }}">
<!--Other form fields above the button-->
   <div class="form-group">
       <div class="col-md-6 col-md-offset-4">
           <button type="submit" class="btn btn-primary">
           <i class="fa fa-btn fa-user"></i> Register
           </button>
       </div>
   </div>
   <hr>
   <div class="form-group">
       <div class="col-md-6 col-md-offset-4">
           <a href="{{ url('/auth/github') }}" class="btn btn-github"><i class="fa fa-github"></i> Github</a>
       </div>
   </div>
</form>


Resources/Views/Auth/login.blade.php
dosyasına giderek login için Github girişini ekliyoruz.

<form class="form-horizontal" role="form" method="POST" action="{{ url('/login') }}">
<!--Other form fields above the button-->
   <div class="form-group">
       <div class="col-md-6 col-md-offset-4">
           <button type="submit" class="btn btn-primary">
           <i class="fa fa-btn fa-sign-in"></i> Login
           </button>
       </div>
   </div>
   <hr>
   <div class="form-group">
       <div class="col-md-6 col-md-offset-4">
           <a href="{{ url('/auth/github') }}" class="btn btn-github"><i class="fa fa-github"></i> Github</a>
       </div>
   </div>
</form>

Projemizin Sosyal Hesaplar ile kimlik doğrulama kısmı hazır :) İyi Günlerde Kullanın :)
Şimdiden Kolay Gelsin 😺

Hiç yorum yok:

Yorum Gönder