【问题标题】:Can't get Auth object and cookies by consuming my own Laravel API无法通过使用我自己的 Laravel API 来获取 Auth 对象和 cookie
【发布时间】: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


    【解决方案1】:

    您是否尝试过使用 Illuminate 或 Symfony Request 类并通过 Laravel 实例处理路由?我的直接怀疑是 Guzzle 是没有 cookie 通过请求的罪魁祸首。 Cookie::queue() 是 Laravel 特有的功能,所以我认为 Guzzle 不会对它们一无所知。

    在出现问题的路径之一中替换 Guzzle。从一个新的 Request 实例开始,然后进行内部 api 调用,如下所示:

     // create new Illuminate request
    $request = Request::create('/api/users', $action, $data, [], [], [
        'Accept' => 'application/json', 
    ]);
    
    // let the application instance handle the request
    $response = app()->handle($request);
    
    // return the Illuminate response with cookies
    return $response->withCookies($myCookies);
    

    我在几个应用程序中做了类似的事情,并且从未遇到过 cookie 或访问服务器变量的任何问题。当然,它只是用于身份验证,其余的 api 调用都是通过 axios 调用的。

    【讨论】:

      猜你喜欢
      • 2019-04-06
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多