我正在使用Play框架爲Instagram實時API開發消費者。但仍然無法正確執行x-hub簽名驗證。那麼,我們如何使用Java和Play框架來執行Instagram x-hub-signature驗證?如何在Java中驗證Instagram實時API x-hub-signature?
這裏是我當前的代碼:
在Play框架,我用這種方法獲得的JSON有效載荷:
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 } }
然後
SubscriptionUtil
裏面,我用這個下進行驗證代碼: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); }
我創建了一個獨立的Python腳本,它複製了instagram-python實現,並且它們對於相同的clientSecret
和jsonString
產生相同的結果。也許我應該提供原始二進制數據而不是字符串。
如果讓我們說我們需要一個JSON請求的原始二進制數據,然後我需要創建我的自定義BodyParser解析JSON請求原始二進制數據[5]
參考文獻:
[1- 4] http://pastebin.com/g4uuDwzn(SO不允許我發佈超過2個鏈接,所以我把所有的引用在這裏。這些鏈接包含在Ruby中,Python的簽名驗證和PHP)
[5] https://groups.google.com/forum/#!msg/play-framework/YMQb6yeDH5o/jU8FD--yVPYJ
[6]我的標準ne python腳本: #!/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