So erstellen Sie eine Signatur mit HMACSHA1 und geheimen Schlüssel, um die Verbindung zu Kayako API
Ich versuche, eine Verbindung zu einem Drittanbieter-Anwendung-API, apache commons HTTP-Client. Die API, die ich versuche zu verbinden ist http://wiki.kayako.com/display/DEV/REST+ - API.
Die API verlangt von mir, übergeben Sie einen API-key und eine Signatur-zusammen mit Salz verwendet, um eine Signatur zu erstellen.
Gemäß der API-Dokumentation der Schritte, die zum erstellen der Signatur
- Generierung einer zufälligen Zeichenfolge zu erstellen, die ein Salz (in PHP, die Sie verwenden würden, mt_and (), um dies zu tun)
- Erzeugen der Signatur, die von der Vermischung des Salzes mit SHA256 mit dem geheimen Schlüssels als den Schlüssel (in PHP, die Sie verwenden würden, hash_hmac (), um dies zu tun)
- base64-Kodierung der Signatur (in PHP, die Sie verwenden würden, base64_encode (), um dies zu tun)
- URL-codieren, den Ausgang (in PHP, die Sie verwenden würden, urlencode (), um dies zu tun)
AKTUALISIERT
Als pro die Antworten, die ich bekam, habe ich einige änderungen an meinem code und erstellt ein demo-Konto mit Kayako zum testen der API
Bin ich über die folgende Klasse zum generieren der Signatur
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.GeneralSecurityException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.util.encoders.Base64Encoder;
public class GenSign2 {
public static void main(String[] args) throws GeneralSecurityException,
IOException {
String secretKey = "M2Y2YjkxZDEtYmNlOC1mYmI0LTkxZTgtOTNiY2RiMDhmN2E2YjExNGUwYjktNGJkYy1jZTM0LWQ1MWYtZGIwYWRlZTE0NGNh";
String salt = "0123456789";
String generateHmacSHA256Signature = generateHmacSHA256Signature(salt,
secretKey);
System.out.println("Signature: " + generateHmacSHA256Signature);
String urlEncodedSign = URLEncoder.encode(generateHmacSHA256Signature,
"UTF-8");
System.out.println("Url encoded value: " + urlEncodedSign);
}
public static String generateHmacSHA256Signature(String data, String key)
throws GeneralSecurityException, IOException {
byte[] hmacData = null;
try {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"),
"HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secretKey);
hmacData = mac.doFinal(data.getBytes("UTF-8"));
ByteArrayOutputStream bout = new ByteArrayOutputStream();
new Base64Encoder().encode(hmacData, 0, hmacData.length, bout);
return bout.toString("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new GeneralSecurityException(e);
}
}
}
Und die test-api ist wie folgt
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
public class TestApi {
public static void main(String[] args) throws ClientProtocolException,
IOException, URISyntaxException {
HttpClient client = new DefaultHttpClient();
List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("apikey",
"f165dc40-ce3f-6864-7d5e-27a7188b2e62"));
qparams.add(new BasicNameValuePair("salt", "0123456789"));
qparams.add(new BasicNameValuePair("signature", "mbrhpXkP0LzNMNDygHAorqMx%2FDGovl%2FauMTOMB6RNMA%3D"));
HttpPost httpget = new HttpPost(
"http://aruntest.kayako.com/api/index.php?e=/Core/Test");
HttpResponse response = client.execute(httpget);
System.out.println(response.getProtocolVersion());
System.out.println(response.getStatusLine().getStatusCode());
System.out.println(response.getStatusLine().getReasonPhrase());
System.out.println(response.getStatusLine().toString());
}
}
Die demo-Website zugegriffen werden kann, mit
URL: http://aruntest.kayako.com/admin/
User: admin
Passwort: ty386rhjzz
Es wirft ein nicht autorisierter access exception wenn ich versuche zu verbinden.
- In Ihren vier Schritte zum erstellen der Signatur, ich sehe keine Referenz auf die Daten, die Sie versuchen, zu Unterschreiben. Habe eine URL auf die aktuelle API-Dokumentation? 🙂
- Ich glaube, du hast ein problem mit dem ersten Aufruf
System.arraycopy()
-- es scheint, Sie kopieren0
bytes. Tauschensalt.length
und0
bei der ersten Aufforderung, und sehen, ob dies verbessert die situation. - Ich bin versucht, eine Verbindung zu wiki.kayako.com/display/DEV/REST+ - API
- hervorragend, danke für den link.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, und vergleichen Sie Ihre Signatur-Methode mit diesem (es funktioniert)
Den Ergebnis dieser Aufruf, dann werden die Wert von Ihrem Attribut Signatur
Eine einfache Möglichkeit zum erzeugen eines Salz - /nonce
Sehen Beispiel:
BASE64Encoder
hier verwendet?sun.misc.BASE64Encoder
. Sie können jeden Geschmack, die Sie wollen.Kayako hat aktualisiert Ihre Dokumentation mit einer neuen java-Beispiel, welches einwandfrei funktioniert.
Ich glaube, die ganze
getSaltedKey()
routine ist unnötig. Du bist einfach der Unterzeichnung des salt (es hätte als eine nonce) mit HMAC und der Unterzeichnung mit dem mitgelieferten Schlüssel, es nicht so Aussehen, wie Sie sollen, Unterschreiben Sie die Taste+Salz.