dcblogdev / laravel-microsoft-graph

Laravel package for Microsoft Graph API (Microsoft365)
https://dcblog.dev/docs/laravel-microsoft-graph
Other
120 stars 51 forks source link

Duplicate user after logout #54

Closed eric-walter closed 1 year ago

eric-walter commented 1 year ago

Hi, First of all, thanks fr this package, it's very usefull :) When a user log in for the first time, a row is inserted in the users table, but if this user log out then try to log in again, there is an "duplicate entry" error.

eric-walter commented 1 year ago

In the NewMicrosoft365SignInListener.php:18, instead of:

        $user = User::create([
            'firstname'     => $event->token['info']['givenName'],
            'lastname'     => $event->token['info']['surname'],
            'email'    => $event->token['info']['mail'],
            'password' => '',
        ]);

        $token->user_id = $user->id;
        $token->save();

        Auth::login($user);

It should be:

        $user = User::firstOrNew([
            'email' => $event->token['info']['mail'],
        ], [
            'firstname'     => $event->token['info']['givenName'],
            'lastname'     => $event->token['info']['surname'],
            'email'    => $event->token['info']['mail'],
            'password' => '',
        ]);

        $token->user_id = $user->id;
        $token->save();

        Auth::login($user);
dcblogdev commented 1 year ago

I've just released https://github.com/dcblogdev/laravel-microsoft-graph/releases/tag/v3.2.0. the only changes required are updating the listener to the following:

<?php

namespace App\Listeners;

use App\Models\User;
use Dcblogdev\MsGraph\MsGraph;
use Illuminate\Support\Facades\Auth;

class NewMicrosoft365SignInListener
{
    public function handle($event)
    {
        $user  = User::firstOrCreate([
            'email' => $event->token['info']['mail'],
        ], [
            'name'     => $event->token['info']['displayName'],
            'email'    => $event->token['info']['mail'] ?? $event->token['info']['userPrincipalName'],
            'password' => '',
        ]);

        (new MsGraph())->storeToken(
            $event->token['accessToken'],
            $event->token['refreshToken'],
            $event->token['expires'],
            $user->id,
            $user->email
        );

        Auth::login($user);
    }
}

Also updated the docs to make them more clear.