Переводить curl в CakePHP 3.6 httpclient? - PullRequest
0 голосов
/ 01 мая 2018

Я работаю с BShaffer OAuth2 / CakePHP 3.6 и большую часть пути туда. Однако я столкнулся с небольшим камнем преткновения в коде и сейчас пытаюсь перевести команду PHP Curl в команду Cake friendly httpClient

Командой curl является

curl -u testclient:testpass http://localhost/token.php -d 'grant_type=client_credentials'

в то время как моя текущая попытка для кода

$http = new Client();

$auth = [
    '_csrfToken' => $this->request->getParam('_csrfToken'),
    'grant_type' => 'client_credentials',
    'username' => $result->UserID,
    'password' => $createCode
];

$response = $http->post('/oauth/request', $auth);

У меня такое чувство, что мне нужно поместить имя пользователя / пароль в заголовок аутентификации для OAuth2, но я не уверен на 100%, как это сделать. Документация для httpClient включает OAuth2, но в виде одного заголовка:

$http = new Client([
'headers' => ['Authorization' => 'Bearer ' . $accessToken]
]);
$response = $http->get('https://example.com/api/profile/1');

EDIT:

С примерами из комментариев я получил, что PHP CURL работает напрямую, однако клиент Cake все еще дает пустой результат. Вот что у меня на данный момент:

$data = $this->request->getData();

$result = $this->Users->RegisterNewUser($data);
$report = $data['email'];

if ($result->result == 1)
{
    $generatePrivateKey = $this->OAuth->generatePrivateKey($result->UserID);


    $query = [
        'client_id' => $result->UserID,
        'client_secret' => $generatePrivateKey,
        'redirect_uri' => ''
    ];
    $this->OAuth->insertClientData($query);


// Insert User into clients //
    $auth = [
        'grant_type' => 'client_credentials'
    ];
    // Is not working //
    $http = new Client();
    $response = $http->post('https://example.com/oauth/request', $auth, [
      'auth' => ['username' => $result->UserID, 'password' => 
$generatePrivateKey]
    ]);
    print_r($response->getBody());

    // Works //
    $ch = curl_init('https://example.com/oauth/request');
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $auth);        
    curl_setopt($ch, CURLOPT_USERPWD, $result->UserID . ":". $generatePrivateKey);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
    $output = curl_exec($ch);
    curl_close($ch); 
}

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Как упомянуто в комментариях, вам нужно отправить запрос, который использует обычную аутентификацию, это то, что делает показанный запрос Curl.

Для этого укажите ключи username и password в опции auth, которая должна передаваться в третьем аргументе клиента post() метод:

$http = new Client();

$data = [
    'grant_type' => 'client_credentials',
];

$options = [
    'auth' => [
        'username' => $result->UserID,
        'password' => $createCode
    ]
];

$response = $http->post('/oauth/request', $data, $options);

Тело ответа можно затем, например, получить с помощью метода body() response, метода getContents() streams или даже с помощью магических свойств (не фанатов), которые соответствующим образом анализируют данные:

$stringBody = $reponse->body();
$stringBody = $response->getBody()->getContents();
$arrayData = $response->json;

Смотри также

0 голосов
/ 01 мая 2018

Попробуйте это как отправную точку, она должна работать для большинства сценариев cURL, для которых вам нужен токен авторизации:

        $post_data = ["stuff" => $stuff, "stuff2" => $stuff2];

        $data_string = json_encode($post_data);
        $ch = curl_init('https://endpoint.com');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Authorization: Bearer ' . $your_auth_token,
            'Content-Type: application/json',
            'Content-Length: ' . strlen($data_string))
        );
        $output = curl_exec($ch);
        // Do stuff with output
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...