CreateAccount
开源客户端访问云消息队列 RabbitMQ 版服务端时,需要传入用户名和密码进行权限认证,认证通过才允许访问服务端。云消息队列 RabbitMQ 版支持通过阿里云访问控制(RAM)的AccessKey和AccessKey Secret生成用户名和密码。
背景信息
开源客户端访问云消息队列 RabbitMQ 版服务端时,需要传入用户名和密码进行权限认证,认证通过才允许访问服务端。
云消息队列 RabbitMQ 版支持通过阿里云访问控制(RAM)的AccessKey和AccessKey Secret生成用户名和密码。
注意事项
- 创建静态用户名密码所属的实例需处于服务中状态。
- 一个实例下的AccessKey和静态用户名密码一一对应,即一个实例下的一个AccessKey只能创建一个静态用户名密码。
- 如果需要更新静态用户名密码,您可以删除该静态用户名密码后重新创建。
用户名计算示例代码
请求参数中的userName的参数值,需要由实例ID和AccessKey ID构造字符串并进行Base64编码得出。具体的计算方法如下:
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Base64Utils {
public static final Charset UTF8 = StandardCharsets.UTF_8;
/**
*解码base64字符串
* @param str
* @return
*/
public static String decode(String str) {
return new String(Base64.getDecoder().decode(str.getBytes(UTF8)), UTF8);
}
public static String encode(String bytes) {
return new String(Base64.getEncoder().encode(bytes.getBytes(UTF8)), UTF8);
}
public static void main(String[] args) {
//使用您的实例ID以及购买该实例的账号AK,组成字符串。
String str = "2:${instanceId}:${ak}";
//生成API使用的userName。
String userName = encode(str);
System.out.println("userName=" + userName);
String decodeStr = decode(userName);
System.out.println("originStr=" + decodeStr);
}
}
签名算法示例代码
请求参数中signature和secretSign的参数值,需要由指定的静态用户名的创建时间戳和AccessKey Secret进行加密算法计算得出。具体的算法和示例代码如下:
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
public class SignatureUtils {
public static String hamcsha1(byte[] data, byte[] key) throws NoSuchAlgorithmException, InvalidKeyException {
SecretKeySpec signingKey = new SecretKeySpec(key, "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
return byte2hex(mac.doFinal(data));
}
public static String byte2hex(byte[] b) {
StringBuilder hs = new StringBuilder();
String stmp;
for (int n = 0; b != null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1) {
hs.append('0');
}
hs.append(stmp);
}
return hs.toString().toUpperCase();
}
public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException {
//createTimestamp即是API的createTimestamp参数。
String createTimestamp= String.valueOf(System.currentTimeMillis());
System.out.println("createTimestamp:" + createTimestamp);
//您账号的sk。
String sk = "${sk}";
//生成API使用的SecretSign。
String SecretSign = hamcsha1(sk.getBytes(), createTimestamp.getBytes());
System.out.println("SecretSign:" + SecretSign);
//生成API使用的signature。
String signature = hamcsha1(createTimestamp.getBytes(), sk.getBytes());
System.out.println("signature:" + signature);
}
}
调试
您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可以自动生成SDK代码示例。
请求参数
名称 |
类型 |
是否必选 |
示例值 |
描述 |
Action | String | 是 | CreateAccount | 系统规定参数。取值:CreateAccount。 |
instanceId | String | 是 | amqp-cn-********* | 消息队列RabbitMQ版实例的ID,表示您需要为哪个实例创建静态用户名密码。 |
accountAccessKey | String | 是 | LTAI5t8be*******tEJ6vfo | 您的阿里云账号或RAM用户的AccessKey ID。获取方式,请参见创建AccessKey。 说明 如果您使用RAM用户的AccessKey创建的静态用户名密码接入消息队列RabbitMQ版并收发消息,请确保该RAM用户已被授予收发消息权限。更多信息,请参见RAM权限策略。 |
userName | String | 是 | LTAI5***********eRZtEJ6vfo | 待创建的静态用户名。 该参数值由实例ID和AccessKey ID构造的字符串经过Base64编码得出,具体计算方法,请参见本文中的用户名计算示例代码。 |
signature | String | 是 | 22c2d7d1769cb53c5a6d9213248e2de524****** | 签名,系统将根据请求参数中的签名、AccessKey Secret签名和用户名计算出静态用户密码。 签名由指定的用户名创建时间戳和AccessKey ID进行HmacSHA1加密算法计算得出。具体计算方法,请参见本文中的签名算法示例代码。 |
createTimestamp | Long | 是 | 1671175303522 | 指定该用户名密码创建的时间戳。单位:毫秒。 说明 该时间戳用于计算静态用户密码,由您自定义设置。不是系统生成用户名密码时的时间戳。 |
secretSign | String | 是 | 4c1a6367ce4c4255e9617326f9133ac635****** | AccessKey Secret签名,系统将根据请求参数中的签名、AccessKey Secret签名和用户名计算出静态用户密码。 AccessKey Secret签名由指定的用户名创建时间戳和AccessKey ID进行HmacSHA1加密算法计算得出。具体计算方法,请参见本文中的签名算法示例代码。 |
返回数据
名称 |
类型 |
示例值 |
描述 |
RequestId | String | FEBA5E0C-50D0-4FA6-A794-4901E5465*** | 请求ID。 |
Code | Integer | 200 | 返回码。返回200代表成功。 |
Message | String | operation success | 返回信息。 |
Success | Boolean | true | 执行结果是否成功。 |
Data | Object | 返回数据。 |
|
AccessKey | String | LTAI5***********eRZtEJ6vfo | 创建该用户名密码所使用的AccessKey ID。 |
Password | String | OUYwQzM2QjZBRkUxNDRFM***************MzZCNzdDQzoxNjcxNDMwMzkyODI1 | 创建的静态用户密码。 |
CreateTimeStamp | Long | 1671175303522 | 创建用户名密码的时间戳。单位:毫秒。 |
InstanceId | String | amqp-cn-********* | 消息队列RabbitMQ版实例的ID。 |
MasterUId | Long | 1565*******973901 | 创建静态用户名密码的AccessKey所属的阿里云账号或RAM用户的账号ID。 |
UserName | String | MjphbXFwLWNuLXVxbTJ6cjc2djAwMzpMVEFJNX*******ZNMWVSWnRFSjZ2Zm8= | 创建的静态用户名。 |
示例
请求示例
http(s)://[Endpoint]/?Action=CreateAccount
&instanceId=amqp-cn-*********
&accountAccessKey=LTAI5t8be*******tEJ6vfo
&userName=LTAI5***********eRZtEJ6vfo
&signature=22c2d7d1769cb53c5a6d9213248e2de524******
&createTimestamp=1671175303522
&secretSign=4c1a6367ce4c4255e9617326f9133ac635******
&公共请求参数
正常返回示例
XML
格式
HTTP/1.1 200 OK
Content-Type:application/xml
<CreateAccountResponse>
<RequestId>FEBA5E0C-50D0-4FA6-A794-4901E5465***</RequestId>
<Code>200</Code>
<Message>operation success</Message>
<Success>true</Success>
<Data>
<AccessKey>LTAI5***********eRZtEJ6vfo</AccessKey>
<Password>OUYwQzM2QjZBRkUxNDRFM***************MzZCNzdDQzoxNjcxNDMwMzkyODI1</Password>
<CreateTimeStamp>1671175303522</CreateTimeStamp>
<InstanceId>amqp-cn-*********</InstanceId>
<UserName>MjphbXFwLWNuLXVxbTJ6cjc2djAwMzpMVEFJNX*******ZNMWVSWnRFSjZ2Zm8=</UserName>
</Data>
</CreateAccountResponse>
JSON
格式
HTTP/1.1 200 OK
Content-Type:application/json
{
"RequestId" : "FEBA5E0C-50D0-4FA6-A794-4901E5465***",
"Code" : 200,
"Message" : "operation success",
"Success" : true,
"Data" : {
"AccessKey" : "LTAI5***********eRZtEJ6vfo",
"Password" : "OUYwQzM2QjZBRkUxNDRFM***************MzZCNzdDQzoxNjcxNDMwMzkyODI1",
"CreateTimeStamp" : 1671175303522,
"InstanceId" : "amqp-cn-*********",
"UserName" : "MjphbXFwLWNuLXVxbTJ6cjc2djAwMzpMVEFJNX*******ZNMWVSWnRFSjZ2Zm8="
}
}
错误码
访问错误中心查看更多错误码。
控制台操作
除了调用CreateAccount接口,您还可以通过云消息队列 RabbitMQ 版控制台创建静态用户名密码。具体操作,请参见静态用户名密码管理。