почему linkedin grant_type пропущен, хотя и объявлен?

#api #oauth #linkedin

#API #oauth #LinkedIn

Вопрос:

    $postRequest = array(
    'grant_type' => 'authorization_code',
    'code' => $_REQUEST['code'],
    'redirect_uri' => 'mine',
    'client_id' => 'mine',
    'client_secret' => 'mine',
        
 );


 error_log(print_r($postRequest, true));

 $cURLConnection = curl_init('https://www.linkedin.com/oauth/v2/accessToken/');
 curl_setopt($cURLConnection, CURLOPT_POST, 1); 
 curl_setopt($cURLConnection, CURLOPT_POSTFIELDS, $postRequest);
 curl_setopt($cURLConnection, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
 curl_setopt($cURLConnection, CURLOPT_RETURNTRANSFER, true);



$apiResponse = curl_exec($cURLConnection);

error_log(print_r($apiResponse, true));


    if(curl_exec($cURLConnection) === false){
     
        error_log(print_r(curl_error($cURLConnection), true));
    }


curl_close($cURLConnection);

 

Выше возвращает ошибку, хотя grant_type включен в https://docs.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow:

grant_type Значение этого поля всегда должно быть: authorization_code
{«ошибка»:»invalid_request»,»error_description»: «Отсутствует обязательный параметр «grant_type»»}

grant_type Значение этого поля всегда должно быть: authorization_code

Комментарии:

1. Есть какие-либо обновления по этому поводу? Вы это исправили?

Ответ №1:

я столкнулся с этой проблемой после публикации тела запроса как «x-www-form-urlencoded», это сработало для меня. вот решение на Java. Надеюсь, это будет полезно. также, если вы пытаетесь использовать postmen, попробуйте отправить тело как «x-www-form-urlencoded» в разделе Body -> x-www-form-urlencoded и отправить, это сработает.

 ObjectMapper objectMapper = new ObjectMapper();
    RestTemplate restTemplate = new RestTemplate();
    MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
    map.add("grant_type", "authorization_code");
    map.add("code", token);
    map.add("redirect_uri", redirectyUrl);
    map.add("client_id", clientId);
    HttpHeaders headers = new HttpHeaders();
    headers.set("Accept", MediaType.ALL_VALUE);
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
    headers.setBasicAuth(clientId, secret);
    HttpEntity entity = new HttpEntity(map, headers);
    ResponseEntity<String> res = restTemplate.postForEntity(accessTokenURL, entity, String.class);
    String access_token = objectMapper.readTree(res.getBody()).get("access_token").asText();