Laravel 5.3 Passport组件看起来很酷,但我对它有些困惑。
在文档上Passport是在API身份验证下,当设置config / auth.php时,它会将驱动程序更改为' passport'警卫' api'。
Laravel 5.3将web.php和api.php用于不同的路由组以使用Web中间件或api中间件。
安装Passport之后,需要将Passport:routes()添加到AuthServiceProvider。当我运行route:list时,它将显示新路由都使用web和auth中间件。
我的问题是为什么这些护照路由使用网络中间件?据我所知,Passport应该用于无状态API身份验证,但Web中间件不是。
答案 0 :(得分: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
路线访问新应用。确保主应用程序也在运行。
答案 1 :(得分: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时会失去跨域保护。