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

  1. Generierung einer zufälligen Zeichenfolge zu erstellen, die ein Salz (in PHP, die Sie verwenden würden, mt_and (), um dies zu tun)
  2. 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)
  3. base64-Kodierung der Signatur (in PHP, die Sie verwenden würden, base64_encode (), um dies zu tun)
  4. 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 kopieren 0 bytes. Tauschen salt.length und 0 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.
InformationsquelleAutor Arun P Johny | 2011-03-12
Schreibe einen Kommentar