$callbackUrl = urlencode(self::CALLBACK_URL); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"https://api.twitter.com/oauth/request_token"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, [ 'oauth_callback' => $callbackUrl, 'oauth_consumer_key' => self::TWITTER_API_KEY ]); $timestamp = date("U"); // UTC UNIX time $oauth_nonce = preg_replace( '/[\W]/', '', base64_encode($timestamp)); $headers = [ "Authorization: OAuth oauth_consumer_key=\"".self::TWITTER_API_KEY."\"", "oauth_nonce: \"$oauth_nonce\"", "oauth_signature: \"oauth_signature\"", "oauth_signature_method: \"HMAC-SHA1\"", "oauth_timestamp: \"$timestamp\"", "oauth_version: \"1.0\"", ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_STDERR, $fp); curl_setopt($ch, CURLINFO_HEADER_OUT , true); $curlResult = curl_exec($ch); if (curl_errno($ch)) { echo 'Curl Request Error:' . curl_error($ch); throw new CHttpException(404,'ERROR'); } curl_close ($ch); El resultado de Twitter: {"errors":[{"code":215,"message":"Bad Authentication data."}]}
Petición:
[url] => https://api.twitter.com/oauth/request_token [content_type] => application/json; charset=utf-8 [http_code] => 400 [header_size] => 1395 [request_size] => 429 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.250341 [namelookup_time] => 0.028679 [connect_time] => 0.044366 [pretransfer_time] => 0.093077 [size_upload] => 344 [size_download] => 62 [speed_download] => 247 [speed_upload] => 1374 [download_content_length] => 62 [upload_content_length] => 344 [starttransfer_time] => 0.115261 [redirect_time] => 0 [redirect_url] => 0 [primary_ip] => 104.244.42.2 [certinfo] => Array ( ) [primary_port] => 443 [local_ip] => 192.168.208.2 [local_port] => 48502 [request_header] => POST /oauth/request_token HTTP/1.1Hice todo como la documentación de Twitter, pero devuelve 215. Creo que el problema está en la parte de los encabezados, pero no sé qué es lo que está mal allí.
Generé el nonce con base64 aleatoria. Cosas como Twitter dijo que allí Documentación. La Hora se parece a la Hora de ejemplo de Twitter. Vi que cuando el tiempo está 5 minutos por encima de los twitters, la solicitud se bloquea. ¿Es ese el mismo código de error entonces?
Según la documentación , el encabezado de autorización debe contener todos los datos. Su encabezado Authorization contiene solo OAuth oauth_consumer_key .
Su encabezado real (mal formato, porque, por ejemplo, 'oauth' es una entrada de los encabezados, pero debería ser una propiedad de Autorización; consulte a continuación).
Authorization: OAuth oauth_consumer_key='xxx' oauth_nonce: 'MTY0MzIwNjg5NQ' oauth_signature: 'oauth_signature' oauth_signature_method: 'HMAC-SHA1' oauth_timestamp: '1643206895' oauth_version: '1.0'Deberías
Authorization: OAuth oauth_consumer_key='xxx', oauth_nonce="MTY0MzIwNjg5NQ", oauth_signature="oauth_signature", ...Debe concatenar todos los datos en una cadena . Pero podría crear una matriz para ayudar a construirlo. Aquí hay un ejemplo :
$authParams = implode(', ', [ 'oauth_consumer_key="' . self::TWITTER_API_KEY . '"', 'oauth_nonce="' . $oauth_nonce . '"', 'oauth_signature="oauth_signature"', 'oauth_signature_method="HMAC-SHA1"', 'oauth_timestamp="' . $timestamp . '"', 'oauth_version="1.0"', ]); $headers = [ "Authorization: OAuth $authParams" ]; var_dump($headers);Salidas algo como:
array(1) { [0]=> string(197) "Authorization: OAuth oauth_consumer_key="xxx", oauth_nonce="MTY0MzIwNjg2MA", oauth_signature="oauth_signature", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1643206860", oauth_version="1.0"" }