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 derSubscriptionUtilIch ü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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage