Использование HTTP Basic-Auth с сервисом Google App Engine URLFetch - PullRequest
27 голосов
/ 27 августа 2009

Как указать имя пользователя и пароль для выполнения запросов Basic-Auth с помощью службы App Engine URLFetch (в Java)?

Кажется, я могу установить заголовки HTTP:

URL url = new URL("http://www.example.com/comment");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("X-MyApp-Version", "2.7.3");        

Какие заголовки подходят для Basic-Auth?

Ответы [ 6 ]

30 голосов
/ 02 сентября 2009

Это базовый заголовок аутентификации через http:

Авторизация: закодировано в base64 (имя пользователя: пароль)

например:

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

Вам потребуетсяэто:

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

И для этого вам нужно получить API-кодек base64, например Кодек Apache Commons

14 голосов
/ 16 июля 2010

Для тех, кто заинтересован в этом на Python (как я), код выглядит так:

result = urlfetch.fetch("http://www.example.com/comment",
                        headers={"Authorization": 
                                 "Basic %s" % base64.b64encode("username:pass")})
6 голосов
/ 30 августа 2009

Вы устанавливаете Аутентификатор перед тем, как вызывать openConnection () следующим образом,

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

Поскольку существует только один глобальный аутентификатор по умолчанию, это не очень хорошо работает, когда несколько пользователей выполняют URLFetch в нескольких потоках. Я бы использовал Apache HttpClient, если это так.

РЕДАКТИРОВАТЬ: я был не прав. App Engine не позволяет аутентификатор. Даже если это разрешено, у нас возникнет многопоточная проблема с глобальным экземпляром аутентификатора. Даже если вы не можете создавать потоки, ваши запросы могут по-прежнему обрабатываться в разных потоках. Поэтому мы просто добавляем заголовок вручную, используя эту функцию,

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);
    }
4 голосов
/ 11 мая 2011

Использование HttpURLConnection вызвало у меня некоторые проблемы (по какой-то причине сервер, к которому я пытался подключиться, не принимал учетные данные аутентификации), и, наконец, я понял, что на самом деле гораздо проще сделать это с помощью низкоуровневого API-интерфейса URLFetch GAE ( com.google.appengine.api.urlfetch) вроде так:

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()));

Это сработало.

3 голосов
/ 31 августа 2009

В Apache HttpClient для App Engine имеется оболочка

пожалуйста, пройдите по почте 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

1 голос
/ 01 февраля 2010

Примечание к первому ответу: setRequestProperty должен получить имя свойства без двоеточия («Авторизация», а не «Авторизация:»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...