Я пытаюсь запросить код авторизации OAuth 2.0 с PHP CURL от HMRC (UK IRS).
Демонстрация JAVA в HMRC выглядит следующим образом:
Замените на client_id и client_secret вашего приложения
String clientId = "YOUR-CLIENT-ID";
String clientSecret = "YOUR-CLIENT-SECRET";
String scope = "hello";
String redirectUri = "https://www.example.com/redirect";
Создание запроса на авторизацию OAuth 2.0
OAuthClientRequest request = OAuthClientRequest
.authorizationLocation("https://testapi.service.hmrc.gov.uk/oauth/authorize")
.setResponseType("code")
.setClientId(clientId)
.setScope(scope)
.setRedirectURI(redirectUri)
.buildQueryMessage();
Перенаправление в указанное местоположение
httpServletResponse.sendRedirect(request.getLocationUri());
Код PHP CURL, который я написал:
<?php
$clientID = 'xxxx';
$scope='scope_1+scope_2+scope_3';
$redirectUri = 'https://xxxx/auth-redirect/';
$ResponseType='code';
$authLocation='https://test-api.service.hmrc.gov.uk/oauth/authorize';
$token = uniqid();
$server_token='xxxxx';
$headers = array(
'Content-Type: application/x-www-form-urlencoded',
'Accept: application/vnd.hmrc.1.0+json',
'Authorization: Bearer ' . $server_token,
);
//construct the OAuth 2.0 Authorize request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $authLocation);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "client_id=$clientID&scope=$scope&state=$token&redirect_uri=$redirectUri");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
echo $result;
// Redirect the user to HMRC authorization page
/*
header('Location: ' . $redirectUri . '?' . $location);
*/
?>
echo $ result дает 'Маркер CSRF не найден в заголовках'.
Нет документации по токену CSRF на сайте HMRC.Есть ли общая проблема с моим кодом, которая может быть причиной этой ошибки?В частности, я не уверен, правильный ли синтаксис CURLOPT_POSTFIELDS или какие-то поля, включенные в это предложение, должны быть включены в определение $ headers.Я проверил _POSTFIELDS на php.net , и, как я понимаю, все в порядке.