Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Twitter OAUTh和PHP_Php_Twitter_Oauth - Fatal编程技术网

Twitter OAUTh和PHP

Twitter OAUTh和PHP,php,twitter,oauth,Php,Twitter,Oauth,我正试图从twitterapi获取一个请求令牌,以便使用用户的Twitter帐户登录,并且我一直收到一个401响应,“未能验证oauth签名和令牌”。我在PHP上做这件事。我也在寻找类似的问题,但显然我是唯一一个疯狂到可以在没有图书馆的情况下从头开始做这件事的人 在他们的API文档中,他们谈到对授权头中发送的值进行“百分比编码”,我使用的是urlencode()函数,不确定它是否正确 为了计算签名,我使用hash_hmac('SHA1',$signParameters,$hashKey),也不确

我正试图从twitterapi获取一个请求令牌,以便使用用户的Twitter帐户登录,并且我一直收到一个401响应,“未能验证oauth签名和令牌”。我在PHP上做这件事。我也在寻找类似的问题,但显然我是唯一一个疯狂到可以在没有图书馆的情况下从头开始做这件事的人

在他们的API文档中,他们谈到对授权头中发送的值进行“百分比编码”,我使用的是urlencode()函数,不确定它是否正确

为了计算签名,我使用hash_hmac('SHA1',$signParameters,$hashKey),也不确定它是否正确使用

这是通过cURL生成的请求:

POST /oauth/request_token HTTP/1.1
Host: api.twitter.com
Accept: */*
Authorization: OAuth oauth_callback="http%3A%2F%2Fwww.soytumascota.com%2Ftwitter%2Fuser.php", oauth_consumer_key="MY_APP_KEY", oauth_nonce="0dde25902bde5f3b280f58ea642047cf", oauth_signature_method="HMAC_SHA1", oauth_timestamp="1334697987", oauth_version="1.0", oauth_signature="8313277875f20cd8a8631966a2ba273a5d13aeda"
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue
我非常感谢你能给我的任何帮助,谢谢

编辑:这是我到目前为止写的代码

<?php
DEFINE( 'CONSUMER_KEY', 'MY_APP_KEY' );
DEFINE( 'CONSUMER_SECRET', 'MY_APP_SECRET' );

$url = 'https://api.twitter.com/oauth/request_token';

//setting OAuth parameters
$Oauth = Array();
$Oauth['oauth_callback'] = 'http://www.soytumascota.com/twitter/user.php';
$Oauth['oauth_consumer_key'] = CONSUMER_KEY;
$Oauth['oauth_nonce'] = md5( $Oauth['oauth_callback'] . CONSUMER_KEY . time() );
$Oauth['oauth_signature_method'] = 'HMAC_SHA1';
$Oauth['oauth_timestamp'] = (string) time();
$Oauth['oauth_version'] = '1.0';

//signature and authorization header are calculated inside functions
$Oauth['oauth_signature'] = calculateSignature( 'POST', $url, $Oauth );
$authorization = getAuthorizationHeader( $Oauth ); 
ksort( $Oauth );

//setting and sending request using cURL
$curl_session = curl_init( $url );
curl_setopt( $curl_session, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl_session, CURLOPT_POST, true );
curl_setopt( $curl_session, CURLINFO_HEADER_OUT, true );
curl_setopt( $curl_session, CURLOPT_HTTPHEADER, Array( 'Authorization: ' . $authorization ) );

$result = curl_exec( $curl_session );


function getAuthorizationHeader( $parameters )
{
    $authorization = 'OAuth ';
    $j = count( $parameters );
    foreach( $parameters as $key => $val )
    {
        $authorization .= $key . '="' . urlencode( $val ) . '"';

        if( $j-- > 1 )
        {
            $authorization .= ', ';
        }   
    }

    return $authorization;
}

function calculateSignature( $method, $url, $parameters, $accessToken = '' )
{   
    foreach( $parameters as $key => $val )
    {
        $foo = urlencode( $key );
        unset( $parameters[$key] );

        $parameters[$foo] = urlencode( $val );      
    }

    ksort( $parameters );   

    $signBase = '';
    $j = count( $parameters );
    foreach( $parameters as $key => $val )
    {
        $signBase .= "{$key}={$val}";

        if( $j-- > 1 )
        {
            $signBase .= '&';
        }
    }

    $signBase = strtoupper( $method ) . '&' . urlencode( $url ) . '&' . urlencode( $signBase );

    $signKey = urlencode( CONSUMER_SECRET ) . '&' . urlencode( $accessToken );

    $signature = hash_hmac( 'SHA1', $signParameters, $hashKey);

    return $signature;
}

首先,“oauth\u签名\u方法”必须是“HMAC-SHA1”(否则将不起作用)

关于“百分比编码”,他们在API文档中说,他们要求字符串按照RFC 3986进行编码,因此您应该使用
rawurlencode
而不是
urlencode

为了计算签名,他们在这里说,您必须使用HMAC-SHA1哈希算法,并将原始输出转换为base64,类似于:

$signature = base64_encode(hash_hmac( 'SHA1', $signBase, $signKey, true));
最后,您可能需要添加

//no content
curl_setopt( $curl_session, CURLOPT_POSTFIELDS, '');
//no verify certs
curl_setopt( $curl_session, CURLOPT_SSL_VERIFYPEER, FALSE);

使用curl选项来处理请求。

显然,我是唯一一个疯狂到可以从头开始处理请求的人……有什么特别的原因吗?@cillosis我喜欢学习事物本身是如何工作的,而不仅仅是我们在那里找到的库、框架和SDK的扭曲器。@hakre完成了,我发布了代码!我没有复习这个答案,我完全忘记了这一点。我将用这些新信息再试一次,非常感谢。