1

尝试将我的 JSAPI 令牌交换为 REST Oauth 令牌时遇到一些问题(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,我就不应该需要它?

我检查了所有变量 IE $credentials 和 $this->_c 并且所有变量都正确传递。

4

1 回答 1

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());

}

你应该准备好了。如果您还有其他问题,请随时联系我们的开发者论坛,我本人或团队中的其他人将很乐意为您提供帮助。

享受!

-杰里米

于 2012-04-13T01:11:37.303 回答