首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel Passport -使用javascript 401未经身份验证使用自己的api

Laravel Passport -使用javascript 401未经身份验证使用自己的api
EN

Stack Overflow用户
提问于 2019-07-07 19:59:57
回答 2查看 1.3K关注 0票数 3

我希望你做得很好。几天来,我一直在努力使用Laravel,试图使用javascript / vuejs来使用我自己的api。最后一天晚上,我几乎阅读了所有关于我的问题的帖子,但我找不到任何解决办法。我希望你能帮我,谢谢你。

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

代码语言:javascript
复制
axios.get('/oauth/clients')
    .then(response => {
    console.log(response);
    }).catch(error => {
    console.log(response);
    })

当我登录时,它工作得很好,当我使用一个承载令牌并使用邮递员测试‘/oauth/客户’时,它也可以正常工作,但是当我没有登录时,它总是返回401未经身份验证。我的目标是创建一个api,该api可以作为未经身份验证的用户使用,而不需要承载令牌,但不能从外部使用。我认为是正确的方法。

我的请求标题:

代码语言:javascript
复制
: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=

响应头:

代码语言:javascript
复制
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

重要注意事项:我和我的一个朋友分享了这个项目,他和Laravel一起在一个码头容器中工作,授权在他的设备上工作,没有任何改变。我在一台窗户机器上运行着拉勒维尔·霍姆斯特德。这个问题是由引起的吗?

EN

回答 2

Stack Overflow用户

发布于 2019-07-08 04:50:54

路由'oauth/clients‘是使用'web’和'auth‘中间件在'oauth’前缀(例如/oauth/任意路由)下定义的。这解释了为什么当您没有登录时会收到401错误,因为'auth‘中间件正在失败。

/vendor/laravel/passport/src/RouteRegistrar.php

代码语言:javascript
复制
 /**
 * 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‘也略有不同。

/routes/api.php

代码语言:javascript
复制
Route::middleware(['auth:api'])->group(function () {
    Route::get('/your/path', 'Api\YourController@index');
});

然后在邮递员中,只需传递您的无记名令牌和预期响应类型。不要忘记在路由中添加'api‘前缀,就像您将对api.php路由文件中的所有路由所做的那样。

/api/your/path

代码语言:javascript
复制
Authorization   Bearer {your_token}
Accept          application/json

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

票数 3
EN

Stack Overflow用户

发布于 2019-07-08 11:29:14

谢谢你的回答@matticustard。我编写了一个小型控制器来测试授权,并使用auth:api中间件将路由分组如下:

代码语言:javascript
复制
Route::group(['prefix' => 'v1', 'middleware' => 'auth:api', 'namespace' => 'Api\v1', 'as' => 'api.'], function () {});

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

代码语言:javascript
复制
axios.get('/api/v1/test')
    .then(response => {
    console.log(response);
    }).catch(error => {
    console.log(response);
    })

谢谢你抽出时间:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56925675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档