Coinbase:在 PHP 中使用 JWT 进行身份验证

问题描述 投票:0回答:1

我正在尝试在 PHP 中使用 Coinbase 的高级交易 API。他们决定使用 JWT,但没有给出 PHP 示例。

所以我尝试了我的这段代码,但它返回 NULL。我已经检查过很多次 API 密钥了。详细信息是正确的。以下是 Coinbase 文档的链接:https://docs.cloud.coinbase.com/advanced-trade-api/docs/rest-api-auth

use Firebase\JWT\JWT;

$keyName = 'organizations/b0f974e{redacted}860/apiKeys/d840f8{redacted}b6d';
$keySecret = "-----BEGIN EC PRIVATE KEY-----\nMHcC{redacted}bHEzMVwDhg==\n-----END EC PRIVATE KEY-----\n";

$requestMethod = "GET";
$requestHost = "api.coinbase.com";
$requestPath = "/api/v3/brokerage/accounts";

function buildJwt($uri, $keyName, $keySecret) {
    $privateKeyResource = openssl_pkey_get_private($keySecret);
    if (!$privateKeyResource) {
        throw new Exception('Private key could not be parsed or is invalid.');
    }
    $payload = [
        'sub' => $keyName,
        'iss' => 'coinbase-cloud',
        'iat' => time(),
        'exp' => time() + 120,  // Token expiration time (example: 120 seconds from now)
        'uri' => $uri,
    ];
    $jwt = JWT::encode($payload, $privateKeyResource, 'ES256');
    return $jwt;
}

function main($requestMethod, $requestHost, $requestPath, $keyName, $keySecret) {
    $uri = "$requestMethod $requestHost$requestPath";
    $jwtToken = buildJwt($uri, $keyName, $keySecret);
    return $jwtToken;
}

$myjwt = main($requestMethod, $requestHost, $requestPath, $keyName, $keySecret);

function getAccountDetails($jwt, $requestMethod, $requestHost, $requestPath) {
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => "https://$requestHost$requestPath",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => $requestMethod,
        CURLOPT_HTTPHEADER => [
            "Authorization: Bearer $jwt",
            "Content-Type: application/json"
        ],
    ]);
    $response = curl_exec($curl);
    $err = curl_error($curl);
    curl_close($curl);
    if ($err) {
        echo "cURL Error #:" . $err;
    } else {
        return json_decode($response, true);
    }
}

$res = getAccountDetails($myjwt, $requestMethod, $requestHost, $requestPath);
var_dump($res);
php jwt coinbase-api
1个回答
0
投票
<?php 

require '../../vendor/autoload.php';

use \Firebase\JWT\JWT;

function createMyJWT($request_path)
{
    $key_name = 'organizations/9xxxxxxa-93ce-4f50-bee9-4xxxxxxxxxxd/apiKeys/2xxxxxxx0-5aea-47c8-9445-cxxxxxxxxxxf';
$key_secret = "-----BEGIN EC PRIVATE KEY-----\nMxxxxxxxxxxxxxxxxxxxxxxxxxl4/NxxxxxxxxxS/rtxxxxxxxxxxxxxxxxxxxxxxxxM49\nAxxxxxxxxxQgAEc2/6Bxxxxxxxl+oxxxxxxxxxxhc/SxxxxxxxxxxxxxxxxxxxxxxY\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9A==\n-----END EC PRIVATE KEY-----\n";
$request_method = 'GET';
$url = 'api.coinbase.com';

$algorithm = 'ES256';
$uri = $request_method . ' ' . $url . $request_path;

$token = JWT::encode(
    [
        'iss' => 'coinbase-cloud',
        'nbf' => time(),
        'exp' => time() + 120,
        'sub' => $key_name,
        'uri' => $uri
    ],
    $key_secret,
    $algorithm,
    null,
    [
        'kid' => $key_name,
        'nonce' => bin2hex(random_bytes(16))
    ]
);
return $token;
}

?>
© www.soinside.com 2019 - 2024. All rights reserved.