Внезапно я получаю эту ошибку, может ли кто-нибудь пролить свет на то, что происходит? Любая помощь будет принята с благодарностью.
GuzzleHttp \ Exception \ ClientException Ошибка клиента: POST https://login.salesforce.com/services/oauth2/token
привела к 400 Bad Request
ответу: {"error": "invalid_client", "error_description": "invalid учетные данные клиента "}
Я использую это уже несколько месяцев и работает нормально. Изменился ли логин Salesforce JWT? Я проверил цифровой сертификат, и срок его действия еще не истек.
Я следую этой статье https://help.salesforce.com/articleView?id=remoteaccess_oauth_jwt_flow.htm&type=5, и в ней говорится, что они не выдают refre sh токен, поэтому я не уверен, почему я получаю эту ошибку.
Вот мой код:
function create_assertion()
{
$signer = new \Lcobucci\JWT\Signer\Rsa\Sha256();
$keychain = new \Lcobucci\JWT\Signer\Keychain();
$builder = new \Lcobucci\JWT\Builder();
$token = $builder->setIssuer(env('CONSUMER_KEY'))
->setAudience(env('LOGIN_URL'))
->setExpiration(strval(time() + (5 * 60)))
->setSubject(env('USERNAME'))
->sign($signer, $keychain->getPrivateKey(file_get_contents(__DIR__ . '/' . env("SALESFORCE_PK_FILE"))))->getToken();
return $token->__toString();
}
function create_jwt($third_party_name)
{
try {
$client = new GuzClient(['base_uri' => env('LOGIN_URL')]);
$r = json_decode($client->post("/services/oauth2/token", [
'form_params' => [
'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
'assertion' => create_assertion()
]
])->getBody()->getContents(), true);
return saveTheAccessToken($r, $third_party_name);
} catch (Exception $exception) {
sendEmail('my@email.com', 'Salesforce API Error', $exception->getMessage());
throw $exception;
}
}
ОБНОВЛЕНИЕ: никакие изменения все еще не работают. Я тоже безуспешно проделал следующее
function base64url_encode($data)
{
return str_replace('/', '_', str_replace('+', '-', base64_encode($data)));
}
function create_assertion()
{
$jsonHeader = json_encode(["alg" => "RS256"]);
$header = base64url_encode($jsonHeader);
$expiration = strval(time() + (5 * 60));
$claimSet = [
"iss" => env('CONSUMER_KEY'),
"sub" => env('USERNAME'),
"aud" => env('LOGIN_URL'),
"exp" => $expiration
];
$jsonClaimSet = json_encode($claimSet);
$payload = base64url_encode($jsonClaimSet);
$encoded_JWT = $header . '.' . $payload;
$private_key = file_get_contents(__DIR__ . '/' . env("SALESFORCE_PK_FILE"));
$signature = "";
$algo = "SHA256";
openssl_sign($encoded_JWT, $signature, $private_key, $algo);
$secret = base64url_encode($signature);
return $header . '.' . $payload . '.' . $secret;
}
Может быть, это мой закрытый ключ или сертификат, который я загрузил в SF? Я тоже не внес никаких изменений. Срок действия сертификата истекает в конце следующего месяца.