Puisque je veux l'utiliser depuis Android, Base64.encodeBase64String (); n'est pas utilisé. Puisque j'étudie, j'écrirai le code de sortie pour confirmation tel quel, et j'espère qu'il sera utile pour ceux qui étudient comme moi.
import java.net.URLEncoder;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.util.TreeMap;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Mac;
import android.util.Base64;  //← Utilisez ceci lors de l'utilisation d'Android
//import java.util.Base64;← Utilisez ceci lors de l'utilisation à partir de Java normal
public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
            
        String queryString = "";
        String host = "http://<yourCloudStackHost>/client/api";
     String apiUrl = "";
        String apiKey = "yourApiKey";
        Key secKey = new SecretKeySpec("yourSecretKey".getBytes(),"HmacSHA1");
        TreeMap<String,String> params = new TreeMap<>();
        params.put("response","json");
        params.put("command","listZones");
        params.put("apikey",apiKey);
        
        for(String key:params.keySet()){
            if(queryString.isEmpty()){
                queryString = key + "=" + params.get(key);
            }else{
                queryString = queryString + "&" + key + "=" + params.get(key);
            }
            //System.out.println(key + "=" + params.get(key));
            System.out.println(queryString);
        }
        String queryStringLow = queryString.toLowerCase();
        System.out.println(queryStringLow);
        //Hash avec HMAC SHA1 à l'aide d'une clé secrète
        Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(secKey);
        byte[] digest = mac.doFinal(queryStringLow.getBytes());
        //Encodage BASE64
        String b64 = Base64.getEncoder().encodeToString(digest);
        //Encodage d'URL
        String signature = URLEncoder.encode(b64);
        signature = signature.replaceAll("%0A",""); //Suppression du code de saut de ligne
    //Génération d'URL
    apiUrl = host + "?" + queryString + "&signature=" + signature;
        //Pour le débogage
        System.out.println(digest);
        System.out.println(b64);
        System.out.println(signature);
        System.out.println(queryString + "&signature=" + signature);
        System.out.println(apiUrl);
                
    }
}
Dans apiURL,
http://<yourCloudStackHost>/client/api?apikey=<yourApiKey>&command=listZones&response=json&signature=<yourSignature>
Il devrait arriver, alors copiez-le et essayez d'y accéder avec un terminal, etc.
curl -s 'http://<yourCloudStackHost>/client/api?apikey=<yourApiKey>&command=listZones&response=json&signature=<yourSignature>' | jq -C
Résultat de la réponse
{
  "listzonesresponse": {
    "count": 3,
    "zone": [
      {
        "id": "e8ebfccb-eb38-43ed-8abf-XXXX",
        "name": "weber",
        "networktype": "Advanced",
        "securitygroupsenabled": false,
        "allocationstate": "Enabled",
        "zonetoken": "42101a12-6299-32c7-a324-XXXX",
        "dhcpprovider": "VirtualRouter",
        "localstorageenabled": true,
        "tags": []
      },
      {
        "id": "95c8746d-57b3-421f-9375-XXXX",
        "name": "lux",
        "networktype": "Advanced",
        "securitygroupsenabled": false,
        "allocationstate": "Enabled",
        "zonetoken": "de9e9a4f-696d-39f4-bb3e-XXXX",
        "dhcpprovider": "VirtualRouter",
        "localstorageenabled": true,
        "tags": []
      },
      {
        "id": "f4583787-7bff-461a-b026-XXXX",
        "name": "farad",
        "networktype": "Advanced",
        "securitygroupsenabled": false,
        "allocationstate": "Enabled",
        "zonetoken": "a53d8e78-3c77-3352-8a04-XXXX",
        "dhcpprovider": "VirtualRouter",
        "localstorageenabled": true,
        "tags": []
      }
    ]
  }
}
Résultat de la réponse lorsque la signature, etc. est incorrecte
{
  "listzonesresponse": {
    "errorcode": 401,
    "errortext": "unable to verify user credentials and/or request signature"
  }
}
        Recommended Posts