Laravel Passport "auth:api" 中间件充当 "web, auth" 中间件

Posted

技术标签:

【中文标题】Laravel Passport "auth:api" 中间件充当 "web, auth" 中间件【英文标题】:Laravel Passport "auth:api" middleware acts as "web, auth" middleware 【发布时间】:2017-03-23 22:20:26 【问题描述】:

我已经按照官方文档 (https://laravel.com/docs/5.3/passport#introduction) 中的描述为 Laravel 5.3 设置了 Laravel Passport 包。

我希望 API 被移动应用程序使用,因此我正在尝试实现 密码授予令牌。我已经创建了一个密码授予客户端,以及令牌请求过程......

$response = $http->post('http://my-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'username' => 'my@email.com',
        'password' => 'my-password',
        'scope' => '',
    ],
]);

...按预期工作,为我的一个用户返回 access-tokenrefresh-token

一方面,

php artisan route:list

列出 api/user URI 的正确中间件:api,auth:api

并且 api 保护的驱动程序在 config/auth.php 中正确设置为 passport。 总结一下,安装过程的每一步都已经做完了(https://laravel.com/docs/5.3/passport#installation)。

api.php 的默认内容:

Route::get('/user', function (Request $request) 
    return $request->user();
)->middleware('auth:api');

当我访问http://my-app.com/api/user 时出现问题,因为它似乎是使用“web”中间件而不是“api”来验证请求... 当我访问时,如果用户未登录,我将被重定向到 /login(登录表单),如果用户未登录,我将被重定向到 /home...

任何帮助将不胜感激。 提前致谢。

【问题讨论】:

您是否按照 here 的指示使用 X-CSRF-TOKEN 使用您自己的 API 端点? @dargue3。是的,我还在 Kernel.php 中包含了 \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,没有任何改变。但实际上我不想使用 javascript 使用我自己的 API。这是关于从外部移动应用程序使用它,为此我需要密码授予类型方法......我仍然有问题。还有其他想法吗? 【参考方案1】:

解决了!仅作记录,解决方案:

我将请求发送到http://my-app.com/api/user,但 HTTP 标头错误。我正在发送:

Type: Authorization - Content: Bearer: $accessToken 

...正确的方法是:

Type: Authorization - Content: Bearer $accessToken (without colon)

我从没想过这可能是一个错字......无论如何,这个错误并不容易被发现,因为重定向到登录表单从一开始就误导了我。我相信这确实是一种奇怪的行为......

【讨论】:

我知道这是一篇旧帖子,但值得一提的是,在这里添加授权仍然不起作用,您还需要在标题中添加一个 Accept: "application/json" 。这是最新版本的 Laravel 5.5 它可以解决问题,但不是解决方案 好的,我真的很想知道你是如何解决这个问题的。我有同样的未经身份验证的错误。这是帖子……你能看看这个吗? ***.com/questions/56590953/… 评论了你的帖子:)【参考方案2】:

正确的解决方案是从此文件中删除redirectTo()app/http/middleware/Authenticate.php 中验证中间件

【讨论】:

以上是关于Laravel Passport "auth:api" 中间件充当 "web, auth" 中间件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel7 Passport:尝试将请求发送到“api/user”时获取“未定义索引:aud”

Laravel Passport 基本 api 身份验证返回 "error":"invalid_client","message":&quo

Laravel OAuth2 Passport API,生成令牌但无法发出请求:“未经身份验证”

Laravel Passport 得到“无法解析您的密钥,原因:升级到 PHP8.0 后出现“”错误

Laravel 8、Passport 和 MongoDB 集成

无法找到 [Laravel\Passport\Client] 的工厂