【问题标题】:How can I use the Azure ServiceBus EventProcessorHost library with a short-lived SAS token?如何将 Azure ServiceBus EventProcessorHost 库与短期 SAS 令牌一起使用?
【发布时间】:2017-08-31 16:52:33
【问题描述】:

我调用了一个 REST 服务,它发放短期(大约 20 分钟)SAS 令牌,以便从 Azure 事件中心读取。我想避免一个解决方案,我必须在令牌过期时每 20 分钟拆除所有侦听器并重新创建它们。库是否支持接口或回调方法,我的代码可以在库需要时或令牌过期时提供令牌?

【问题讨论】:

    标签: azure azure-eventhub event-processor-host


    【解决方案1】:

    根据我的研究,EventProcessorHost类使用AMQP协议,通过sas key namesas 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

    希望对你有帮助。

    【讨论】:

    • 感谢您的回复,但创建新密钥不是我的问题。我的问题是,当我现有的密钥过期时,我需要 EventProcessorHost 库中的一个挂钩来提供更新的密钥。到目前为止,我还没有找到一种方法来做到这一点。
    • 问题不在于生成密钥,而在于原始密钥过期后在运行时向 EventProcessorHost 库提供更新密钥的机制。
    • @PeterFriend 嗨,彼得。我使用 EPH lib 中的 registerEventProcessor 方法接收事件,并且密钥没有过期时间。您能否更新您的帖子以获取有关您遇到的任何异常的更多详细信息?
    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 2015-02-23
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多