使用 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 Passport Route [login] not defined