Мне нужно создать auth с любых страниц через ajax. Если я пришлю неправильный логин и пустой проход (или наоборот), будут возвращены ошибки json (это нормально). Если я пришлю неправильный логин и неверный пароль (или правильный логин и путь), будет перенаправлен возврат.
Как изменить backend для получения ответа json?
мой код интерфейса js:
$("#authform").submit(function(e) {
e.preventDefault();
$.post($(this).attr("action"), $(this).serialize(), function(data) {
console.log(data);
}, "json");
});
HTML:
<form id="authform" method="POST" action="{{ url('/auth/login') }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<input type="email" name="email" value="{{ old('email') }}">
<input type="password" name="password">
<input type="checkbox" name="remember">
<button type="submit">Login</button>
</form>
routes.php:
Route::post('auth/login', 'Auth\AuthController@postLogin');
Я уверен, что есть лучшее решение этой проблемы, но я сделал следующее:
Route::post('/login', 'Auth\AuthController@signIn');
В App\Http\Controllers\Auth\AuthController
я добавил два новых метода:
public function signIn(Request $request) {
$this->validateLogin($request);
$throttles = $this->isUsingThrottlesLoginsTrait();
if ($throttles && $lockedOut = $this->hasTooManyLoginAttempts($request)) {
$this->fireLockoutEvent($request);
return $this->sendLockoutResponse($request);
}
$credentials = $this->getCredentials($request);
if (Auth::guard($this->getGuard())->attempt($credentials, $request->has('remember'))) {
return $this->handleUserWasAuthenticated($request, $throttles);
}
if ($throttles && ! $lockedOut) {
$this->incrementLoginAttempts($request);
}
return $this->sendFailedLoginResponseJSON($request);
}
А ТАКЖЕ
protected function sendFailedLoginResponseJSON(Request $request)
{
return response()->json(['username' => $this->getFailedLoginMessage()], 422);
}
Он в основном такой же, как метод входа в систему из AuthenticatesAndRegistersUsers
, за исключением последней строки, метод входа использует
protected function sendFailedLoginResponse(Request $request)
{
return redirect()->back()
->withInput($request->only($this->loginUsername(), 'remember'))
->withErrors([
$this->loginUsername() => $this->getFailedLoginMessage(),
]);
}
который отправляет обратно перенаправление с ошибкой.
Если вы хотите как ajax, так и не-ajax, вы можете сделать
if($request->ajax()){
return $this->sendFailedLoginResponseJSON($request);
}
return $this->sendFailedLoginResponse($request);
в новом методе знака.
Это не ответ. Сначала попробуйте это, тогда мы должны
$('#authform').on('submit',function(e) {
e.preventDefault();
$.ajax({
type: 'POST',
cache: false,
dataType: 'JSON',
url: $(#authform).attr("action"),
data: $('#authform').serialize(),
success: function(data) {
console.log(data);
},
});
return false;
});
И вы пробовали эту ссылку Как создать логин AJAX с Laravel