Laravel,axios:对服务器的第一个登录请求返回奇怪的数据 two_factor: false 而不是 Auth:id()。如何解决?
Posted
技术标签:
【中文标题】Laravel,axios:对服务器的第一个登录请求返回奇怪的数据 two_factor: false 而不是 Auth:id()。如何解决?【英文标题】:Laravel, axios: The first login request to server returns strange data two_factor: false instead of Auth:id(). How to fix it?Laravel,axios:对服务器的第一个登录请求返回奇怪的数据 two_factor: false 而不是 Auth:id()。如何解决? 【发布时间】:2022-01-05 19:48:44 【问题描述】:我想让 axios 返回刚刚登录用户 ID 的响应。当我在 Blade.php 文件中使用 Laravel Fortify 时,一切都太简单了。成功登录后,Fortify 会自动重定向到主页。但是当我开始将 Laravel 与 vue js 和 vuex 一起使用时,我遇到了一个问题。 当我通过 axios.post 发送登录请求时,我收到了一个奇怪的响应,例如
只有在第二个相同的请求之后,我才能从所需的控制器那里得到我需要的东西,在那里我设置了重定向主页值。看看我在下图中的意思。
我发现问题部分与 App\Http\Middleware\RedirectIfAuthenticated.php 类有关
但我还是不知道该怎么办。
这是我的 axios 代码
actions:
login(context,payload)
axios.post('/login',
email: payload.email,
password: payload.password
).then(response =>
console.log(payload.email+" "+payload.password);
console.log(response.data);
if (response.status === 201)
console.log('login')
else
//console.log(response.data)
).catch(error =>
console.log('oops')
);
,
logout()
axios.post('logout').then(response =>
if (response.status === 302 || 401)
console.log('logout')
).catch(error =>
console.log('oops')
);
,
以及成功登录后fortify重定向时必须工作的控制器代码部分。
class UsersProfilesController extends Controller
public function index()
return Auth::id();
在我的情况下,它自第二次登录请求以来重定向。 首先,如果登录值不正确,例如密码不正确,则返回响应状态码 422。但如果用户名和密码正确,则返回我在上面第一个屏幕截图中显示的那个奇怪的代码。
我想知道。我怎样才能从第一个请求中获得重定向,或者如果它无法完成,那么只需获取一个状态码,登录过程就成功了?
【问题讨论】:
【参考方案1】:你的第一个登录请求命中了 LoginResponse 类,它只返回一个包含 two_factor: false 的 json 对象(因为你的请求需要 json)
class LoginResponse implements LoginResponseContract
/**
* Create an HTTP response that represents the object.
*
* @param \Illuminate\Http\Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function toResponse($request)
return $request->wantsJson()
? response()->json(['two_factor' => false])
: redirect()->intended(Fortify::redirects('login'));
当您发出第二个请求时,RedirectIfAuthenticated 中间件会阻止再次点击您的 LoginResponse,因为您已经登录。
<?php
namespace App\Http\Middleware;
use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null ...$guards
* @return mixed
*/
public function handle(Request $request, Closure $next, ...$guards)
$guards = empty($guards) ? [null] : $guards;
foreach ($guards as $guard)
if (Auth::guard($guard)->check())
return $request->wantsJson()
? response()->json(['two_factor' => false])
: redirect(RouteServiceProvider::HOME);
return $next($request);
我猜它会将您的请求传递给您的 UserProfileController。很难说,因为您没有显示您的登录逻辑。您可能应该有一个端点来单独负责您的登录。然后是另一个 api 端点来获取数据,例如您的用户 ID,而不依赖于您的 Vue 应用程序中的重定向。如果您正在开发 SPA,请考虑使用 Laravel Sanctum。
【讨论】:
你给了我有用的信息,但是在强化上下文中的解决方案选项呢,而不是圣所? 这取决于你想要做什么。我不会编写您的登录逻辑,但一个简单的解决方案是在您的 FortifyServiceProvider 中自定义登录响应。它在文档中Customizing Redirects 为了清楚起见。与 Sanctum 合作时,您仍将使用 Fortify。以上是关于Laravel,axios:对服务器的第一个登录请求返回奇怪的数据 two_factor: false 而不是 Auth:id()。如何解决?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 资源控制器 DELETE 使用 Axios 抛出 405