Использование laravel socialite и jwt-auth без сеанса

Краткая версия: как лучше всего отправить JWT, сгенерированный из входа в Facebook (laravel / socialite), во внешний интерфейс angularjs без использования сеанса.

Длинная версия. Я делаю приложение с интерфейсом angularjs и сервером laravel 5.2. Я использую tymondesigns / jwt-auth для аутентификации вместо сеанса.

Я также использую laravel / socialite для аутентификации в социальной сети Facebook. Для этого я использую функцию «Socialite» без сохранения состояния, поэтому сеанс мне не нужен.

Базовая аутентификация работает отлично. Но когда я пытаюсь использовать вход в Facebook, я выполняю следующие действия.

  1. Пользователь нажимает кнопку на стороне angular, которая перенаправляет на страницу входа поставщика серверной части.

public function redirectToProvider() { return Socialite::with('facebook')->stateless()->redirect(); } 2. Пользователь предоставляет свои данные для входа. После входа в систему он перенаправляется на мою функцию handlecallback.

        try {
        $provider = Socialite::with('facebook');

        if ($request->has('code')) {
            $user = $provider->stateless()->user();
        }

    } catch (Exception $e) {
        return redirect('auth/facebook');
    }

    return $this->findOrCreateUser($user);
  1. Затем я использую функцию findorcreate, чтобы определить, существует пользователь или нет. Если нет, то я просто создаю нового пользователя и создаю из него JWT.

        $user = User::where('social_id', '=', $facebookUser->id)->first();
    
    if (is_object($user)) {
        $token = JWTAuth::fromUser($user);
        return redirect()->to('http://localhost:9000/#/profile?' . 'token=' . $token);#angular 
    } else {
        $result = array();
        $result['name'] = $facebookUser->user['first_name']
        $result['email'] = $facebookUser->user['email'];
        $result['social_id'] = $facebookUser->id;
        $result['avatar'] = $facebookUser->avatar;
        $result['gender'] = $facebookUser->user['gender'];
        $result['status'] = 'active';
        $result['login_type'] = 'facebook';
        $result['user_type'] = 'free_user';
    
        try {
            $user = User::create($result);
        } catch (Exception $e) {
            return response()->json(['error' => 'User already exists.'], HttpResponse::HTTP_CONFLICT);
        }
        $token = JWTAuth::fromUser($user);
        return redirect()->to('http://localhost:9000/#/profile?' . 'token=' . $token);#angular
    }
    

Моя проблема в том, что в последнем блоке кода мне нужно отправить jwt на мой интерфейс через URL-адрес. Что совсем небезопасно. Каким будет правильный способ отправить сгенерированный JWT во внешний интерфейс без использования сеанса. Спасибо


person Adnan Nuruddin    schedule 14.03.2016    source источник
comment
Вы разрешили это? Та же проблема обнаружилась и в нашем приложении.   -  person mtpultz    schedule 31.05.2016
comment
Хранение токена в куки - тоже неплохая идея. В обработчике обратного вызова вы должны установить файл cookie с токеном в нем.   -  person Aftab Naveed    schedule 26.05.2017


Ответы (3)


В официальной документации Laravel Socialite говорится:

Аутентификация без сохранения состояния

Метод stateless может использоваться для отключения проверки состояния сеанса. Это полезно при добавлении социальной аутентификации в API:

return Socialite::driver('google')->stateless()->user();

Затем вы можете пройти аутентификацию, используя метод jwt-auth:

JWTAuth::fromUser($user)
person insign    schedule 14.08.2017

Если вы используете $http на стороне Angular, попробуйте вернуть токен в виде ответа JSON от Laravel:

return response()->json(compact('token'));

Затем сохраните токен в localStorage или sessionStorage или в другом месте.

Если вы создаете свою страницу Angular из Laravel (т.е. не используете Laravel в качестве API, но, например, показываете свою страницу Angular из /public/index.php), вы можете загрузить представление с токеном в данных для представления.

Пока вы используете HTTPS, любой из этих двух сценариев лучше, чем передача токена в URL-адресе перенаправления.

person jdforsythe    schedule 17.03.2016
comment
Спасибо за ответ. Laravel используется как API. Пользователь уже покинул сайт angular, когда переходит на страницу входа в facebook. Таким образом, возврат токена в качестве ответа не достигнет угловой стороны. - person Adnan Nuruddin; 31.03.2016

Вы можете хранить токен и использовать перенаправление на стороне клиента без сохранения в истории браузера, чтобы перенаправить пользователя на страницу профиля без токена в URL:

document.location.replace({profile-url})
person Ігор Верещинський    schedule 22.10.2018