如何使用Laravel API身份验证返回未授权

时间:2019-05-01 18:59:38

标签: laravel api

我正在使用带令牌的Laravel API身份验证。 (如此处所述: https://laravel.com/docs/5.8/api-authentication#protecting-routes

我正在与Postman进行一些测试,并且工作正常。当我尝试在没有有效令牌的情况下访问路由时,我看到响应是我应用程序的(登录页面的html)。如何返回Unauthorized消息而不是完整的登录页面?我必须创建自定义中间件吗?

控制器

class ExampleController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api');
    }

    public function show(Request $request) {
        return response()->json($request->user()->name);
    }
 }

3 个答案:

答案 0 :(得分:1)

请确保在您的请求中发送正确的标题

Content-Type: application/json

答案 1 :(得分:1)

请在文件位置app / Exceptions / Handler.php中的Handler类中添加该方法

/**
 * Convert an authentication exception into an unauthenticated response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Illuminate\Auth\AuthenticationException  $exception
 * @return \Illuminate\Http\Response
 */
protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    return redirect()->guest(route('login'));
}

并在与上述相同的文件中的类上方添加以下行: 使用Illuminate \ Auth \ AuthenticationException;

在标题部分的邮递员中,添加以下标题: X-Requested-With:XMLHttpRequest

希望这有助于解决该问题。谢谢。

答案 2 :(得分:1)

Laravel 8 更新:

默认处理程序已经处理了这种情况

文件:\Illuminate\Foundation\Exceptions\Handler.php

/**
 * Convert an authentication exception into a response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Illuminate\Auth\AuthenticationException  $exception
 * @return \Symfony\Component\HttpFoundation\Response
 */
protected function unauthenticated($request, AuthenticationException $exception)
{
    return $request->expectsJson()
                ? response()->json(['message' => $exception->getMessage()], 401)
                : redirect()->guest($exception->redirectTo() ?? route('login'));
}

这就是 Laravel 在 expectsJson 中做 \Illuminate\Http\Concerns\InteractsWithContentTypes.php 的方式

/**
 * Determine if the current request probably expects a JSON response.
 *
 * @return bool
 */
public function expectsJson()
{
    return ($this->ajax() && ! $this->pjax() && $this->acceptsAnyContentType()) || $this->wantsJson();
}


/**
 * Determine if the current request is asking for JSON.
 *
 * @return bool
 */
public function wantsJson()
{
    $acceptable = $this->getAcceptableContentTypes();

    return isset($acceptable[0]) && Str::contains($acceptable[0], ['/json', '+json']);
}

所以请注意,请求的内容类型标头是无用的。有用的标头是“Accept: application/json”