Laravel 5.1 - 尝试使用Auth Boilerplate作为API来防止302 URL重定向

时间:2015-06-22 01:04:59

标签: php laravel laravel-5 laravel-5.1

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

例如,忘记密码电子邮件请求将会消失(并且使用电子邮件模板通过重置链接接收电子邮件),而不是针对该请求的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操作的路由,而只是返回如下的JSON响应,则会发生这种情况:

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

Laravel Routes

+--------+----------+------------------------------+----------------------+-------------------------------------------------------------+------------+
| 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现在返回一个响应并位于AuthController中:

** AuthController中的postEmail覆盖** 这是原始postEmail方法的副本,返回语句中有更改。

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);
    }
}

但是,在AuthController中覆盖了这个和其他(postLogin,postRegister,postReset和getLogout),并且重定向被JSON响应覆盖,由于某种原因,仍然会发生302 URL重定向,就好像我对AuthController所做的更改不是& #39; t被应用。为什么这还没有工作?

4 个答案:

答案 0 :(得分:2)

你可以返回一个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请求。该方法应该解决它,它确实适合我。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

发生这种情况的原因是:

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

答案 3 :(得分:0)

我想我遇到了这个问题。

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