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

CORS 块 Laravel + VueJS Axios

Laravel 7 Vue 2 Sanctum 登录错误 419; CSRF 令牌不匹配

无法使用 axios 向 Laravel 应用程序发帖

在 vuex 中登录操作后向 axios 请求添加标头令牌

(axios) HTTP POST 请求两分钟后失败,Laravel 5 + VueJS