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