Using HTTP Basic-Auth with Google App Engine URLFetch service

后端 未结 6 602
眼角桃花
眼角桃花 2020-12-07 23:01

How can I specify the username and password for making Basic-Auth requests with App Engine\'s URLFetch service (in Java)?

It seems I can set HTTP headers:

         


        
相关标签:
6条回答
  • 2020-12-07 23:28

    This is a basic auth header over http:

    Authorization: Basic base64 encoded(username:password)

    eg:

    GET /private/index.html HTTP/1.0
    Host: myhost.com
    Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
    

    You will need to do this:

    URL url = new URL("http://www.example.com/comment");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestProperty("Authorization",
    "Basic "+codec.encodeBase64String(("username:password").getBytes());
    

    And to do that you will want to get a base64 codec api, like the Apache Commons Codec

    0 讨论(0)
  • 2020-12-07 23:28

    Note on the first answer: setRequestProperty should get the property name without the colon ("Authorization" rather than "Authorization:").

    0 讨论(0)
  • You set up an Authenticator before you call openConnection() like this,

    Authenticator.setDefault(new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password.toCharArray());
        }
    });
    

    Since there is only one global default authenticator, this doesn't really work well when you have multiple users doing the URLFetch in multiple threads. I would use Apache HttpClient if that's the case.

    EDIT: I was wrong. App Engine doesn't allow Authenticator. Even if it's allowed, we would have the multi-thread issue with a global authenticator instance. Even though you can't create threads, your requests may still get served in different threads. So we just add the header manually using this function,

    import com.google.appengine.repackaged.com.google.common.util.Base64;
        /**
         * Preemptively set the Authorization header to use Basic Auth.
         * @param connection The HTTP connection
         * @param username Username
         * @param password Password
         */
        public static void setBasicAuth(HttpURLConnection connection,
                String username, String password) {
            StringBuilder buf = new StringBuilder(username);
            buf.append(':');
            buf.append(password);
            byte[] bytes = null;
            try {
                bytes = buf.toString().getBytes("ISO-8859-1");
            } catch (java.io.UnsupportedEncodingException uee) {
                assert false;
            }
    
            String header = "Basic " + Base64.encode(bytes);
            connection.setRequestProperty("Authorization", header);
        }
    
    0 讨论(0)
  • 2020-12-07 23:47

    Using HttpURLConnection gave me some problems (for some reason the server I was trying to connect to didn't accept auth credentials), and finally I realized that it's actually much easier to do using GAE's low-level URLFetch API (com.google.appengine.api.urlfetch) like so:

    URL fetchurl = new URL(url);
    
    String nameAndPassword = credentials.get("name")+":"+credentials.get("password");
    String authorizationString = "Basic " + Base64.encode(nameAndPassword.getBytes());
    
    HTTPRequest request = new HTTPRequest(fetchurl);
    request.addHeader(new HTTPHeader("Authorization", authorizationString));
    
    HTTPResponse response = URLFetchServiceFactory.getURLFetchService().fetch(request);
    System.out.println(new String(response.getContent()));
    

    This worked.

    0 讨论(0)
  • 2020-12-07 23:48

    For those interested in doing this in Python (as I was), the code looks like this:

    result = urlfetch.fetch("http://www.example.com/comment",
                            headers={"Authorization": 
                                     "Basic %s" % base64.b64encode("username:pass")})
    
    0 讨论(0)
  • 2020-12-07 23:49

    There is a wrapper on Apache HttpClient for App Engine

    please go through the post http://esxx.blogspot.com/2009/06/using-apaches-httpclient-on-google-app.html

    http://peterkenji.blogspot.com/2009/08/using-apache-httpclient-4-with-google.html

    0 讨论(0)
提交回复
热议问题