Проблема Laravel с loginUsingId (ручная аутентификация)

Я пытаюсь реализовать единый вход в несколько доменов. Концепция довольно проста: отправить уникальные токены пользователя, а затем проверить эти токены, чтобы найти пользователя, а затем войти в систему.

Теперь, после проверки токена и захвата пользователя, я делаю что-то вроде этого

$loggedInUser = Auth::loginUsingId($user->id, true);

Теперь у меня есть настраиваемое промежуточное ПО, где оно сначала проверяет зарегистрированного пользователя, т.е.

Auth::Check()

Вышеупомянутое отлично работает впервые. Но при обновлении Auth :: check () не проверяется. Я также пробовал использовать все разные драйверы сеанса, но все еще не работает.

Я использовал аналогичный код в laravel 5.2, и он сработал. Но в laravel 5.3 он не проверяет постоянные запросы.

Изменить: позвольте мне показать вам мой код. Я не изменял AuthServiceProvider или какой-либо другой охранник. У меня есть модель пользователя внутри каталога, но я изменил путь в auth.php.

Вот маршрут, на который указывает domain1:

http://domain2.com/ {{$ role}} / {{$ route}} / singlesignon / {{$ token}}

Затем это подбирается методом verifySingleSignOn внутри loginController, который принимает роль, маршрут, по которому пользователь пришел из другого домена, и токен. Затем пользователь перенаправляется на те же маршруты, но на домен 2. Здесь я могу успешно получить идентификатор пользователя перед входом в систему вручную.

public function verifySingleSignOn($role, $route, $token)
    {
        // Fetch Single Signon
        $userRepository = new UserRepository();
        $user = $userRepository->checkForSingleSignOnToken($token, ['id']);

        // Check if Token Exists
        if (isset($user->id) && is_int($user->id) && $user->id != 0) {

            // Manually Logging a user (Here is successfully recieve the user id)
            $loggedInUser = Auth::loginUsingId($user->id);

            if (!$loggedInUser) {
                // If User not logged in, then Throw exception
                throw new Exception('Single SignOn: User Cannot be Signed In');
            }
            $redirectTo = $role . '/' . $route;
            return redirect($redirectTo);
        } else {
            return Auth::logout();
        }
    }

Тогда у меня есть это промежуточное ПО GlobalAdminAuth

   // Check if logged in
    if( Auth::Check() ){
        $user = Auth::User();

        // Check if user is active and is a globaladmin
        if( !$user->isGlobalAdmin() || !$user->isActive() ){
            return redirect()->guest('login');
        }
    }else{
        return redirect()->guest('login');
    }

    return $next($request);

Теперь в первый раз все работает нормально, и пользователь успешно проходит через промежуточное ПО. но во второй раз срабатывает инструкция else.

Изменить: код для checkForSingleSignOnToken

public function checkForSingleSignOnToken($token, $columns = array('*'))
{
    return User::where('single_signon', $token)->first($columns);
}

person omer Farooq    schedule 07.09.2016    source источник
comment
Какой у вас драйвер сеанса?   -  person Filip Koblański    schedule 07.09.2016
comment
Я пробовал их все, кроме Redis.   -  person omer Farooq    schedule 08.09.2016
comment
Покажите, пожалуйста, код метода checkForSingleSignOnToken   -  person Diogo Gomes    schedule 13.09.2016
comment
Все ли домены находятся на одном сервере? Все ли домены используют одну и ту же БД?   -  person Diogo Gomes    schedule 13.09.2016
comment
@DiogoGomes: да, все домены используют одно и то же приложение, которое находится на одном сервере. В приложении есть несколько баз данных для разных вещей, но «да», все пользователи находятся в одной базе данных.   -  person omer Farooq    schedule 13.09.2016
comment
@omerFarooq, если это так, я не думаю, что вам нужно это решение. Стандартная аутентификация Laravel вам не подходит?   -  person Diogo Gomes    schedule 14.09.2016
comment
Вы сохранили свой токен в базе данных, чтобы проверить, действителен ли этот токен?   -  person Mr. Pyramid    schedule 12.09.2017


Ответы (5)


пытаться

Auth::login($user);

вместо того

Auth::loginUsingId($user->id, true);
person Pankaj Kachhwaye    schedule 20.08.2018

Файлы cookie ограничены доменом. Ваше приложение на domain1.com не сможет получать файлы cookie, установленные domain2.com.

Вы должны настроить охрану для использования какого-либо другого механизма, кроме файлов cookie. Возможно использовать токен в параметрах запроса.

person Manan    schedule 27.11.2016
comment
идеально!!! Благодарность - person Tebe; 05.01.2021

добавьте это в свой protected $middleware массив в app\Http\Kernel.php

    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\VerifyCsrfToken::class

Думаю, это связано с обновлением фреймворка

person Ghost Worker    schedule 19.12.2016

без использования аутентификации: проверьте промежуточное ПО

используя request-> user () или auth :: user ()

person Tran Hoang Hiep    schedule 25.04.2017

Пожалуйста, просмотрите структуру кода ниже, я сделал ручную аутентификацию в laravel 5.0.

routes.php

Route::get('login_user_by_id/{id?}', ['as' => 'login_user_by_id', 'uses' => 'UsersController@login_user_by_id']);
Route::post('user_login_post_for_admin',['as'=>'user_login_post_for_admin','uses'=>'LoginController@user_login_post_for_admin']);
Route::get('user_logout', ['as' => 'user_logout', 'uses' => 'UsersController@user_logout']);

LoginController.php

public function user_login_post_for_admin(){
    $this->set_email($_POST['email']);
    $this->set_password($_POST['password']);
    $this->set_login_requested_role(['Admin','Moderator']);
    return $this->user_login_post();
}

public function user_login_post(){
    $User = new User();

    if(isset($this->email) && !empty($this->email)){
        $User->set_email(trim($this->email));
        $User->set_password(Hash::make(trim($this->password)));
        $user_login_data = $User->check_email_password_for_login();
        if(isset($user_login_data) && !empty($user_login_data)){
            if (Hash::check(trim($this->password), $user_login_data[0]->password)) {
                $response['user_id']=$user_login_data[0]->id;
                $response['name']=$user_login_data[0]->name;
                $response['surname']=$user_login_data[0]->surname;
                $response['profile_picture']=$user_login_data[0]->profile_picture;
                $response['SUCCESS']='True';
                $response['MESSAGE']='Login Success.';
                return Redirect::route('login_user_by_id',[$user_login_data[0]->id]);
            }else{
                Session::put('SUCCESS','FALSE');
                Session::put('MESSAGE', 'Invalid Credential.');
                return redirect()->back();
            }
        }else{
            Session::put('SUCCESS','FALSE');
            Session::put('MESSAGE', 'Invalid Credential.');
            return redirect()->back();
        }
    }else{
        Session::put('SUCCESS','FALSE');
        Session::put('MESSAGE', 'Invalid Credential.');
        return redirect()->back();
    }
}

UsersController.php

public function login_user_by_id($id=''){
    if(isset($_GET['id'])&&!empty($_GET['id'])){
        $id = $_GET['id'];
    }
    $User = new User();
    $Log=new Log();
    $user_for_auth = $User->find($id);
    Auth::login($user_for_auth, true);

    $User->id=AUTH::user()->id;
    $auth_user_role=$User->auth_user_role();
    $rl_title=$auth_user_role[0]->rl_title;

    return Redirect::route('admin_home');

}

public function user_logout(User $user){
    $User=new User();
    $login_user_id = AUTH::user()->id;
    $User->id=AUTH::user()->id;
    $auth_user_role=$User->auth_user_role();
    $login_user_role=$auth_user_role[0]->rl_title;
    $response['user_id']=$login_user_id;
    $response['SUCCESS']='TRUE';
    $response['MESSAGE']='Successfully Logout.';
    Auth::logout();
    return Redirect::route('admin_login');
}
person Hirendrasinh S. Rathod    schedule 01.05.2017