我正在使用带令牌的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);
}
}
答案 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”