Java Magento Rest Oauth API(签名无效)401
当我试图从Java中的Magento获取数据时,我遇到了一个签名无效的问题。我的代码有什么问题: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(
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...
}