OAuth 1.0 在 POSTMAN 和 PHP 代码中生成签名差异

OAuth 1.0 Generate Signature Difference in POSTMAN and PHP code


我想向使用 OAuth 作为身份验证方法的 API 进行身份验证。
我已经创建了这个代码来生成签名。
**这些都是用于测试目的的虚拟数据!**
$consumerKey     = "468gu89fu8934uf3jf935jg5i2954";
$consumerSecret  = "9385u3jg389gj349856u985j349t8";
$tokenSecret     = "353459385j3fojlkvm34tfewoijr4";
$accessToken     = "598u45983jf3jr3i45jkr3elkrj34";
$realm           = "389534j5oi";
$signatureMethod = "HMAC-SHA256";
$version         = "1.0";

function generateSignature($request, $timestamp, $nonce)
{
    Global $consumerKey, $accessToken, $consumerSecret, $tokenSecret, $realm, $signatureMethod, $version;
    $base = $request['method'] . "&" . rawurlencode($request['url']) . "&"
    . rawurlencode("oauth_consumer_key=" . rawurlencode($consumerKey)
    . "&oauth_nonce=" . rawurlencode($nonce)
    . "&oauth_signature_method=" . rawurlencode($signatureMethod)
    . "&oauth_timestamp=" . rawurlencode($timestamp)
    . "&oauth_token=" . rawurlencode($accessToken)
    . "&oauth_version=" . rawurlencode($version));

    $key = rawurlencode($consumerSecret) . '&' . rawurlencode($tokenSecret);
    $signature = base64_encode(hash_hmac('sha256', $base, $key));
    return $signature;

}

此函数生成正确的签名,与我使用此在线工具生成的签名相匹配:https://www.devglan.com/online-tools/hmac-sha256-online

然而,当我将所有这些参数添加到 POSTMAN 时,它会生成不同的签名。
它与我生成的签名完全不匹配。
我遇到的问题是 API 端点通过 POSTMAN 成功验证,但没有使用我自己生成的签名。
让我们使用这些凭据来生成签名。

$consumerKey     = "468gu89fu8934uf3jf935jg5i2954";
$consumerSecret  = "9385u3jg389gj349856u985j349t8";
$tokenSecret     = "353459385j3fojlkvm34tfewoijr4";
$accessToken     = "598u45983jf3jr3i45jkr3elkrj34";
$realm           = "389534j5oi";
$signatureMethod = "HMAC-SHA256";
$version         = "1.0";
$nonce           = "LQgbebz9DTe";
$timestamp       = "1636124296";
$url             = "https://fakeapi.com/auth";
$method          = "GET";

这些是生成的签名:

My application: NWNjMzgyOGJiYWU1YmNiNzNlMzRjMjA5ZGNiNmIzZWNiNTAzYjRhNjE0NTMyZjYyN2MwNzM5ZjNmZDEzNDYxNg==
POSTMAN: XMOCi7rlvLc%2BNMIJ3Laz7LUDtKYUUy9ifAc58%2F0TRhY%3D

如您所见,在我使用相同凭据的两个应用程序中生成了 2 个完全不同的签名,您也可以对此进行测试。
我的问题来了:
谁能告诉我为什么这些签名不同,我需要做什么才能让我自己的签名也起作用?因为邮递员生成的那个完美无缺。
我真的卡住了,我的同事也找不到原因。
感谢您的帮助:)

这里的问题可以在基本签名的编码中找到,以生成实际的签名。您需要将 hash_hmac 方法中的二进制标志设置为 true。这将 return 消息摘要的原始二进制表示,而这又需要进行 base64 编码。

$signature = base64_encode(hash_hmac('sha256', $base, $key, true));

https://www.php.net/manual/en/function.hash-hmac.php

这将产生一个与 Postman 所做的相同的签名。