【发布时间】:2018-09-25 04:00:10
【问题描述】:
我目前正在尝试使用以下方法在 Laravel 中构建一个安全的 SPA 应用程序:
- Laravel 5.6
- Laravel 护照
- Guzzle 客户端
为了使整个应用程序安全,我创建了一个代理来为 API 的所有请求添加前缀:
- 使用密码大类型令牌
- 隐藏客户端 ID
- 隐藏客户端密码
- 根据用户角色添加自动范围
这是代理的工作原理:
// The proxify endpoint for all API requests
Route::group(['middleware' => ['web']], function ()
{
Route::any('proxify/{url?}', function(Request $request, $url) {
return Proxify::makeRequest($request->method(), $request->all(), $url);
})->where('url', '(.*)');
});
每次发出请求时,它都会通过我构建的那个包来创建访问令牌、刷新它或删除它。
为我在登录时使用 MiddleWare 的用户创建访问令牌:
$response = $http->post('http://myproject.local/proxify/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'username' => $request->get('email'),
'password' => $request->get('password'),
]
]);
这很好,除了我在 Proxify::makeRequest 中设置 cookie,所以我必须在调用中创建它们,在 $response 中返回它们,然后在中间件结束时,将它们附加到请求中(Cookie::queue 和 Cookie::Make 在 Guzzle 调用中似乎不起作用)。
访问令牌被创建并存储在 cookie 中。
第一个问题是,在这个调用中,即使在中间件中,尤其是在那个 URL http://myproject.local/proxify/oauth/token 中,我也无法访问 Auth 特征,即使它被指定为附加到路由的中间件,所以无法从经过身份验证的用户那里获取信息。
然后另一个问题是,当我调用获取资源 API 时,例如:
$http = new Client();
$response = $http->get('http://myproject.local/proxify/api/continents');
$continents = $response->getBody()->getContents();
return view('dashboard')->with("continents", $continents);
在这种情况下,当我调用 URL 时,代理无法通过 HTTP 调用获取带有 CookieFacade 的 cookie 中定义的 access_token,也无法获取我想要使用的 Auth 对象。 $_COOKIE 变量也不起作用。
我的结构有什么问题,即使在浏览器中设置了 cookie,我也无法访问它?有没有其他方式获取信息?我试图从代理中的请求中获取cookie,但不起作用。
【问题讨论】:
标签: php laravel-5 cookies proxy guzzle