Laravel Passport-使用未经授权的javascript 401使用自己的API

时间:2019-07-07 19:59:57

标签: laravel laravel-5 laravel-passport

我希望你一切都好。自从使用Laravel Passport几天以来,我一直在努力,试图用javascript / vuejs消耗我自己的api。过去的傍晚花了很多时间阅读有关我的问题的所有现有帖子,但是我找不到任何解决方案。希望您能帮助我,谢谢您。

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

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

当我登录时,它工作正常,当我使用承载令牌并使用邮递员测试'/ oauth / clients'时,它也很好,但是当我未登录时,它总是返回401 Unauthenticated。我的目标是创建一个api,我可以以未经身份验证的用户身份从我自己的应用程序使用它,而无需持有者令牌,但不能从外部使用。我认为Laravel Passport是正确的方法。

我的请求标头:

: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一起在MacO上工作,并且授权在他的设备上工作而没有任何更改。我在Laravel Homestead的Wi​​ndows机器上运行。这个问题可能是Laravel Homestead或nginx引起的吗?

2 个答案:

答案 0 :(得分:1)

使用“ web”和“ auth”中间件在“ oauth”前缀(例如,/ oauth / any-route)下定义了路由“ oauth / clients”。这说明了为什么未登录时会收到401错误,因为“身份验证”中间件失败了。

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

<table>
    <tbody>
        <tr>
            <td>
                <font size="28">td</font>
            </td>
        </tr>
    </tbody>
</table>

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

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

/routes/api.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',
        ]);

        ...
    });
}

然后在Postman中,只需传递您的不记名令牌和预期的响应类型。并且不要忘记在路由中添加“ api”前缀,就像对api.php路由文件中的所有路由一样。

/ api /您的路径/

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

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

答案 1 :(得分:0)

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

resolve

当我使用不记名令牌和邮递员时,它可以正常工作,但我也想以未登录用户的身份在我的应用程序中使用此路由。但是,仅从我的应用程序而不是外部,我如何才能实现此目的?

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

谢谢您的时间:)