Задать вопрос
@Eternal97

Как переопределять REDIRECT_URI для Laravel Socialite в зависимости от типа аутентифицирующегося пользователя?

Доброго времени суток. Столкнулся с проблемой при аутентификации через соцсети для нескольких сущностей. Имеются две сущности: Student и Teacher. Для начала опишу рабочий вариант для одной сущности.
Мои роуты аутентификации:
//Socialite auth routes...
Route::middleware('guest')->group(function () {
    Route::get('auth/{provider}', 'SocialController@index')->name('auth.provider');
    Route::get('auth/{provider}/callback', 'SocialController@callback');
});

Мой контроллер:
class SocialController extends Controller
{
    public function index($provider)
    {
        return Socialite::driver($provider)->redirect();
    }

    public function callback(SocialService $socialService, $provider)
    {
        $user = Socialite::driver($provider)->user();
        if ($u = $socialService->saveSocialData($user)) {
            Auth::guard('student')->login($u);
            return redirect()->route('profile.index');
        }

        return back();
    }
}

Мой конфиг :
VKONTAKTE_CLIENT_ID=7864077
VKONTAKTE_CLIENT_SECRET=Z2i92xXe47mGJY3D5DQE
VKONTAKTE_REDIRECT_URI=http://127.0.0.1:8000/auth/vkontakte/callback

Так все прекрасно работает, но для сущности Student.
Я хочу передавать в параметр маршрута еще и название сущности (для выбора соответствующей модели, гварда и редиректа в контроллере), вот так в переменную $client:
//Socialite auth routes...
Route::middleware('guest')->group(function () {
    Route::get('auth/{client}/{provider}', 'SocialController@index')->name('auth.provider');
    Route::get('auth/{client}/{provider}/callback', 'SocialController@callback');
});

Но, я сталкиваюсь с проблемой конфигурации маршрута REDIRECT_URI:
VKONTAKTE_REDIRECT_URI=http://127.0.0.1:8000/auth/student/vkontakte/callback
VKONTAKTE_REDIRECT_URI=http://127.0.0.1:8000/auth/teacher/vkontakte/callback

Если я пропишу два маршрута в конфиге, то переменная просто переопределится и вернет всегда последний маршрут для любой сущности.
Как можно динамически изменять REDIRECT_URI в зависимости от передаваемых параметров?
  • Вопрос задан
  • 95 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@Eternal97 Автор вопроса
Решил проблему так:
Контролер авторизации
class SocialController extends Controller
{
    public function index(SocialService $socialService, $client, $provider)
    {
        $socialService->setConfig($client, $provider);

        return Socialite::driver($provider)->redirect();
    }

    public function callback(SocialService $socialService, $client, $provider)
    {
        $socialService->setConfig($client, $provider);
        $user = Socialite::driver($provider)->user();
        if ($u = $socialService->saveSocialData($client, $user)) {
            Auth::guard($client)->login($u);
            return redirect()->route('profile.index');
        }

        return back();
    }
}

Сервисный слой:
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Hash;

class SocialService
{
    public function saveSocialData($client, $user)
    {
        if ($client == 'student') {
            $model = new Student();
        }
        if ($client == 'teacher') {
            $model = new Teacher();
        }

        $email = $user->getEmail();

        $u = $model->where('email', $email)->first();

        if ($u == null) {
            $data = [
                'first_name' => 'First',
                'middle_name' => 'Middle',
                'last_name' => 'Last',
                'birth' => today(),
                'email' => $email,
                'password' => Hash::make('secret123'),
            ];
            return $model->create($data);
        }

        return $u;
    }

    public function setConfig($client, $provider)
    {
        if ($provider == 'vkontakte') {
            $clientId = env('VKONTAKTE_CLIENT_ID');
            $clientSecret = env('VKONTAKTE_CLIENT_SECRET');
            $redirectUrl = 'http://127.0.0.1:8000/auth/'.$client.'/vkontakte/callback';
        }
        if ($provider == 'google') {
            $clientId = env('GOOGLE_CLIENT_ID');
            $clientSecret = env('GOOGLE_CLIENT_SECRET');
            $redirectUrl = 'http://127.0.0.1:8000/auth/'.$client.'/google/callback';
        }
        Config::set(['services.'.$provider => [
            'client_id' => $clientId,
            'client_secret' => $clientSecret,
            'redirect' => $redirectUrl
        ]]);
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы