Linkedin Oauth Issue - oauth_verifier

时间:2012-04-12 12:07:51

标签: php oauth linkedin

在尝试为REST Oauth Tokens交换我的JSAPI令牌时遇到一些问题(https://developer.linkedin.com/documents/exchange-jsapi-tokens-rest-api-oauth-tokens

我正在使用此库 - http://code.google.com/p/oauth-php/ - 与PECL扩展相反,因为我无法在服务器上安装扩展程序。

似乎有很多类似的问题,但没有一个真正回答这个问题 - 如何使用上述库来验证Linkedin。

我的代码如下:

    $cookie_name        = "linkedin_oauth_" . $this->_c->linkedin_api_key;
    $credentials_json   = stripslashes($_COOKIE[$cookie_name]);
    $credentials        = json_decode($credentials_json);

    // Get the Access Token + Secret
    $access_token_url = 'https://api.linkedin.com/uas/oauth/accessToken';

    OAuthStore::instance("2Leg", array(
        'consumer_key'      => $this->_c->linkedin_api_key,
        'consumer_secret'   => $this->_c->linkedin_api_secret
    ));

    try {

        $request = new OAuthRequester($access_token_url, 'POST', array(
            'xoauth_oauth2_access_token' => $credentials->access_token
        ));

        $result = $request->doRequest();

    } catch(OAuthException2 $e) {

        print_r($e->getMessage());

    }

catch语句输出:

Request failed with code 400: oauth_problem=parameter_absent&oauth_parameters_absent=oauth_verifier

如何获得此oauth_verifier?我的理解是,如果我已经传递了xoauth_oauth2_access_token,我不应该需要它吗?

我检查了所有变量I.E. $ credentials和$ this-> _c以及所有变量正确传递。

1 个答案:

答案 0 :(得分:2)

这实际上是oauth-php库中的一个错误。该库错误地处理以xoauth_ *为前缀的参数,并以与处理oauth_ *参数相同的方式处理它们。这违反了OAuth规范,大多数(所有?)其他OAuth库都没有此问题。解决方法是执行以下操作:

在文件OAuthRequestSigner.php中,找到以下内容:

1)在getAuthorizationHeader函数内,找到以下行:

if (strncmp($name, 'oauth_', 6) == 0 || strncmp($name, 'xoauth_', 7) == 0)

并将其更改为:

if (strncmp($name, 'oauth_', 6) == 0)

2)在函数getQueryString中,找到以下行:

||  (strncmp($name, 'oauth_', 6) != 0 && strncmp($name, 'xoauth_', 7) != 0))

并将其更改为:

||  (strncmp($name, 'oauth_', 6) != 0)

在那之后,你需要做的就是你已经做的基本相同,如下所示:

try {

    $request = new OAuthRequester($access_token_url, "POST", array('xoauth_oauth2_access_token' => $access_token));

    $result = $request->doRequest();

    var_dump($result);

} catch(OAuthException2 $e) {

    print_r($e->getMessage());

}

你应该全力以赴。如果您还有其他任何问题,请随时联系我们developer forums,我或自己或团队中的其他人都乐意为您提供帮助。

享受!

-Jeremy