Логин RESTful Laravel API от приложения в другом домене

Как настроить Laravel 5.0 для входа в другой домен? Объясните: у нас есть API Laravel RESTful, а некоторые пользователи создают приложения и хосты Angular.js в своих собственных доменах.

При попытке входа в систему через эти приложения логин возвращает true, но при следующем запросе теряет сеанс.

Я думаю, что это может быть связано с CORS, но я задал правильные заголовки.

Мои заголовки:

Учреждения, установленные на apache virtualhost:

Header always set Access-Control-Allow-Origin "*" Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, PUT, PATCH, DELETE" Header always add Access-Control-Allow-Headers "accept, origin, x-requested-with, content-type, x-application-token, x-csrf-token, x-password-reset-token" Header always add Access-Control-Expose-Headers "x-csrf-token" 

Настройка CORS – это лишь небольшой шаг в выполнении этой работы. Пожалуйста, прочитайте эту статью

Проблема, с которой вы столкнулись, – это последующие запросы из ваших других доменов, не отправляющие какой-либо токен или идентификатор, который может использовать laravel, чтобы решить, что пользователь делает запрос. Вы должны изучить использование библиотеки JWT.

laravel-jwt довольно прост в достижении этого. Простое добавление CORS в ваше приложение будет недостаточным для правильной работы.

Laravel должен знать, что пользователь делает запрос, и вышеупомянутая библиотека поставляется с промежуточным программным обеспечением и методами, чтобы легко выполнить это.

С высокого уровня, некоторые из шагов, которые должны будут произойти:

1) Настройка углового контроллера входа / службы

  $scope.login = function () { // Send The Login Request UserService.authenticate($scope.formData) .$promise.then(function(data) { // If Successfully Authed if (data.success && data.hasOwnProperty('token')) { // Set Cookies UserService.setCurrentUser(data.user); UserService.setUserToken(data.token); // Fire Login Event return authService.loginConfirmed(data); } else { // Else Errors Logging In AlertService.addAlert(data.error, 'danger'); } }); }; 

2) Обработка auth с помощью laravel-jwt:

 public function authenticate() { $credentials = $this->request->only('username', 'password'); try { // Verify Credentials & Create Token for User if (! $token = $this->auth->attempt($credentials)) { return response()->json(['success' => false, 'error' => 'Invalid Credentials.'], 401); } } catch(JWTException $e) { // Something went wrong encoding the token. return response()->json(['success' => false, 'error' => 'Could not create token.'], 401); } return response()->json(['success' => true, 'user' => $user->toArray()); } 

3) Добавление углового перехватчика для добавления заголовка авторизации для последующих запросов:

  //...your interceptor return { 'request': function (config) { // Get Current JWT var cookieToken = $cookieStore.get('currentToken'); // If Authed, Tack on Auth Token if (cookieToken) { config.headers['Authorization'] = 'Bearer: ' + cookieToken; } return config || $q.when(config); } } //...remainder of interceptor 

4) Добавление промежуточного программного обеспечения для проверки пользователей маркером

 public function handle($request, \Closure $next) { if (! $token = $this->auth->setRequest($request)->getToken()) { return $this->respond('tymon.jwt.absent', 'token_not_provided', 400); } try { $user = $this->auth->authenticate($token); } catch (TokenExpiredException $e) { return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]); } catch (JWTException $e) { return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]); } if (! $user) { return $this->respond('tymon.jwt.user_not_found', 'user_not_found', 404); } return $next($request); } 

важно отметить, что этот код не будет работать для вас, как есть, и просто хотел показать вам, как может выглядеть реализация

Полная рабочая реализация этого метода выходит за рамки ответа stackoverflow, и я предлагаю прочитать это в другом месте в Интернете.

Если оба сайта являются приложениями Laravel, вам может понадобиться только настроить домен cookie в вашей конфигурации.