签名无效 - 提供的签名与来自 Android 的 WooCommerce REST API 调用不匹配
Invalid Signature - provided signature does not match WooCommerce REST API calling from Android
我是一名 Android 开发人员,是 Woocommerce 的新手,开始使用带有 Oauth1.0 身份验证的 REST 服务。当我从我的 android 应用程序调用时,我从 PostMan(RestClient 插件)得到正确的响应并收到 "Invalid Signature" 错误。
这是我的 Android 代码:
OAuthParameters oauth;
public OAuthParameters authChecking() {
oauth = new OAuthParameters();
GenericUrl genericUrl = new GenericUrl("http://localhost/wordpress/wc-api/v3/products/count");
oauth.consumerKey = "ck_xxxxxxxxxxxxxxxxxxxxxxxxxxx";
oauth.signatureMethod = "HMAC-SHA1";
oauth.version = "3.0";
oauth.computeTimestamp();
oauth.computeNonce();
oauth.signer = new OAuthSigner() {
@Override
public String getSignatureMethod() {
return oauth.signatureMethod;
}
@Override
public String computeSignature(String signatureBaseString) throws GeneralSecurityException {
String key = "cs_xxxxxxxxxxxxxxxxxxxxxxxxxx";
Mac mac = Mac.getInstance(
"HmacSHA1");
SecretKeySpec secret = new SecretKeySpec(key.getBytes(), "HmacSHA1");
mac.init(secret);
byte[] digest = mac.doFinal(signatureBaseString.getBytes());
Log.e("SIGNATURE Base64", new String(Base64.encode(digest, 0)).trim());
String signature = new String(com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64.encodeBase64String(digest));
return signature;
}
};
try {
oauth.computeSignature("GET", genericUrl);
} catch (GeneralSecurityException e) {
e.printStackTrace();
return null;
} catch (NullPointerException e) {
e.printStackTrace();
return null;
}
methodSignatureTest();
return oauth;
}
@Override
public void requestAPI(Object... param) {
OAuthParameters oauth = authChecking();
if (oauth != null) {
String url = null;
try {
Toast.makeText(MainActivity.this, "Signature retrive called", Toast.LENGTH_SHORT).show();
url = "http://localhost/wordpress/wc-api/v3/products/"+"count?oauth_consumer_key=" + oauth.consumerKey + "&oauth_signature_method=" + oauth.signatureMethod + "&oauth_timestamp=" + oauth.timestamp + "&oauth_nonce=" + oauth.nonce + "&oauth_version=" + oauth.version + "&oauth_signature="
// + java.net.URLDecoder.decode(oauth.signature, "UTF-8");
+ URLEncoder.encode(oauth.signature, "UTF-8");
// +oauth.signature;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
url = null;
}
Log.v("URL ", url);
Log.v("SINGNATURE ", oauth.signature);
getDataFromWeb_Get.getData(this, this, new String[]{"http://localhost/wordpress/wc-api/v3/products/", url});
}
}
我在 google 上搜索了生成签名的方法,但都说了相同的代码。我使用此工具 http://oauth.googlecode.com/svn/code/javascript/example/signature.html 来验证签名但无法验证,因为 PostMan、此工具和 android 生成的签名彼此不同。
您必须按顺序发送所有参数。就像我们在 php
中有一个代码
uksort( $params, 'strcmp' );
查看如何对 android 中的参数进行排序。
经过几天的研究,我也遇到了同样的问题,终于找到了解决方案,希望这对其他人有所帮助
我浏览各种文件
1)Using the WooCommerce REST API – Introduction
3)Scribe
在参考了上述文档和源代码之后,我最终创建了一个库,它为 woocommerce HTTP android
执行 OAuth 1.0a“单腿”身份验证
完整描述已添加到我的图书馆的自述部分
在此处检查图书馆
我是一名 Android 开发人员,是 Woocommerce 的新手,开始使用带有 Oauth1.0 身份验证的 REST 服务。当我从我的 android 应用程序调用时,我从 PostMan(RestClient 插件)得到正确的响应并收到 "Invalid Signature" 错误。
这是我的 Android 代码:
OAuthParameters oauth;
public OAuthParameters authChecking() {
oauth = new OAuthParameters();
GenericUrl genericUrl = new GenericUrl("http://localhost/wordpress/wc-api/v3/products/count");
oauth.consumerKey = "ck_xxxxxxxxxxxxxxxxxxxxxxxxxxx";
oauth.signatureMethod = "HMAC-SHA1";
oauth.version = "3.0";
oauth.computeTimestamp();
oauth.computeNonce();
oauth.signer = new OAuthSigner() {
@Override
public String getSignatureMethod() {
return oauth.signatureMethod;
}
@Override
public String computeSignature(String signatureBaseString) throws GeneralSecurityException {
String key = "cs_xxxxxxxxxxxxxxxxxxxxxxxxxx";
Mac mac = Mac.getInstance(
"HmacSHA1");
SecretKeySpec secret = new SecretKeySpec(key.getBytes(), "HmacSHA1");
mac.init(secret);
byte[] digest = mac.doFinal(signatureBaseString.getBytes());
Log.e("SIGNATURE Base64", new String(Base64.encode(digest, 0)).trim());
String signature = new String(com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64.encodeBase64String(digest));
return signature;
}
};
try {
oauth.computeSignature("GET", genericUrl);
} catch (GeneralSecurityException e) {
e.printStackTrace();
return null;
} catch (NullPointerException e) {
e.printStackTrace();
return null;
}
methodSignatureTest();
return oauth;
}
@Override
public void requestAPI(Object... param) {
OAuthParameters oauth = authChecking();
if (oauth != null) {
String url = null;
try {
Toast.makeText(MainActivity.this, "Signature retrive called", Toast.LENGTH_SHORT).show();
url = "http://localhost/wordpress/wc-api/v3/products/"+"count?oauth_consumer_key=" + oauth.consumerKey + "&oauth_signature_method=" + oauth.signatureMethod + "&oauth_timestamp=" + oauth.timestamp + "&oauth_nonce=" + oauth.nonce + "&oauth_version=" + oauth.version + "&oauth_signature="
// + java.net.URLDecoder.decode(oauth.signature, "UTF-8");
+ URLEncoder.encode(oauth.signature, "UTF-8");
// +oauth.signature;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
url = null;
}
Log.v("URL ", url);
Log.v("SINGNATURE ", oauth.signature);
getDataFromWeb_Get.getData(this, this, new String[]{"http://localhost/wordpress/wc-api/v3/products/", url});
}
}
我在 google 上搜索了生成签名的方法,但都说了相同的代码。我使用此工具 http://oauth.googlecode.com/svn/code/javascript/example/signature.html 来验证签名但无法验证,因为 PostMan、此工具和 android 生成的签名彼此不同。
您必须按顺序发送所有参数。就像我们在 php
中有一个代码uksort( $params, 'strcmp' );
查看如何对 android 中的参数进行排序。
经过几天的研究,我也遇到了同样的问题,终于找到了解决方案,希望这对其他人有所帮助 我浏览各种文件
1)Using the WooCommerce REST API – Introduction
3)Scribe
在参考了上述文档和源代码之后,我最终创建了一个库,它为 woocommerce HTTP android
执行 OAuth 1.0a“单腿”身份验证完整描述已添加到我的图书馆的自述部分
在此处检查图书馆