当Postman工作时,对JWT API的Guzzle POST请求被取消

时间:2018-06-15 16:27:54

标签: php laravel jwt postman guzzle

当Postman工作时,对JWT API的Guzzle POST请求被取消。 这是代码:

public function __construct()
{
    $this->client = new Client();
    $this->connect();
}

public function connect()
{
    $loginResult = $this->client->request('POST', config('api.base_uri') .'/auth/login', [
        'form_params' => [
            'email' => config('api.login'),
            'password' => config('api.password'),
        ]
    ]);

    dd(json_decode($loginResult->getBody()));

}

我在运行此代码时获得了401 Unauthorized。凭据正确传递。 同时在Postman中它完美地运作: While in Postman it is working perfectly

请告诉我我做错了什么。 谢谢!

更新 以下是控制器和功能,此请求正在API端点击:

class AuthController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login']]);
    }

    public function login(Request $request)
    {
        $credentials = $request->only(['email', 'password']);

        if (!$token = auth('api')->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized '.$credentials['email']], 401);
        }

        return $this->respondWithToken($token);
    }
...

用户确实存在,因为它在Postman中工作

更新2 我有简化代码来查找错误:

Route::get('/guzzle', function () {
    $client = new Client([
        'headers' => [
            'Accept' => 'application/json'
        ]]);

    $loginResult =
        $client->request('POST', config('pics.base_uri') .'/auth/login', [
            'form_params' => [
                'email' => '****@****.com',
                'password' => '*****',
            ]
        ]);

    dd(json_decode($loginResult->getBody()));
});

它不起作用 - 得到同样的错误

3 个答案:

答案 0 :(得分:1)

好的......经过几个小时和Kyslik的善意帮助,我能够找到这个问题的线索。实际上是什么帮助我调试并查找我得到的错误。最终我发现了以下帖子(https://github.com/guzzle/guzzle/issues/1413#issuecomment-222031665),其中陈述了一些奇怪的事情:

  如果使用相同的PHP实例从Guzzle发送请求并回复该请求,那么Guzzle根本不会工作

我把所有东西都搬到了托管中,它就像一个魅力。希望将来会帮助某人。

感谢所有参与寻找解决方案的人,当然还要感谢Kyslik

答案 1 :(得分:0)

尝试使用POST请求中的Guzzle选项中的json选项,而不是form_params

public function connect()
{
    $loginResult = $this->client->request('POST', config('api.base_uri') .'/auth/login', [
        'json' => [
            'email' => config('api.login'),
            'password' => config('api.password'),
        ]
    ]);

    dd(json_decode($loginResult->getBody()));

}

form_params应与非json端点一起使用。

有关json媒体资源的更多信息:http://docs.guzzlephp.org/en/stable/quickstart.html#uploading-data

编辑一个接受form-params但返回JSON的端点的示例,这可能就是您所拥有的:

public function __construct()
{
    $this->client = new Client()
    $this->connect();
}

public function connect()
{
    $loginResult = $this->client->request('POST', config('api.base_uri') .'/auth/login', [
        'form_params' => [
            'email' => config('api.login'),
            'password' => config('api.password'),
        ]
    ]);

    dd(json_decode($loginResult->getBody()));

}

答案 2 :(得分:0)

在两个站点上运行php artisan config:cache可解决此问题。

  

Windows上Apache上的两个站点需要缓存的配置。这是一个已知但未记录的问题。在两个站点上运行php artisan config:cache。

Src:https://github.com/laravel/framework/issues/21533#issuecomment-334352170