HERE REST API OAuth 2.0 令牌请求(带有 1.0 标头)错误



我一直在尝试让我的 PHP 应用程序创建一个成功的令牌请求,因为最终按照此处的文档设法让它与 Postman 一起工作


显然 API 使用的是 OAuth 2.0,这就是为什么我希望发送grant_type, client_id,client_secret和expires_in(如果我没有指定这些字段之一,那么 API 将成功告诉我它丢失了)。


现在我遇到的问题是我必须生成这个 OAuth 1.0 授权标头,Postman 这样做似乎没有问题,但是尝试在 PHP 中执行它我只是从 API 返回一个关于签名的错误不匹配:


array:6 [

  "errorId" => "ERROR-fde4f0f1-9d5c-43fd-80eb-056cbf2c3259"

  "httpStatus" => 401

  "errorCode" => 401300

  "message" => "Signature mismatch. Authorization signature or client credential is wrong."

  "error" => "invalid_client"

  "error_description" => "errorCode: '401300'. Signature mismatch. Authorization signature or client credential is wrong."

]

我尝试了各种调试,其中很多都给了我不同的错误,然后我一直回到这个错误,所以签名一定是问题所在。


我在这里创建了以下类来处理生成标头,从包中的类获得一些指导guzzle/oauth-subscriber。


这是生成的请求标头的示例:


array:2 [

  "Content-Type" => "application/x-www-form-urlencoded"

  "Authorization" => "OAuth oauth_consumer_key="XXXXXXXXXXXX",oauth_signature_method="HMAC-SHA256",oauth_timestamp="1583629976",oauth_nonce="Br2HsCVzsaEe3KswBhtCzsSxjUDWgX56",oauth_version="1.0",oauth_signature="G7%2B5f2v2Kdx3rp%2B28DcuJRBvhi9H7fHC1mFLqJIgmMc%3D""

]

请求正文:


array:4 [

  "grant_type" => "client_credentials"

  "client_id" => "XXXXXXXXXXXX"

  "client_secret" => "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

  "expires_in" => 87000

]

敏感细节已替换但consumer_key正确client_id,consumer_secret与client_secret


无论我如何尝试更改signUsingHmac()更改签名的方法,它都不起作用,对我来说一切都很好 D:


有人有什么想法吗?


如果我能很好地工作,我会将它拉到包中,以使 PHP 中这个 API 的身份验证不那么痛苦。


宝慕林4294392
浏览 174回答 2
2回答

莫回无

我创建了一个有效的要点。一些建议:所有值都必须是 urlenconde()您需要用于签名请求的字符串需要包括:方法(大写)和 URL(urlcode)和参数列表(url 编码)签名密钥是您的消费者密钥(urlencode),后跟 &。这是因为通常您的签名密钥需要我的消费者秘密和秘密令牌。在这种情况下,我们没有秘密令牌对于您的签名基本字符串的参数列表,您需要包括所有 oauth_ 参数和您的 grant_type,因为您还需要包括 body 参数。这些键的排序至关重要一些代码PHP代码:$keyId = getenv('HERE_API_KEY_ID');$keySecret = getenv('HERE_API_KEY_SECRET');$httpBody = [    "grant_type" => "client_credentials"];$httpMethod = "POST";$httpUrl = 'https://account.api.here.com/oauth2/token';$oauthNonce = mt_rand();$oauthTimestamp = time();$oauthSignatureMethod= "HMAC-SHA256";$oauthVersion = "1.0";$baseString = $httpMethod."&". urlencode($httpUrl);$oauth1Param = [    'oauth_consumer_key' => $keyId,    'oauth_signature_method' => $oauthSignatureMethod,    'oauth_timestamp' => $oauthTimestamp,    'oauth_nonce' => $oauthNonce,    'oauth_version' => $oauthVersion];$paramString =        "grant_type=client_credentials&".        "oauth_consumer_key=". urlencode($oauth1Param['oauth_consumer_key']).        "&oauth_nonce=". urlencode($oauth1Param['oauth_nonce']).        "&oauth_signature_method=". urlencode($oauth1Param['oauth_signature_method']).        "&oauth_timestamp=". urlencode($oauth1Param['oauth_timestamp']).//        "&oauth_token=".        "&oauth_version=". urlencode($oauth1Param['oauth_version']);echo $paramString.PHP_EOL;$baseString = $baseString . "&" . urlencode($paramString);echo $baseString . PHP_EOL;$signingKey= urlencode($keySecret) . "&";$signature = urlencode(    base64_encode(    hash_hmac(        'sha256',        $baseString,        $signingKey,        true    )    ));$oauth1Param['oauth_signature']  =  $signature;echo "RUNTIME SIGNATURE : " . $signature .PHP_EOL;我创建了一个有效的 GIST,您唯一需要更改的是 $keyId 和 $keySecret。 https://gist.github.com/roberto-butti/736c38c796ede70c719f6a21a752c971该文档非常有用:https ://developer.twitter.com/en/docs/basics/authentication/oauth-1-0a/creating-a-signature

千巷猫影

似乎 access_id 和 access_key 都在请求正文中传递,"grant_type" => "client_credentials"只需要在正文中,而access_id and access_key应该在标头中传递。您可以先在邮递员中尝试,如果成功,请恢复
打开App,查看更多内容
随时随地看视频慕课网APP