Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel 5 authenticate users through external API

I'd like to know is it possible to extend the built-in authentication to use an external API to authenticate a user? I'm a Laravel newbie, so I'd appreciate your help. I'm making a custom app in Laravel 5.2 for my client, but I don't a direct access to their database server and I can only call their API to get users' details.

Thanks.

like image 974
Kasta Avatar asked Jan 11 '16 14:01

Kasta


People also ask

Which is best authentication for Laravel?

By default, Laravel includes an App\User Eloquent model in your app directory. This model may be used with the default Eloquent authentication driver. If your application is not using Eloquent, you may use the database authentication driver which uses the Laravel query builder.


1 Answers

If I understood correctly you want to log users from APIs like facebook, twitter or github for example ? If that's so you need to use a laravel package named Socialite, here is the link to download and use it : https://github.com/laravel/socialite

run on your command this :

composer require laravel/socialite

Next you need to tell laravel you want to use this package, so you need to add this in config/app.php :

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

Laravel\Socialite\SocialiteServiceProvider::class,
],

and this is the aliases :

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

Basically, you'll need to create an app on the developers site, i'll take facebook for this example.You need to go to this site : https://developers.facebook.com/, create an account and you'll get your app url and secret key. You'll use it on your .env and config/services files.

In your config/services file add this after stripe :

'facebook' => [
    'client_id' => env('FACEBOOK_ID'),
    'client_secret' => env('FACEBOOK_SECRET'),
    'redirect' => env('FACEBOOK_URL'),
],

And in your .env file :

FACEBOOK_ID=*your facebook id*
FACEBOOK_SECRET=*your facebook secret*
FACEBOOK_URL=http://yourwebsite.com/callback

Next you'll need a controller to handle the auth process, create something like SocialAuthController and put this in :

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

public function callback() {
    $user = $this->findOrCreateFbUser(Socialite::driver('facebook')->user());


    session([
        'user' => $user
    ]);
    return redirect()->route('/');

}

public function logout() {

    session()->forget('user');

    return redirect()->route('home');
}

protected function findOrCreateFbUser($fbUser) {
    // the data you want to get from facebook
    $fbData = [
        'facebook_id'   => $fbUser->id,
        'avatar'        => $fbUser->avatar,
        'username'      => $fbUser->name,
        'email'         => $fbUser->email,
    ];

    $user = \App\User::where('facebook_id', $fbData['facebook_id'])->first();

    if(!$user) $user = \App\User::create($fbData);

    $user->update([
        'avatar' => $fbUser->avatar,
        'username' => $fbUser->name,
        'email' => $fbUser->email
    ]);


    return $user;
}

Of course you need to add a facebook_id field in your user database and model. In User.php :

protected $fillable = [
    'facebook_id',
    'username',
    'email',
    'avatar'

];

I know this solution isn't really dynamic as it is for only one api, i'm still pretty new at Laravel too and this is my first answer to a stackoverflowquestion, but this did the trick for me :) If I forgot something don't hesitate to tell me so i can update this answer..

I also suggest you follow Jeffrey Way's tutorial on social auth on the Laracasts website, it's very instructive and clear, i could manage it thanks to him !

like image 56
ABCrafty Avatar answered Oct 17 '22 10:10

ABCrafty