【发布时间】:2017-08-31 16:52:33
【问题描述】:
我调用了一个 REST 服务,它发放短期(大约 20 分钟)SAS 令牌,以便从 Azure 事件中心读取。我想避免一个解决方案,我必须在令牌过期时每 20 分钟拆除所有侦听器并重新创建它们。库是否支持接口或回调方法,我的代码可以在库需要时或令牌过期时提供令牌?
【问题讨论】:
标签: azure azure-eventhub event-processor-host
我调用了一个 REST 服务,它发放短期(大约 20 分钟)SAS 令牌,以便从 Azure 事件中心读取。我想避免一个解决方案,我必须在令牌过期时每 20 分钟拆除所有侦听器并重新创建它们。库是否支持接口或回调方法,我的代码可以在库需要时或令牌过期时提供令牌?
【问题讨论】:
标签: azure azure-eventhub event-processor-host
根据我的研究,EventProcessorHost类使用AMQP协议,通过sas key name和sas key进行认证。在里面找不到sas token的概念。
您可以在此处关注code 接收活动。
另外,sas token可以在发送消息到eventthub的时候找到。可以在token过期的时候用HTTP协议生成sas token。
可以参考下面java代码的sn-p。
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Base64.Encoder;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class GetSasToken {
static String sasToken = "";
public static void main(String[] args) {
sasToken = GetSASToken(<resouce url>, <your sas_keyname>,
<your sas_key>);
try {
// your business logic
} catch (Exception e) {
e.printStackTrace();
sasToken = GetSASToken("jaygong.servicebus.windows.net/test", "RootManageSharedAccessKey",
"tASE61OxG4Ci00rfI0Q56NKNXGxvNL5tRSrBZkhTjgI=");
// retry your business logic
}
}
private static String GetSASToken(String resourceUri, String keyName, String key) {
long epoch = System.currentTimeMillis() / 1000L;
int time = 60 * 20;
String expiry = Long.toString(epoch + time);
String sasToken = null;
try {
String stringToSign = URLEncoder.encode(resourceUri, "UTF-8") + "\n" + expiry;
String signature = getHMAC256(key, stringToSign);
sasToken = "SharedAccessSignature sr=" + URLEncoder.encode(resourceUri, "UTF-8") + "&sig="
+ URLEncoder.encode(signature, "UTF-8") + "&se=" + expiry + "&skn=" + keyName;
System.out.println("sasToken : " + sasToken);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return sasToken;
}
public static String getHMAC256(String key, String input) {
Mac sha256_HMAC = null;
String hash = null;
try {
sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
Encoder encoder = Base64.getEncoder();
hash = new String(encoder.encode(sha256_HMAC.doFinal(input.getBytes("UTF-8"))));
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return hash;
}
}
也可以参考official document生成sas token。
更新答案
如果您指的是Shared Access Policy 中的SharedAccessKey,则有两种方法可以更新此密钥。
第一种方法,您可以直接在门户上重新生成它。
第二种方式,您可以通过 REST API 重新生成它。 请参考这里的document。
希望对你有帮助。
【讨论】: