当前位置: 首页 > 知识库问答 >
问题:

Laravel Passport-消费你自己的api与javascript 401未经认证

姜志
2023-03-14

我希望你一切都好。我挣扎了几天,因为Laravel护照,试图用javascript/vuejs消耗我自己的api。最后一个晚上,我几乎阅读了所有关于我问题的帖子,但我找不到任何解决办法。我希望你能帮助我,在这一点上谢谢你。

我已经建立了一个新的laravel应用程序,并安装了Laravel Passport,就像在Laravel 5.8(https://laravel.com/docs/5.8/passport#introduction)的官方文档中描述的那样。我已经在不同的应用程序中多次完成了教程中的每一点,但没有任何成功。为了测试我的设置,我使用这个小axios请求。

axios.get('/oauth/clients')
    .then(response => {
    console.log(response);
    }).catch(error => {
    console.log(response);
    })

当我登录时,它可以正常工作,当我使用承载令牌并使用postman测试“/oauth/clients”时,它也可以正常工作,但当我没有登录时,它总是返回401个未经验证的消息。我的目标是创建一个api,作为未经身份验证的用户,我可以从自己的应用程序中使用该api,而无需使用承载令牌,但不能从外部使用。我认为拉威尔护照是正确的方法。

我的请求标题:

:authority: laravel.dev
:method: GET
:path: /oauth/clients
:scheme: https
accept: application/json, text/plain, */*
accept-encoding: gzip, deflate, br
accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7
cache-control: no-cache
cookie: XSRF-TOKEN=eyJpdiI6IkxTTGs2cEtvbXc5cmhIZDhEV1lBXC9nPT0iLCJ2YWx1ZSI6IlpPcjdCbmlDcURraG03MndjUTVYeTV1WXl1YWx3MVdNWjFrZ1QrRENJcnlhZVVCNWtZdzl5VDN6ZjdkclBGK0siLCJtYWMiOiI3ZmQ4YjlkZmU3OWMyNjNiYWVhNzJhMWVkOGRhOGJhMzJkNWQwZmZjMDhmZDM2Y2IxYWRkODJiNzFhNmQ5NDA1In0%3D; laravel_session=eyJpdiI6IlpKc3EyS2R4NjAyM0t5XC8xaTR6SjJBPT0iLCJ2YWx1ZSI6Im1JRlRReVFHQ01jTlNQT3BkYlI1V0dNeE1BMkVvODhnWXNjM1VPRUFBRWRBRnl1N1diUmpOSkVJUmc0NTdsVFgiLCJtYWMiOiI0ZTZkNzE2OGQ5MzJkY2FmYzEzOWZiYjA3YTRiM2MxOGQ3OGJmNWIzMTI4ODA5MDMxYWVlMjJmOTk1M2FjZDdlIn0%3D
pragma: no-cache
referer: https://laravel.dev/
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
x-csrf-token: 4Opsva9oDk6LkAapLGqqh9AuPzWKfVH4PYoxcMB1
x-requested-with: XMLHttpRequest
x-xsrf-token: eyJpdiI6IkxTTGs2cEtvbXc5cmhIZDhEV1lBXC9nPT0iLCJ2YWx1ZSI6IlpPcjdCbmlDcURraG03MndjUTVYeTV1WXl1YWx3MVdNWjFrZ1QrRENJcnlhZVVCNWtZdzl5VDN6ZjdkclBGK0siLCJtYWMiOiI3ZmQ4YjlkZmU3OWMyNjNiYWVhNzJhMWVkOGRhOGJhMzJkNWQwZmZjMDhmZDM2Y2IxYWRkODJiNzFhNmQ5NDA1In0=

响应报头:

cache-control: no-cache, private
content-type: application/json
date: Sun, 07 Jul 2019 19:05:25 GMT
server: nginx/1.15.5
set-cookie: XSRF-TOKEN=eyJpdiI6IklTWEkrRTJxYXpiRFNQUm0zM3RLYWc9PSIsInZhbHVlIjoiMDEzSmVlMldQOXBrVUQxQjlCUGVVN2dpUk9VWmwrUlRjend3XC9CaUk1S2V6dUFlTDZtVWttREV5cVBPOFwveVQ0IiwibWFjIjoiZWZhMzA3OGVhYmY2NWNjNjgyMTg4NzAxZjQzNWYxZGQyMjVmMWY3MjAwNjllZTM5ODFiNjFiNWY1NGFjOGM0NiJ9; expires=Sun, 07-Jul-2019 21:05:25 GMT; Max-Age=7200; path=/
set-cookie: laravel_session=eyJpdiI6IlFLUDN0bGhBNW1UTytlbGgrcEZ0ekE9PSIsInZhbHVlIjoibHFvM09CSTFyZ05Kd0E0REVCekNOYmRocm01cnBVY3h1YjFOaXpyTXVcL05QSTNYdFFBdVpXZHd4NDVURGwralwvIiwibWFjIjoiYzM0ZWNhNzQ5MTJhY2VmNTZjZmM1YjFiNTgzYjU0NmZhZGIzZjVjYTFkOGNjYWEwNDEwODUyMzc5OWI2Njc3YiJ9; expires=Sun, 07-Jul-2019 21:05:25 GMT; Max-Age=7200; path=/; httponly
status: 401

重要提示:我已经和我的一个朋友分享了这个项目,他在Docker容器中使用Laravel在MacOS上工作,授权在他的设备上工作,没有任何变化。我正在运行一个Windows机器与Laravel家园。这个问题可能是由Laravel家园或nginx引起的吗?

共有2个答案

班经亘
2023-03-14

感谢您的回答@matticustard。我已经编写了一个小型控制器来测试授权,并使用auth:api中间件将路由放在以下组中:

Route::group(['prefix' => 'v1', 'middleware' => 'auth:api', 'namespace' => 'Api\v1', 'as' => 'api.'], function () {});

当我使用承载令牌和邮递员时,它工作正常,但是我想使用这个路由也从我的应用程序作为一个没有登录的用户。但只从我的应用程序而不是从外部,我如何才能实现这一点?

axios.get('/api/v1/test')
    .then(response => {
    console.log(response);
    }).catch(error => {
    console.log(response);
    })

感谢您抽出时间:)

裴彦
2023-03-14

使用web和auth中间件在oauth前缀(例如, /oauth/any-route)下定义oauth/客户端路由。这解释了为什么当您没有登录时会收到401错误,因为“授权”中间件失败了。

/供应商/laravel/passport/src/RouterRegistrar。php

 /**
 * Register the routes needed for managing clients.
 *
 * @return void
 */
public function forClients()
{
    $this->router->group(['middleware' => ['web', 'auth']], function ($router) {
        $router->get('/clients', [
            'uses' => 'ClientController@forUser',
            'as' => 'passport.clients.index',
        ]);

        ...
    });
}

此外,您不应该在API路由中使用“web”中间件。API是无状态的,不应接收或响应任何会话数据。这意味着不需要CSRF/XSRF令牌,我可以看到在您的示例中正在传输这些令牌。

您需要将API路由放置在指定的API路由文件中。您会注意到,对于API路由,授权中间件auth: api也略有不同。

/路线/空气污染指数。php

Route::middleware(['auth:api'])->group(function () {
    Route::get('/your/path', 'Api\YourController@index');
});

然后在邮递员中,简单地传递您的承载令牌和预期的响应类型。不要忘记在路由中添加api前缀,就像在api.php路由文件中对所有路由所做的那样。

/api/your/path

Authorization   Bearer {your_token}
Accept          application/json

希望这有帮助,祝你好运!

 类似资料:
  • 问题内容: 我正在开发一个Laravel 4应用,该应用将通过JSON REST API和Web UI对数据集进行相同的CRUD操作。为了防止违反DRY原则,我的UI应该通过将所有请求从UI路由回API来使用我自己的API。我不确定如何使这项工作的最佳方法。大概我将拥有单独的UI和API控制器,并以某种方式路由请求。还是我应该完全采用另一种方法? 谢谢。 问题答案: 我实际上是在修改相同的想法,而

  • 我最近开始学习Kafka,最后就问了这些问题。 > 消费者和流的区别是什么?对我来说,如果任何工具/应用程序消费来自Kafka的消息,那么它就是Kafka世界中的消费者。 流与Kafka有何不同?为什么需要它,因为我们可以使用消费者API编写自己的消费者应用程序,并根据需要处理它们,或者将它们从消费者应用程序发送到Spark? 我做了谷歌对此,但没有得到任何好的答案。抱歉,如果这个问题太琐碎了。

  • 注意:我在这个问题上得到了4个赏金,但下面的投票结果都不是这个问题所需要的答案。所需的一切都在下面的更新3中,只是在寻找要实现的Laravel代码。 更新3:此流程图正是我尝试完成的流程,下面的所有内容都是原始问题,带有一些较旧的更新。此流程图总结了所需的一切。 下面流程图中的绿色部分是我知道该怎么做的部分。红色部分及其旁注是我正在寻找使用 Laravel代码完成的帮助。 我做了很多研究,但是当涉

  • 开源项目有时因为缺少文档和支持被批判. FreeRADIUS在提供合适的文档跟提供帮助的方式上做了一个好的榜样. 安装的文档 有许多文档, 随着FreeRADIUS一起安装. 以manpages的形式, 在配置文件中的注释, 许多README文件, 和RFC文件. Man pages 你可能不确定作为FreeRADIUS安装的一部分有哪些manpages. 下面一节将会展示给你如何你来发现这些.

  • The Consumer API allows applications to read streams of data from topics in the Kafka cluster. Examples showing how to use the consumer are given in the javadocs. To use the consumer, you can use the

  • 是否有一种方法以编程方式访问和打印使用者滞后偏移,或者说使用者读取的最后一条记录的偏移与某个生产者写入该使用者分区的最后一条记录的偏移之间的位置差。 要知道我的最终目标是将这个值发送到prometheus进行监视,我应该在上面添加哪些语句来得到滞后偏移值?