@page404

Как осуществить авторизацию пользователя с другого сайта?

есть два сайта . один получает все данные от сайта 2 (апи) т.к. БД одна с которой соединен сайт2.
На сайте 1 пользователь вводит в форму логин пароль, чтобы войти на сайт1 - сайт1 посылает запрос на сайт 2 с данными введенными пользователем (логин, пароль) на соответствующий апи роут - тот в свою очередь вызывает контроллер в котором происходит поиск в БД пользователя с такими данными и если он есть то отправляет ответ сайту 1 (тру фолс или что потребуется). (на Laravel 5...)

сайт1:
web.php

Route::post('/login','HomeController@login')->name('login');


HomeController.php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client as GuzzleClient;

class HomeController extends Controller
{   
    public function login(Request $request)
    {
            $email = $request->email;
            $pass = $request->password;
       
             $client = new GuzzleClient([
                                                         'base_uri' => 'http://site1/api/',  
                                                       ]);
             $responce = $client->request('POST', 'login', [
   'headers' => [
    ???? - и обязательно ли ?     
                         ],
    'form_params' => [  
     'data_form' => [
      'email' => $email, 
   'password'=>$pass
     ]
      ]);

        $body = $responce->getBody();
          dd($body->getContents());

    }


сайт2
api.php

Route::post('login', 'ApiController@login');

ApiController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;

class ApiController extends Controller
{
    public function login(Request $request)
    {
         $emailUser = trim($request->data_form['email']);
         $passUser =trim($request->data_form['password']);

            $userFrom = User::where('email',$emailUser)->get();
        
            dd($userFrom->id);
    }


вылазит ошибка:
Server error: `POST site2/api/login` resulted in a `500 Internal Server Error` response: ......Illuminate\Database\QueryException: SQLSTATE[HY000] [1049] Unknown database 'laravel' (S (truncated...)
т.е. пытается запрос сделать сайт1 в своей БД( если изменить БД в сайте 1 в .env на БД сайта 2 все ок).

Почему так происходит? получается что как бы сайт 1 использует только код который на сайте 2 чтобы залезть в свою БД. А мне надо чтобы сайт 1 отдал данные и ждал ответа от сайта 2 (на котором будет происходить проверка и подобное)
в чем ошибка?
  • Вопрос задан
  • 146 просмотров
Пригласить эксперта
Ответы на вопрос 1
agoalofalife
@agoalofalife
Team Lead
Ошибка может быть в разных местах, тут мы не располагаем всей информации, получается можно высказать только предположения.
- Ошибка в конфигурационных файлах. Проверьте что в ваших файлах .env или в config/database.php соответствует все параметры.
- Проверьте что база(на которую вы возлагаете надежды) существует, и доступна любым другим способом(через терминал) по тем параметрам которые указываете в конфиг файлах.

На счет кода
Не знаю какой версии Laravel вы пользуетесь но trim есть уже с версии 5.4 документация

Guzzle можно для начала получить из контейнера в методе login и настроить в service provider.
Переменные можно не создавать а сразу передать куда надо, раз нет нужды в этом.
$email = $request->email;
    $pass = $request->password;

Здесь такая же история, snakecase это плохая практика, и создавать дополнительную вложенность в св-ах тоже нет необходимости.
$emailUser = trim($request->data_form['email']);
 $passUser =trim($request->data_form['password']);


Касательно задачи
На сайте 1, который у вас клиент, надо будет дополнительно организовать middleware, для проверки session или можно написать свои кастомный user provider, документация
Так же подумайте а будут ли у вас еще клиенты и возможно потребуется организовать какой-нибудь центральный сервис аутентификации.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы