在 guzzlehttp Laravel php 中使用令牌进行授权

问题描述

我正在尝试使用 laravel 中的 GuzzleHttp 向我的另一个端点发出请求,但令牌未对其进行授权。我相信这是我要走的路。有人知道怎么修这个东西吗?这是我的代码

public function productRecommendation($rowPerPage,$keywords,$page){

        try{
            $request = request();
            $token = $request->bearerToken();
            $client = new \GuzzleHttp\Client();
            $promise = $client->request('GET',$this->sellerUrl.'recommended',[
                'headers'  =>  ['Authorization' => "Bearer {$token}"],'query' =>
                    [
                        'rowPerPage' => $rowPerPage,'page' => $page,'keywords' => $keywords,],]);
            $response = (string) $promise->getBody();
            return json_decode($response,true);
        }
        catch (Exception $e){
            return $e;
        }
}

解决方法

您正在使用 $request->bearerToken() 获取您的第一个应用程序的不记名令牌,并将其发送到您的第二个应用程序进行授权,这肯定不起作用;

您需要从您的第二个应用程序中获取工作令牌。您可以在第二个应用程序中生成令牌并将其复制到当前的 $token 变量中,或者首先使用您的凭据调用第二个应用程序的 login 端点并使用该令牌。

顺便说一下,Laravel 现在支持一个名为 Illuminate\Support\Facades\Http 的 guzzle 包装器,这使事情变得容易多了,您可以像这样重写代码:

public function productRecommendation($rowPerPage,$keywords,$page)
{
    try{
        $token = "some valid token from second endpoint";

        $response = Http::withToken(
            $token
        )->get(
            $this->sellerUrl . 'recommended',[
                'rowPerPage' => $rowPerPage,'page' => $page,'keywords' => $keywords,]
        );

        return response()->json(
            json_decode($response->body(),true)
        );
    }
    catch (Exception $e){
        return $e;
    }
}