Java Azure Request Signing

后端 未结 2 1000
借酒劲吻你
借酒劲吻你 2021-02-06 19:38

I am using the latest Azure SDK Storage emulator. I am trying to sign a request to my blob. When I run the below code I am getting auth error.

I can\'t figure out what i

2条回答
  •  独厮守ぢ
    2021-02-06 19:57

    EDIT Where did Gaurav's answer go? :-) I believe he already answered and mentioned that you appear to be constructing a Shared Key Lite signature and should thus use "SharedKeyLite" in your authorization header.


    I think Gaurav is right in his answer, but I noticed three other issues:

    1. You seem to be making a call to http://localhost/devstoreaccount1, but you're computing a signature for http://localhost/devstoreaccount1/tweet/?comp=list. Make sure the URLs match up.
    2. For the storage emulator, I think your canonicalized resource should actually be /devstoreaccount1/devstoreaccount1/tweet/?comp=list. (Note the repetition of the account name.) It should generally be //, and for the storage emulator, the account name shows up in the path.
    3. Where's the x-ms-version header? I believe that's required.

    UPDATE Here's some working code with two methods, one that uses Shared Key and one that uses Shared Key Lite. Hopefully this clears things up. Note that to use the storage emulator, you'll want to switch the URL back to localhost:10000/devstoreaccount1. The signature code should still work for the emulator, but I haven't tested it. The Base64 library came from here: http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html.

    import java.net.*;
    import java.util.*;
    import java.text.*;
    import javax.crypto.*;
    import javax.crypto.spec.*;
    import org.apache.commons.codec.binary.Base64;
    
    public class Test
    {
        private static Base64 base64 = new Base64();
    
        public static void signRequestSK(HttpURLConnection request, String account, String key) throws Exception
        {
            SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
            fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
            String date = fmt.format(Calendar.getInstance().getTime()) + " GMT";
    
            StringBuilder sb = new StringBuilder();
            sb.append("GET\n"); // method
            sb.append('\n'); // content encoding
            sb.append('\n'); // content language
            sb.append('\n'); // content length
            sb.append('\n'); // md5 (optional)
            sb.append('\n'); // content type
            sb.append('\n'); // legacy date
            sb.append('\n'); // if-modified-since
            sb.append('\n'); // if-match
            sb.append('\n'); // if-none-match
            sb.append('\n'); // if-unmodified-since
            sb.append('\n'); // range
            sb.append("x-ms-date:" + date + '\n'); // headers
            sb.append("x-ms-version:2009-09-19\n");
            sb.append("/" + account + request.getURL().getPath() + "\ncomp:list");
    
            //System.out.println(sb.toString());
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(base64.decode(key), "HmacSHA256"));
            String authKey = new String(base64.encode(mac.doFinal(sb.toString().getBytes("UTF-8"))));
            String auth = "SharedKey " + account + ":" + authKey;
            request.setRequestProperty("x-ms-date", date);
            request.setRequestProperty("x-ms-version", "2009-09-19");
            request.setRequestProperty("Authorization", auth);
            request.setRequestMethod("GET");
            System.out.println(auth);
        }
    
        public static void signRequestSKL(HttpURLConnection request, String account, String key) throws Exception
        {
            SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
            fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
            String date = fmt.format(Calendar.getInstance().getTime()) + " GMT";
    
            StringBuilder sb = new StringBuilder();
            sb.append("GET\n"); // method
            sb.append('\n'); // md5 (optional)
            sb.append('\n'); // content type
            sb.append('\n'); // legacy date
            sb.append("x-ms-date:" + date + '\n'); // headers
            sb.append("x-ms-version:2009-09-19\n");
            sb.append("/" + account + request.getURL().getPath() + "?comp=list");
    
            //System.out.println(sb.toString());
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(base64.decode(key), "HmacSHA256"));
            String authKey = new String(base64.encode(mac.doFinal(sb.toString().getBytes("UTF-8"))));
            String auth = "SharedKeyLite " + account + ":" + authKey;
            request.setRequestProperty("x-ms-date", date);
            request.setRequestProperty("x-ms-version", "2009-09-19");
            request.setRequestProperty("Authorization", auth);
            request.setRequestMethod("GET");
            System.out.println(auth);
        }
    
    
    
        public static void main(String args[]) throws Exception
        {
            String account = args[0];
            String key = args[1];
            HttpURLConnection connection = (HttpURLConnection) (new URL("http://" + account + ".blob.core.windows.net/?comp=list")).openConnection();
            signRequestSKL(connection, account, key);
            connection.connect();
            System.out.println(connection.getResponseMessage());
    
            connection = (HttpURLConnection) (new URL("http://" + account + ".blob.core.windows.net/?comp=list")).openConnection();
            signRequestSK(connection, account, key);
            connection.connect();
            System.out.println(connection.getResponseMessage());
        }
    }
    

提交回复
热议问题