Java Magento Rest Oauth API(签名无效)401

Java Magento Rest Oauth API(签名无效)401,java,magento,oauth,Java,Magento,Oauth,当我试图从Java中的Magento获取数据时,我遇到了一个签名无效的问题。我的代码有什么问题: public class MagentoFacade { final String MAGENTO_API_KEY = "apikey"; final String MAGENTO_API_SECRET = "apisecret"; final String MAGENTO_REST_API_URL = "urlmagento/api/rest"; public void testMethod(

当我试图从Java中的Magento获取数据时,我遇到了一个签名无效的问题。我的代码有什么问题:

public class MagentoFacade {

final String MAGENTO_API_KEY = "apikey";
final String MAGENTO_API_SECRET = "apisecret";
final String MAGENTO_REST_API_URL = "urlmagento/api/rest";

public void testMethod() {

    OAuthService service = new ServiceBuilder()
    .provider(MagentoThreeLeggedOAuth.class)
    .apiKey(MAGENTO_API_KEY)
    .apiSecret(MAGENTO_API_SECRET)
    .debug()
    .build();




    System.out.println("" + service.getVersion());

    // start
            Scanner in = new Scanner(System.in);
            System.out.println("Magento's OAuth Workflow");
            System.out.println();
            // Obtain the Request Token
            System.out.println("Fetching the Request Token...");
            Token requestToken = service.getRequestToken();
            System.out.println("Got the Request Token!");
            System.out.println();

             // Obtain the Authorization URL
            System.out.println("Fetching the Authorization URL...");
            String authorizationUrl = service.getAuthorizationUrl(requestToken);
            System.out.println("Got the Authorization URL!");
            System.out.println("Now go and authorize Main here:");
            System.out.println(authorizationUrl);
            System.out.println("And paste the authorization code here");
            System.out.print(">>");
            Verifier verifier = new Verifier(in.nextLine());
            System.out.println();

            System.out.println("Trading the Request Token for an Access Token...");
            Token accessToken = service.getAccessToken(requestToken, verifier);
            System.out.println("Got the Access Token!");
            System.out.println("(if your curious it looks like this: "
                    + accessToken + " )");
            System.out.println();

             OAuthRequest request = new OAuthRequest(Verb.GET, MAGENTO_REST_API_URL+ "/products?limit=2");
                service.signRequest(accessToken, request);
                Response response = request.send();
                System.out.println();
                System.out.println(response.getCode());
                System.out.println(response.getBody());
                        System.out.println();
}


public static void main(String[] args) {
    MagentoFacade mf = new MagentoFacade();
    mf.testMethod();
}
}

}

签名为:NnRaB73FqCcFAAVB4evZtGkWE3k= 附加的OAuth参数:{OAuth_回调->oob,OAuth_签名->NnRaB73FqCcFAAVB4evZtGkWE3k=,OAuth_版本->1.0,OAuth_nonce->753236685,OAuth_签名方法->HMAC-SHA1,OAuth_消费者_密钥->ptrij1xt8tjisjb6kmdqed2v4rpla8av,OAuth_时间戳->1359710704} 使用Http头签名 正在发送请求。。。 响应状态代码:401 响应主体:oauth_problem=signature_invalid&debug_sbs=MCe/RB8/GNuqV0qku00ubepc/Sc= 线程“main”org.scribe.exceptions.oautheexception:响应正文中的异常不正确。无法从此中提取令牌和密码:“oauth\u problem=signature\u invalid&debug\u sbs=MCe/RB8/GNuqV0qku00ubepc/Sc=” 位于org.scribe.extractors.TokenExtractorImpl.extract(TokenExtractorImpl.java:41) 位于org.scribe.extractors.TokenExtractorImpl.extract(TokenExtractorImpl.java:27) 位于org.scribe.oauth.OAuth10aServiceImpl.getRequestToken(OAuth10aServiceImpl.java:52) 位于magento.MagentoFacade.testMethod(MagentoFacade.java:39)
在magento.MagentoFacade.main(MagentoFacade.java:73)

我可能会为您提供一个答案,但它在您的情况下可能不起作用。 我费了好大劲才弄明白为什么本地机器上的签名无效

事实证明,在Mage_Oauth_Model_服务器中计算签名时::_validateSignature(),Magento构建请求URI部分,并修剪URL端口路径
$this->\u请求->getHttpHost()

在我的例子中,本地Web服务器在端口81上运行,因此我的签名和Magento签名不匹配。 通过将
false
参数传递给
getHttpHost
方法,可以保持防止端口修剪

我知道这是非常具体的,但我弄丢了所有的头发,我想知道为什么,所以我需要分享它。谁知道呢,也许这会有帮助

干杯
布尼

我可能会给你一个答案,但对你的情况可能不起作用。 我费了好大劲才弄明白为什么本地机器上的签名无效

事实证明,在Mage_Oauth_Model_服务器中计算签名时::_validateSignature(),Magento构建请求URI部分,并修剪URL端口路径
$this->\u请求->getHttpHost()

在我的例子中,本地Web服务器在端口81上运行,因此我的签名和Magento签名不匹配。 通过将
false
参数传递给
getHttpHost
方法,可以保持防止端口修剪

我知道这是非常具体的,但我弄丢了所有的头发,我想知道为什么,所以我需要分享它。谁知道呢,也许这会有帮助

干杯
Bouni

我只想补充一点,在Postman中,我简单地添加了另一个getHttpHost的urlparameter,其值为false,这同样有效。我为此奋斗了一整天。我希望这能节省其他人的时间。

我只想补充一点,在Postman中,我简单地添加了另一个getHttpHost的urlparameter,其值为false,同样有效。我为此奋斗了一整天。我希望这能节省其他人的时间。

您机器上的时间正确吗?这是出现这种错误的一个常见原因,问题是magento中的URL与Java中的URL不同。现在我想尝试找到一种无需用户授权即可自动连接的方法。你知道一个方法吗?你说url不同是什么意思?您的意思是使用的oauth_回调url与consumer中的回调url设置不匹配吗?谢谢,JustinI有完全相同的问题,使用Scribe 1.3.7和Magento 1.9响应无效签名,而在Postman中使用相同的参数,它只是工作。任何帮助都将是巨大的。在这种情况下,它对任何人都有帮助。它与我一起工作的唯一方法我必须使用纯文本进行oAuth加密,除了什么都不起作用之外。你的机器上的时间对吗?这是出现这种错误的一个常见原因,问题是magento中的URL与Java中的URL不同。现在我想尝试找到一种无需用户授权即可自动连接的方法。你知道一个方法吗?你说url不同是什么意思?您的意思是使用的oauth_回调url与consumer中的回调url设置不匹配吗?谢谢,JustinI有完全相同的问题,使用Scribe 1.3.7和Magento 1.9响应无效签名,而在Postman中使用相同的参数,它只是工作。在这种情况下,任何帮助都将是巨大的。它对任何人都有帮助。它与我一起工作的唯一方法是我必须使用纯文本进行oAuth加密,除了什么都不起作用之外。我几乎把它标记为“不是答案”,因为它读起来像一条评论。你能不能在不参考其他评论的情况下,以一个清晰的答案的形式重新编辑这篇文章?我几乎把它标记为“不是答案”,因为它读起来像一篇评论。你能在不参考其他评论的情况下,以明确答案的形式重新编辑此内容吗?
public final class MagentoThreeLeggedOAuth extends DefaultApi10a {
private static final String BASE_URL = "urltoMagento/";

@Override
public String getRequestTokenEndpoint() {
    return BASE_URL + "oauth/initiate";
}

@Override
public String getAccessTokenEndpoint() {
    return BASE_URL + "oauth/token";
}

@Override
public String getAuthorizationUrl(Token requestToken) {
    return BASE_URL + "richard/oauth_authorize?oauth_token="
            + requestToken.getToken(); //this implementation is for admin roles only...
}