OAuth 1.0 在 POSTMAN 和 PHP 代码中生成签名差异
Posted
技术标签:
【中文标题】OAuth 1.0 在 POSTMAN 和 PHP 代码中生成签名差异【英文标题】:OAuth 1.0 Generate Signature Difference in POSTMAN and PHP code 【发布时间】:2021-12-19 15:17:50 【问题描述】: 我想对使用 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 个完全不同的签名,您也可以对此进行测试。现在是我的问题: 谁能告诉我为什么这些签名不同,我需要做什么才能让我自己的签名也起作用?因为邮递员生成的那个完美无缺。 我真的卡住了,我的同事也找不到原因。 任何帮助表示赞赏:)
【问题讨论】:
您说过类似 [Postman 的 generate-logic 工作为什么不是我的],所以请编辑并添加 Postman 的逻辑!? 不,没这么说,我说过当我将Oauth与邮递员一起使用时,它生成的签名有效。 【参考方案1】:这里的问题可以在基础签名的编码中找到,以生成实际的签名。您需要将 hash_hmac 方法中的二进制标志设置为 true。这将返回消息摘要的原始二进制表示,而这又需要进行 base64 编码。
$signature = base64_encode(hash_hmac('sha256', $base, $key, true));
https://www.php.net/manual/en/function.hash-hmac.php
这将产生与 Postman 所做的相同的签名。
【讨论】:
以上是关于OAuth 1.0 在 POSTMAN 和 PHP 代码中生成签名差异的主要内容,如果未能解决你的问题,请参考以下文章
如何查看 Postman 在发出 OAuth 请求时使用的原始签名?
如何在 Postman 集合中保留 OAuth2 令牌(或使用刷新令牌)?