3

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

在文档中 Passport 处于 API Authentication 之下,当设置 config/auth.php 时,它会将驱动程序更改为警卫 'api' 的 'passport'。

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

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

我的问题是为什么这些护照路由使用网络中间件?据我了解,Passport 应该适用于无状态 API 身份验证,但 Web 中间件不是。

4

2 回答 2

1

我也面临这个问题,直到我意识到我对护照工作原理的理解是错误的。

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路线的新应用程序。确保您的主应用程序也在运行。

于 2016-12-06T16:17:30.190 回答
0

我似乎已经解决了这个问题。

我做的第一件事是从这里添加和配置 CORS 中间件https://github.com/barryvdh/laravel-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 时的保护。

于 2016-09-06T09:35:02.090 回答