【问题标题】:Generate Azure SAS Token on Android在 Android 上生成 Azure SAS 令牌
【发布时间】:2015-08-14 02:24:13
【问题描述】:

尝试生成 Azure SAS 令牌以便能够使用服务总线 REST Api。

找到这个链接:

http://blog.simontimms.com/2015/01/30/sending-message-to-azure-service-bus-using-rest/

如何在 Android 上实现相同的功能?

我当前的尝试如下所示:

private String generateSasToken(String uri, String keyName, String key){
    String ret = "";

    long tokenExpirationTime = (System.currentTimeMillis() / 1000) + (10 * 365 * 24 * 60 * 60);

    try {
        String stringToSign = new URL(uri).toString() + "\n" + tokenExpirationTime;
        SecretKey secretKey = null;

        byte[] keyBytes = key.getBytes("UTF-8");

        Mac mac = Mac.getInstance("HMACSHA256");

        secretKey = new SecretKeySpec(keyBytes, mac.getAlgorithm());

        mac.init(secretKey);

        String signature = Base64.encodeToString(mac.doFinal(stringToSign.getBytes("UTF-8")), Base64.DEFAULT);
        ret = String.format("SharedAccessSignature sr=%s&sig=%s&se=%s&skn=%s",
                URLEncoder.encode(uri),
                URLEncoder.encode(signature),
                String.valueOf(tokenExpirationTime),
                keyName);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    return ret;
}

使用 Postman 调用服务总线的 Rest API 后,我得到以下信息:

401 40103:授权令牌签名无效 时间 261 毫秒


更新:找到此链接

https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-android-get-started/

在第 6 节下是 android 的代码

【问题讨论】:

    标签: java android azure hash servicebus


    【解决方案1】:

    我没有Android环境可以测试,我只有java环境有类似的场景,它工作正常,以下是我的代码:

    private static String generateSasToken(String uri, String keyName, String key){
            String ret = "";
    
           // long tokenExpirationTime = (System.currentTimeMillis() / 1000) + (10 * 365 * 24 * 60 * 60);
    
            Date now = new Date();
            Date previousDate=new Date(1970);
            long tokenExpirationTime = ((now.getTime() - previousDate.getTime()) / 1000 )+3600;
    
            try {
                String stringToSign = URLEncoder.encode(new URL(uri).toString(),java.nio.charset.StandardCharsets.UTF_8.toString()) + "\n" + tokenExpirationTime;
    
                System.out.println(stringToSign);
                SecretKey secretKey = null;
    
                byte[] keyBytes = key.getBytes("UTF-8");
    
                Mac mac = Mac.getInstance("HMACSHA256");
    
                secretKey = new SecretKeySpec(keyBytes, mac.getAlgorithm());
    
                mac.init(secretKey);
    
                byte[] digest = mac.doFinal(stringToSign.getBytes());
                //We then use the composite signing key to create an oauth_signature from the signature base string
                String signature = Base64.encodeBase64String(digest);
                System.out.println( URLEncoder.encode(signature, java.nio.charset.StandardCharsets.UTF_8.toString()));
               // String signature = Base64.encodeBase64String(mac.doFinal(stringToSign.getBytes("UTF-8")));
                ret = String.format("SharedAccessSignature sr=%s&sig=%s&se=%s&skn=%s",
                        URLEncoder.encode(uri, java.nio.charset.StandardCharsets.UTF_8.toString()),
                        URLEncoder.encode(signature, java.nio.charset.StandardCharsets.UTF_8.toString()),
                        String.valueOf(tokenExpirationTime),
                        keyName);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    
            return ret;
        }
    

    我更改了两个地方,1)tokenExpirationTime 2)URLEncoder.encode String stringTosign,请尝试我的建议,希望能给你一些提示。

    【讨论】:

    • Jambor,您能否更新此答案。我正在尝试在 Android 设备上生成令牌。这是我今天早些时候提出的问题:stackoverflow.com/questions/42005370/…
    • @jambor-msft 你觉得这段代码还能重用吗?
    【解决方案2】:

    我不知道这是否对你有帮助,但这里有一个 C# 示例:

    class Program
    {
    
        static void Main(string[] args)
        {
    
            var sasToken = createToken("yournamespace.servicebus.windows.net”,  
               "device_send_listen", "xxxxxxx");
        }
    
        private static string createToken(string resourceUri, string keyName, string key)
        {
    
            TimeSpan sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
            var expiry = Convert.ToString((int)sinceEpoch.TotalSeconds + 3600); //EXPIRES in 1h 
            string stringToSign = HttpUtility.UrlEncode(resourceUri) + "\n" + expiry;
            HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key));
            var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
    
            var sasToken = String.Format(CultureInfo.InvariantCulture,
            "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
                HttpUtility.UrlEncode(resourceUri), HttpUtility.UrlEncode(signature), expiry, keyName);
    
            return sasToken;
        }
    }
    

    【讨论】:

    • 什么是“xxxxxxx”作为参数,我应该在那里使用什么值? device_send_listen 是设备资源管理器添加的设备名称吗?我连接的设备是 CC3200 ti 启动板,我想确保一切正常。
    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2019-01-14
    • 2020-05-29
    • 2020-03-29
    • 2020-03-08
    • 2018-12-12
    相关资源
    最近更新 更多