Wie überprüfe ich die x-hub-Signatur der Instagram-Echtzeit-API in Java?
Ich verwende das Play Framework, um Consumer für die Instagram-Echtzeit-API zu entwickeln. Es konnte jedoch immer noch keine ordnungsgemäße Überprüfung der x-hub-Signatur durchgeführt werden. Wie können wir also die Signaturüberprüfung von Instagram x-hub mit Java und dem Play Framework durchführen?
Hier ist mein aktueller Code:
Aus dem Play-Framework erhalte ich die JSON-Nutzdaten mithilfe der folgenden Methode:
public static Result receiveInstaData(){
JsonNode json = request().body().asJson();
//obtain the x-hub-signature from the header
//obtain the corresponding client secret
VerificationResult verificationResult =
SubscriptionUtil.verifySubscriptionPostSignature(
clientSecret, json.toString(), xHubSignature);
if(verificationResult.isSuccess()){
//do something
}
}
Dann in derSubscriptionUtil
Ich überprüfe anhand des folgenden Codes:
public static VerificationResult verifySubscriptionPostSignature(String clientSecret, String rawJsonData, String xHubSignature) {
SecretKeySpec keySpec;
keySpec = new SecretKeySpec(clientSecret.getBytes("UTF-8"), HMAC_SHA1);
Mac mac;
mac = Mac.getInstance(HMAC_SHA1);
mac.init(keySpec);
byte[] result;
result = mac.doFinal(rawJsonData.getBytes("UTF-8"));
String encodedResult = Hex.encodeHexString(result);
return new VerificationResult(encodedResult.equals(xHubSignature), encodedResult);
}
Ich habe ein eigenständiges Python-Skript erstellt, das die instagram-python-Implementierung kopiert, und beide führen zu denselben Ergebnissen für dieselbenclientSecret
undjsonString
. Vielleicht sollte ich mit rohen Binärdaten anstelle von String versehen.
Nehmen wir an, wir benötigen rohe Binärdaten für die JSON-Anforderung. Dann muss ich meinen benutzerdefinierten BodyParser erstellen, um die JSON-Anforderung in rohe Binärdaten zu analysieren. [5]
Verweise:
[1-4]http://pastebin.com/g4uuDwzn (SO darf ich nicht mehr als 2 Links posten, daher füge ich alle Referenzen hier ein. Die Links enthalten die Signaturüberprüfung in Ruby, Python und PHP.)
[5]https://groups.google.com/forum/#!msg/play-framework/YMQb6yeDH5o/jU8FD--yVPYJ
[6] Mein eigenständiges Python-Skript: #! / usr / bin / env Python
import sys
import hmac
import hashlib
hc_client_secret = "myclientsecret"
hc_raw_response = "[{\"subscription_id\":\"1\",\"object\":\"user\",\"object_id\":\"1234\",\"changed_aspect\":\"media\",\"time\":1297286541},{\"subscription_id\":\"2\",\"object\":\"tag\",\"object_id\":\"nofilter\",\"changed_aspect\":\"media\",\"time\":1297286541}]"
client_secret = hc_client_secret
raw_response = hc_raw_response
if len(sys.argv) != 3:
print 'Usage verify_signature <client_secret> <raw_response>.\nSince the inputs are invalid, use the hardcoded value instead!'
else:
client_secret = sys.argv[1]
raw_response = sys.argv[2]
print "client_secret = " + client_secret
print "raw_response = " + raw_response
digest = hmac.new(client_secret.encode('utf-8'), msg=raw_response.encode('utf-8'), digestmod=hashlib.sha1).hexdigest()
print digest