使用 laravel 和 laravel 护照创建 API 的问题
Issue with creating an API with laravel and laravel passport
我正在尝试使用 Laravel 护照开始一个简单的 API。
我正在关注 this tutorial
我已经成功完成了它,但是当我尝试在浏览器中访问“http://localhost:8000/api/CEO”而不指定不记名令牌时,出现错误:
Symfony\Component\Routing\Exception\RouteNotFoundException Route [login] not defined.
现在我明白需要不记名令牌来验证请求,但我如何验证 api 请求是否有令牌?如果他们不这样做,则显示错误。而不是重定向到不存在的登录页面。
api.php中的“auth:api”中间件对应App/Http/Middleware/Authenticate.php
.
(这可以通过检查 App/Http/Kernel.php
中的 $routeMiddleware 来验证)
在这个中间件中我们检查:
if (! $request->expectsJson()) { return route('login'); }
将 return 更改为
return abort(502, 'Invalid request');
而是显示错误。
如果您查看 laravel git 存储库,您会发现 Authenticate.php
中间件:https://github.com/laravel/laravel/blob/8.x/app/Http/Middleware/Authenticate.php
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string|null
*/
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
return route('login');
}
}
你这边发生的事情是你在你的请求 Accept: application/json
中遗漏了一个非常重要的 header,因此 Laravel 正试图重定向到未定义的登录页面在你的 api.php
路线中。
只需通过添加 header 使用邮递员或类似的东西点击您的端点,您将收到一条 Unauthenticated
错误消息。
如果您想从浏览器中打开 URL,您还可以添加一个中间件来处理请求和 return 401
错误消息。
我制作了自己的中间件,将 URL 发送的令牌附加到我的请求 headers。
如果 URL 中不存在令牌,则通过抛出 401
错误
中止
<?php
namespace App\Http\Middleware;
use Closure;
class ParseTokenFromUrl
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->has('access_token') && !$request->headers->get('Authorization')) $request->headers->set('Authorization', 'Bearer ' . $request->get('access_token'));
if (!$request->headers->get('Authorization')) abort(401);
return $next($request);
}
}
我正在尝试使用 Laravel 护照开始一个简单的 API。
我正在关注 this tutorial
我已经成功完成了它,但是当我尝试在浏览器中访问“http://localhost:8000/api/CEO”而不指定不记名令牌时,出现错误:
Symfony\Component\Routing\Exception\RouteNotFoundException Route [login] not defined.
现在我明白需要不记名令牌来验证请求,但我如何验证 api 请求是否有令牌?如果他们不这样做,则显示错误。而不是重定向到不存在的登录页面。
api.php中的“auth:api”中间件对应App/Http/Middleware/Authenticate.php
.
(这可以通过检查 App/Http/Kernel.php
中的 $routeMiddleware 来验证)
在这个中间件中我们检查:
if (! $request->expectsJson()) { return route('login'); }
将 return 更改为
return abort(502, 'Invalid request');
而是显示错误。
如果您查看 laravel git 存储库,您会发现 Authenticate.php
中间件:https://github.com/laravel/laravel/blob/8.x/app/Http/Middleware/Authenticate.php
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string|null
*/
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
return route('login');
}
}
你这边发生的事情是你在你的请求 Accept: application/json
中遗漏了一个非常重要的 header,因此 Laravel 正试图重定向到未定义的登录页面在你的 api.php
路线中。
只需通过添加 header 使用邮递员或类似的东西点击您的端点,您将收到一条 Unauthenticated
错误消息。
如果您想从浏览器中打开 URL,您还可以添加一个中间件来处理请求和 return 401
错误消息。
我制作了自己的中间件,将 URL 发送的令牌附加到我的请求 headers。
如果 URL 中不存在令牌,则通过抛出 401
错误
<?php
namespace App\Http\Middleware;
use Closure;
class ParseTokenFromUrl
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->has('access_token') && !$request->headers->get('Authorization')) $request->headers->set('Authorization', 'Bearer ' . $request->get('access_token'));
if (!$request->headers->get('Authorization')) abort(401);
return $next($request);
}
}