簡體   English   中英

SAS token generation for calling azure rest API in JAVA

[英]SAS token generation for calling azure rest API in JAVA

I am trying to generate an SAS token using the code snippet given in the azure IoT Hub documentation, to call a GET devices API in IoT Hub( https://iot-hub-name.azure-devices.net/devices?api-版本=2020-03-13 )。 代碼是

private static String GetSASToken(String resourceUri, String keyName, String key)
    {
        long epoch = System.currentTimeMillis()/1000L;
        int week = 60*60*24*7;
        String expiry = Long.toString(epoch + week);

        String sasToken = null;
        try {
            String stringToSign = URLEncoder.encode(resourceUri, "UTF-8") + "\n" + expiry;
            String signature = getHMAC256(key, stringToSign);
            sasToken = "SharedAccessSignature sr=" + resourceUri +"&sig=" +
                    URLEncoder.encode(signature, "UTF-8") + "&se=" + expiry + "&skn=" + keyName;
        } 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;
  }

然后我將生成 SAS 令牌方法稱為,

String sasToken= GetSASToken("https://<iot-hub-name>.azure-devices.net", "shared access policy name", "primary key of the shared access policy");

但是生成的 SAS 令牌給出了 401 Unauthorized,這意味着生成的令牌不正確。 誰能幫我解決這個問題?

我認為您正在使用本文檔中的代碼? 雖然 IoT 中心確實公開了 EventHub,但這不是調用 API 的正確 SAS 令牌。

您可以使用Java SDK生成您的令牌。 如果您堅持自己編寫代碼, 這個 class包含您正在尋找的代碼。 class 將從服務連接字符串中檢索您需要的值,但您可以輕松地將其省略。 連接字符串僅具有您還具有的值:

HostName=<hub-name>;SharedAccessKeyName=<policy-name>;SharedAccessKey=<access-key>

我鏈接的 class 從該字符串中提取值並在private String buildToken()方法中使用它們,該方法包含您正在重新實現的代碼。

另請注意,在您的問題中,您使用https://<iot-hub-name>.azure-devices.net作為資源名稱,對於此令牌(就像在連接字符串中一樣),您可以https://

要完成我的回答,您可以將構造函數更改為此,您將獲得令牌:

public IotHubServiceSasToken(String hubName, String keyValue, String keyName)
    {            
        this.resourceUri = hubName;
        this.keyValue = keyValue;
        this.keyName = keyName;
        this.expiryTime = buildExpiresOn();
        this.token =  buildToken();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM