Java LinkedIn OAuth:“;签名“无效”;请求POST HTTP请求时的响应(对于请求令牌)

Java LinkedIn OAuth:“;签名“无效”;请求POST HTTP请求时的响应(对于请求令牌),java,oauth,linkedin,joauth,Java,Oauth,Linkedin,Joauth,当我从LinkedIn请求一个请求令牌到https://api.linkedin.com/uas/oauth/requestToken,我得到以下错误: oauth_problem=signature_invalid&oauth_problem_advice=com.linkedin.security.auth.pub.logindinedinevalidauthTokenException%20%20%20%3APOST%26https%253A%252F%252Fapi.linkedin.c

当我从LinkedIn请求一个请求令牌到
https://api.linkedin.com/uas/oauth/requestToken
,我得到以下错误:

oauth_problem=signature_invalid&oauth_problem_advice=com.linkedin.security.auth.pub.logindinedinevalidauthTokenException%20%20%20%3APOST%26https%253A%252F%252Fapi.linkedin.com%252Fuas%252Foauth%252FrequestToken%26oauth_回调%253Doob%2526oauth消费者_密钥%2539DVH3ZT4C-sjmrQTmo-AEJOFI8v1chyAV8lyu1qLZqPq\u HiGecD0bp%2526oauth\u nonce%253D2958724240022%2526oauth\u签名方法%253DHMAC-SHA1%2526oauth\u时间戳%253D1308562221%2526oauth\u版本%253D1.0%0AOAUU%3AI9DvH3zT4c-sjmrQTmo\u AEJOFI8V8N1CHYHYAV8A3SIVELYU1QLZQPQ\u HiGecD0bp%7C%2A01%7C%2A01%7C%2A01%2A01%3A1308562C%3AwU3AjU7C%3AjU7MWU7C%

这是HTTP 401未经授权的响应

例外情况:

net.oauth.exception.OAuthException: HTTP/1.0 401 Unauthorized
oauth_problem=signature_invalid&oauth_problem_advice=com.linkedin.security.auth.pub.LoginDeniedInvalidAuthTokenException%20while%20obtaining%20request%20token%20for%20%3APOST%26https%253A%252F%252Fapi.linkedin.com%252Fuas%252Foauth%252FrequestToken%26oauth_callback%253Doob%2526oauth_consumer_key%253DI9DvH3zT4c-sjmrQTmo_AeJOfi8v8n1ChYHYAV8A3siVLyu1qLZqPq_HiGecD0bp%2526oauth_nonce%253D2958724240022%2526oauth_signature_method%253DHMAC-SHA1%2526oauth_timestamp%253D1308562221%2526oauth_version%253D1.0%0AOAU%3AI9DvH3zT4c-sjmrQTmo_AeJOfi8v8n1ChYHYAV8A3siVLyu1qLZqPq_HiGecD0bp%7C%2A01%7C%2A01%7C%2A01%3A1308562221%3AkPisU0TwUgiNIYpigUrKITMwo7c%3D
    at net.oauth.consumer.OAuth1Consumer.requestUnauthorizedToken(OAuth1Consumer.java:133)
    at com.neurologic.example.LinkedInExample.requestUnauthorizedRequestToken(LinkedInExample.java:39)
    at com.neurologic.example.LinkedInExample.main(LinkedInExample.java:57)
连接到LinkedIn的示例源代码:

/**
 * 
 */
package com.neurologic.example;

import net.oauth.consumer.OAuth1Consumer;
import net.oauth.exception.OAuthException;
import net.oauth.provider.OAuth1ServiceProvider;
import net.oauth.signature.impl.OAuthHmacSha1Signature;
import net.oauth.token.v1.AccessToken;
import net.oauth.token.v1.AuthorizedToken;
import net.oauth.token.v1.RequestToken;

/**
 * @author Buhake Sindi
 * @since 14 June 2011
 *
 */
public class LinkedInExample {

    private static final String LINKEDIN_API_URL = "https://api.linkedin.com";
    private static final String API_KEY = "ENTER-API-KEY-HERE";
    private static final String API_SECRET  = "ENTER-API-SECRET-HERE";
    private static final String CALLBACK_URL = "oob";
    private OAuth1Consumer consumer;


    /**
     * 
     */
    public LinkedInExample() {
        super();
        // TODO Auto-generated constructor stub
        consumer = new OAuth1Consumer(API_KEY, API_SECRET, new OAuth1ServiceProvider(LINKEDIN_API_URL + "/uas/oauth/requestToken", LINKEDIN_API_URL + "/uas/oauth/authorize", LINKEDIN_API_URL + "/uas/oauth/accessToken"));
    }

    public RequestToken requestUnauthorizedRequestToken() throws OAuthException {
        return consumer.requestUnauthorizedToken(LINKEDIN_API_URL, CALLBACK_URL, null, new OAuthHmacSha1Signature());
    }

    public String getAuthorizationUrl(RequestToken token) throws OAuthException {
        return consumer.createOAuthUserAuthorizationUrl(token, null);
    }

    public AccessToken requestAccessToken(AuthorizedToken authorizedToken, RequestToken requestToken) throws OAuthException {
        return consumer.requestAccessToken(LINKEDIN_API_URL, requestToken, authorizedToken, new OAuthHmacSha1Signature());
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            LinkedInExample example = new LinkedInExample();
            RequestToken rt = example.requestUnauthorizedRequestToken();

            //Now that we have request token, let's authorize it....
            String url = example.getAuthorizationUrl(rt);

            //Copy the URL to your browser and make sure that OAuth 1 Servlet is running....
        } catch (OAuthException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
我的库:(版本1.2.1)。我从linkedin返回
com.linkedin.security.auth.pub.logindinedinvalidauthTokenException
建议时犯了什么错误

谢谢


PS:OAuth 1与Twitter完美配合(经过测试),因此我不明白发生了什么。此外,LinkedIn使用了OAuth 1.0版本A,JOAuth遵守了该版本(以及RFC5849)。

JOAuth库似乎没有正确计算签名。我需要查看完整的请求和响应才能进一步调试。您的应用程序名是什么?

JOAuth库似乎没有正确计算签名。我需要查看完整的请求和响应才能进一步调试。你的申请名称是什么?

请参考我对
也许会有帮助:)

请参考我的答案
也许会有帮助:)

我已经弄明白了。问题在于规范化基本字符串URI。URI的路径不能是小写的(我的路径是小写的)。我已经解决了这个问题。问题出在
net.oauth.util.OAuth1Util.normalizeUrl()方法中找到的方法中。

我已经解决了。问题在于规范化基本字符串URI。URI的路径不能是小写的(我的路径是小写的)。我已经解决了这个问题。问题出现在
net.oauth.util.OAuth1Util.normalizeUrl()方法中。
method.

我的应用程序名是“Music 4.0”。LinkedIn不是使用了
HMAC-SHA1
签名吗?我们也使用HMAC-SHA1,但我在OAuth库中发现了一些奇怪的bug。也许我们有一个Twitter没有的角色。你介意发布bug和问题角色吗?等等。我会看看我哪里出了问题。哼。。。我可以确认你的签名基本字符串看起来是正确的。您可以使用您的密钥获取requestToken。查看您的签名,我看到了kPisU0TwUgiNIYpigUrKITMwo7c=我的代码中有kkdzmpirsc7qy/gJ3+cw02d9NM=。我看了看来源,什么也没跳出来。明天我需要时间再看看。你能改天再试一次并发布完整的请求/响应吗?@Adam Trachtenberg,由于
oauth\u nonce
oauth\u timestamp
的原因,签名总是不同的。我不知道还能从这里得到什么帮助。我的应用程序名是“Music 4.0”。LinkedIn不是使用了
HMAC-SHA1
签名吗?我们也使用HMAC-SHA1,但我在OAuth库中发现了一些奇怪的bug。也许我们有一个Twitter没有的角色。你介意发布bug和问题角色吗?等等。我会看看我哪里出了问题。哼。。。我可以确认你的签名基本字符串看起来是正确的。您可以使用您的密钥获取requestToken。查看您的签名,我看到了kPisU0TwUgiNIYpigUrKITMwo7c=我的代码中有kkdzmpirsc7qy/gJ3+cw02d9NM=。我看了看来源,什么也没跳出来。明天我需要时间再看看。你能改天再试一次并发布完整的请求/响应吗?@Adam Trachtenberg,由于
oauth\u nonce
oauth\u timestamp
的原因,签名总是不同的。我不知道还能从这里得到什么帮助。我是JOAuth的作者&我告诉你它适用于Twitter(OAuth 1)和Facebook(OAuth 2)。我的问题是,它没有从LinkedIn获得特别的请求令牌。我是JOAuth的作者&我告诉你它适用于Twitter(OAuth 1)和Facebook(OAuth 2)。我的问题是它没有从LinkedIn获得请求令牌。你是如何解决的?我在xero API中遇到了同样的错误。你是如何解决的?我在xero API中遇到了同样的错误