Php 推特Oauth库。。。。再来一次

Php 推特Oauth库。。。。再来一次,php,api,twitter,oauth,Php,Api,Twitter,Oauth,首先,我知道有很多oauth库,我曾想过使用它们,但决定不使用,所以我写自己的只是为了好玩。我在签署请求时遇到问题。。。要帮忙吗 function signRequest($secret, $baseUrl){ return base64_encode(hash_hmac('sha1', $baseUrl, $secret, TRUE)); } function getRequestToken(){ $urlParams = array( "oauth_cons

首先,我知道有很多oauth库,我曾想过使用它们,但决定不使用,所以我写自己的只是为了好玩。我在签署请求时遇到问题。。。要帮忙吗

function signRequest($secret, $baseUrl){
    return base64_encode(hash_hmac('sha1', $baseUrl, $secret, TRUE));
}

function getRequestToken(){
    $urlParams = array(
        "oauth_consumer_key"=>$this->consumer_key,
        "oauth_signature_method"=>$this->oauth_signature_method,
        "oauth_timestamp"=>time(),
        "oauth_nonce"=>time(),
        "oauth_version"=>$this->oauth_version
    );
    uksort($urlParams, 'strcmp');

    foreach($urlParams as $k=>$v){
        $joinedParams[] = $k."=".$v;
    }
    $joinedParams = implode("&", $joinedParams);


    $baseString = "POST&".rawurlencode($this->request_token_url)."&".rawurlencode($joinedParams);
    $secret = $this->consumer_secret."&";

    $urlParams['oauth_signature'] = $this->signRequest($secret, $baseUrl);
    uksort($urlParams, 'strcmp');
    foreach($urlParams as $k => $v){
        $urlPairs[] = $k."=".$v;
    }
    $concatenatedUrlParams = implode('&', $urlPairs);
    $url = $this->request_token_url."?".$concatenatedUrlParams;
    echo $url;

}
我对签署请求这件事还不熟悉。不过,我可以通过以下链接连接到twitter api。我的答案基本上是以下答案的改写科迪


您似乎试图像令牌一样强制使用oauth参数

您需要构建一个“授权”头,并将其发送到twitter以获取请求令牌。我已经破坏了代码的类功能,但是作为一个php文件,它可以正常工作

检查差异,并尝试将它们嵌入到您自己的类中

代码如下:

<?php

getRequestToken ();

function signRequest($secret, $baseString) {
    return base64_encode ( hash_hmac ( 'sha1', $baseString, $secret, TRUE ) );
}

function getRequestToken() {
    $urlParams = array (
        "oauth_consumer_key" => "5P7F5qtIUujg3KtLxxxxxx", //$this->consumer_key,
        "oauth_signature_method" => "HMAC-SHA1", //$this->oauth_signature_method,
        "oauth_timestamp" => time(),
        "oauth_nonce" => md5 ( uniqid ( rand(), true ) ), // don't use time for nonce :)
        "oauth_version" => "1.0" //$this->oauth_version
    );
    ksort ( $urlParams ); // don't need uksort, ksort is enough


    foreach ( $urlParams as $k => $v ) {
        $joinedParams [] = $k . "=" . $v;
    }
    $joinedParams = implode ( "&", $joinedParams );

    $baseString = "GET&" . rawurlencode ( "https://api.twitter.com/oauth/request_token" ) . "&" . rawurlencode ( $joinedParams );
    $secret = rawurlencode ( "3q017y6ir8Rxxxxxxx" ) . "&"; //$this->consumer_secret."&";

    // We need to use the $baseString, not an url
    $urlParams ['oauth_signature'] = rawurlencode ( signRequest ( $secret, $baseString ) );

    // Another ksort is not needed, it is ok for signature to be at the end, however:
    ksort($urlParams);

    // We need to build an array of headers for CURL
    $urlParts = parse_url ( "https://api.twitter.com/oauth/request_token" );
    $header = array ('Expect:' );
    $oauthHeader = 'Authorization: OAuth realm="' . $urlParts ['path'] . '", ';
    foreach ( $urlParams as $name => $value ) {
        $oauthHeader .= "{$name}=\"{$value}\", ";
    }
    $header [] = substr ( $oauthHeader, 0, - 2 );

    // Ask Twitter for a request token
    $ch = curl_init ( "https://api.twitter.com/oauth/request_token" );
    curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );
    curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, false );
    curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
    $content = curl_exec ( $ch );
    curl_close ( $ch );

    // Create the url from the curl answer
    parse_str($content, $output);
    $url = "https://api.twitter.com/oauth/authorize?oauth_token=" . $output["oauth_token"];
    echo $url ;

}

我想你忘了告诉我们到底出了什么问题。我想我在请求上签名不正确……你怎么会这么想?您是否收到特定的错误消息?只是oauth失败的响应。请记住,所有相同的信息(密钥、机密、url参数等)都适用于未经更改的@Justin版本,您的工作似乎基于原始问题,而不是公认的答案。特别是,您至少缺少了一个参数。哇,在所有这些搜索之后,我终于资助了一个漂亮的、简洁的响应。试图从整个类oAuth libs中分离出一些基本的函数是非常烦人的。谢谢你快速简单的回复。我试图写下整个过程,但这个评论框很小。另外,我还记得Twitter上有一个页面,非常详细、有序地解释了OAuth的所有过程:是的,我一直在读那个页面,但我仍然有这些问题。再次感谢。