Laravel 5.1 - 试图阻止 302 URL 使用 Auth Boilerplate 作为 API 重定向

Laravel 5.1 - Trying to Prevent 302 URL Redirect Using Auth Boilerplate as API

我设置了一个 Ionic 应用程序以将 Laravel 5.1 用作 API。当我尝试使用 Laravel 的样板 AuthController 登录、注册或通过电子邮件发送重置密码 link 时,收到通过 AngularJS ngResource 发送到关联的 RESTful 端点的请求,但它总是会执行 302 URL 重定向以在 return 来自不同发起者的 200 响应之前加载视图,并出现与未找到视图相关的错误,我可以看到发生在 Chrome 的网络选项卡(见下面的输出)。我希望不会找到该视图,因为我将 Laravel 用作 API,并且除了电子邮件模板外没有其他视图。我想做的是删除重定向。

例如,忘记密码的电子邮件请求会发出(并且使用电子邮件模板通过重置 link 收到电子邮件),而不是对该请求的 JSON 响应 URL 发生重定向(代码 302),然后响应 200 并显示未找到视图的错误:

** 错误响应 **

Sorry, the page you are looking for could not be found. 
NotFoundHttpException in RouteCollection.php).

Chrome 控制台 - 网络选项卡

Name        Status Type         Initiator                               Size  Time
forgot      302    text/html    ionic.bundle.js:18526                   614 B   2.38 s  
localhost   200    xhr          http://project.dev/api/password/forgot  2.3 KB  2.00 ms 

我期望的是:

Name        Status Type         Initiator                               Size  Time
forgot      200    text/html    ionic.bundle.js:18526                   614 B   2.38 s  

如果我使用不使用 AuthController 操作的路由,而只是 returns 一个 JSON 响应,则会发生这种情况:

Route::post('email', function () {
    return response()->json([ 'message' => 'Send an email!' ], 200);
});

Laravel 路线

+--------+----------+------------------------------+----------------------+-------------------------------------------------------------+------------+
| Domain | Method   | URI                          | Name                 | Action                                                      | Middleware |
+--------+----------+------------------------------+----------------------+-------------------------------------------------------------+------------+
|        | GET|HEAD | test                         |                      | Closure                                                     |            |
|        | POST     | api/auth/login               |                      | Project\Http\Controllers\Auth\AuthController@postLogin     | guest      |
|        | GET|HEAD | api/auth/logout              |                      | Project\Http\Controllers\Auth\AuthController@getLogout     |            |
|        | POST     | api/auth/register            |                      | Project\Http\Controllers\Auth\AuthController@postRegister  | guest      |
|        | POST     | api/password/forgot          |                      | Project\Http\Controllers\Auth\PasswordController@postEmail | guest      |
|        | POST     | api/password/reset           |                      | Project\Http\Controllers\Auth\PasswordController@postReset | guest      |
+--------+----------+------------------------------+----------------------+-------------------------------------------------------------+------------+

所以我查看了不同的 Auth 相关 类 和特征,并在一些帮助下发现我可以通过将它们添加到 AuthController 来覆盖 postLogin、postRegister、postEmail、postReset 和 getLogout 路由。因此,例如 postEmail 现在 return 是一个响应并且位于 AuthController:

** AuthController 中的 postEmail 覆盖** 这是原始 postEmail 方法的副本,在 return 语句中进行了更改。

public function postEmail(Request $request)
{
    $this->validate($request, [ 'email' => 'required|email' ]);

    $response = Password::sendResetLink($request->only('email'), function (Message $message) {
        $message->subject($this->getEmailSubject());
    });

    switch ($response) {
        case Password::RESET_LINK_SENT:
            return response()->json([ 'message' => trans($response) ], 200);

        case Password::INVALID_USER:
            return response()->json([ 'message' => trans($response) ], 400);
    }
}

但是,由于这个和其他(postLogin、postRegister、postReset 和 getLogout)在 AuthController 中被覆盖,并且重定向被 JSON 响应覆盖,出于某种原因 302 URL 重定向仍然就好像我对 AuthController 所做的更改没有被应用一样。为什么这仍然不起作用?

您可以 return 一个 json 回复。

public function register()
{
    // do what ever to register the user
    // then just return a json response

    return response()->json([
        'message' => 'user was registered'
    ]);
}

编辑:

将此方法添加到 Http\Requests\Request:

public function response(array $errors)
{
    return new JsonResponse($errors, 422);
}

我认为 Laravel 5.1 中可能存在错误,它将每个请求作为常规请求处理,而不是 ajax 请求。那个方法应该可以解决它,它对我有用。

您可以覆盖 Illuminate\Foundation\Auth\RedirectsUsers 特征的 redirectPath 方法。

public function redirectPath()
{
    return response()->json([
        'msg' => 'your custom message'
    ]);
}

发生这种情况的原因是:

  1. postEmail 和 postReset 函数不属于我不小心将它们粘贴到 postLogin 和 postRegister 旁边的 AuthController 中,它们属于 PasswordController (yeesh)
  2. 在将原始方法的副本放入控制器以覆盖并将重定向更改为 JSON 响应后,两个控制器都缺少一些依赖项
  3. 还必须删除 AuthController 中的构造函数中的来宾中间件,以防止在身份验证时重定向到 /home

现在我没有再发生 302 URL 重定向,而且我更聪明了......? :)

我想我遇到了这个问题。

请注意,在 app/Http/Kernel.php 中加载了一个名为 RedirectIfAuthenticated 的中间件。它包含有关重定向到家庭控制器的逻辑。评论一下就搞定了