Вход в систему Salesforce JWT возвращает неверные учетные данные клиента - PullRequest
0 голосов
/ 13 июля 2020

Внезапно я получаю эту ошибку, может ли кто-нибудь пролить свет на то, что происходит? Любая помощь будет принята с благодарностью.

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? Я тоже не внес никаких изменений. Срок действия сертификата истекает в конце следующего месяца.

...