总是为我的 Laravel Passport 生成的 OAuth 2 令牌响应 401(未授权)

Posted

技术标签:

【中文标题】总是为我的 Laravel Passport 生成的 OAuth 2 令牌响应 401(未授权)【英文标题】:Always response 401 (Unauthorized) for my Laravel Passport generated OAuth 2 token 【发布时间】:2018-07-22 22:15:06 【问题描述】:

我正在使用:

用于 REST 检查的 Postman/Insomnia 带有 Laravel Passport 的 Laravel 5.6 Vagrant (Apache 2, php 7.2)

为 Laravel Passport 制作了 Laravel Docs 中描述的所有清单,在某些步骤之后,我收到了 HTTP 401 作为我的有效 OAuth 访问令牌。

    由 /oauth/token/ 请求带有 client_id 和 client_secret 的新访问令牌。 使用收到的访问令牌来授权我的简单 Laravel REST 测试控制器和包含的 Oauth api 中间件。 结尾是一:401未授权:(

所以,这是我的一些配置:

阿帕奇

api 路由

内核.php

PassportServiceProvider.php

AuthServiceProvider.php

【问题讨论】:

为什么要分享屏幕截图?您可以在答案中添加代码。 @MASh 抱歉,我认为该屏幕截图比代码 sn-p 更直观,便于理解。 那你在错误的宇宙中。 【参考方案1】:

我也有类似的问题:

您的代码和我的代码之间的区别: 在routes/api.php 中,我只使用了auth:api。 我没有在 app 文件夹中创建 PassportServiceProvider.php。 在Kernel.php 我的是client 而不是client_credentials

我在 POST 请求调用中将 client_credentials 用作 grant_type。 结果我总是得到 401。

直到我使用密码授予客户端创建用户:

php artisan passport:client --password

并在 POST 请求调用中将 client_credentials 更改为 password

$http = new GuzzleHttp\Client;

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

$access_token = json_decode((string) $response->getBody(), true)['access_token']; 

将返回的访问令牌放入 headers 的 Bearer 中,它就可以工作了。 你也可以使用$request->user();获取当前用户

如果你使用client_credentials作为grant_type,是通过客户端中间件,所以中间件中的auth:api需要去掉。

【讨论】:

【参考方案2】:

这是因为默认情况下 Apache 不会将授权标头传递给 PHP。您需要编辑您的 Apache 站点配置以在 Deskpro 的指令中添加一行。注意这个配置必须直接添加到Apache的配置中(例如,添加到htaccess中是行不通的

<VirtualHost>
# ...
    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
# ...

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 Read this. 这是一个很好的答案,对我有帮助。一切都在实时服务器上运行,它在我的本地系统上不起作用。因此,这只能归因于开发环境。这应该包含在 Laravel 文档中。 见laravel.com/docs/8.x/authentication #A Note On FastCGI

以上是关于总是为我的 Laravel Passport 生成的 OAuth 2 令牌响应 401(未授权)的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Passport 没有身份验证

Laravel Passport API 注册新用户

不断收到 401 未经授权的“无效凭据”Laravel Passport

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

404 - 未找到存在 Laravel 8 的 Passport Api 路由

Laravel Passport invalid_grant 用于密码 grant_type