Laravel 5.3 Passport路由使用web中间件。

3

Laravel 5.3的Passport组件看起来很酷,但我有一些困惑。

根据文档,Passport在API身份验证下,当设置config/auth.php时,会将guards 'api'的驱动程序更改为“passport”。

Laravel 5.3具有web.php和api.php以区分路由组使用web中间件还是api中间件。

安装Passport后,需要将Passport:routes()添加到AuthServiceProvider。当我运行route:list时,它将显示新路由都使用web和auth中间件。

我的问题是这些passport路由为什么要使用web中间件?我理解Passport应该用于无状态API身份验证,但web中间件不是。

2个回答

1

我似乎解决了这个问题。

我做的第一件事是从这里https://github.com/barryvdh/laravel-cors添加并配置CORS中间件。

然后我通过编辑app/Providers/AuthServiceProvider.php将Passport路由包装在一个路由组中。

/** 
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{   
    $this->registerPolicies();

    Route::group(['prefix' => 'api', 'middleware' => 'cors'], function() {

        Passport::routes();

    }); 
}

理论上,如果您想在API之外使用oauth服务,您可以有两个Passport路由实例,一个带有/api前缀和cors中间件,另一个没有,这样在浏览器中使用oauth时就不会失去跨域保护。

不幸的是,那对我没有任何帮助。它只是将中间件添加到已有的中间件列表中。所以,我没有将中间件从“web,auth”更改为“cors”,而是得到了“cors,web,auth”。在应该进行身份验证的东西上进行身份验证似乎有点太过分了 :-) - rm-

1

我之前也遇到了这个问题,直到意识到我对Passport工作原理的理解是错误的。

Passport的作用是在用户同意的情况下向客户端应用程序授予用户数据(这就是OAuth2的工作原理)。因此,当客户端应用程序尝试获取最终授予该用户数据访问权限的访问令牌时,必须获得该用户的同意。Web中间件充当接受该用户同意的层。为了签署同意书,用户必须先登录,否则无法证明它是实际用户。

为了更好地理解,请考虑一个场景,您的应用程序正在尝试实现“使用Google登录”的功能。您在登录页面上放置一个重定向到Google的按钮,在重定向后,用户登录到他们的Google帐户,签署同意书,并通过授权代码被重定向回您的应用程序。这就像这样,这里的Google是您正在构建的应用程序,而其他应用程序是客户端应用程序。

如果想更好地理解,最好的方法是进行实际实现。只需在Laravel中创建一个新应用程序,并将此代码放入routes / web.php文件中即可。

Route::get('/redirect', function () {
    $query = http_build_query([
        'client_id' => 'YOUR APP'S CLIENT ID',
        'redirect_uri' => 'THE CALLBACK YOU GAVE DURING CREATING THE CLIENT',
        'response_type' => 'code',
        'scope' => '',
    ]);

    return redirect('http://your-app.com/oauth/authorize?'.$query);
});

请访问具有/redirect路由的新应用程序。确保您的主应用程序也在运行中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接