Используя Основного Автора HTTP с сервисом Google App Engine URLFetch

5 ответов

Это основной заголовок аутентификации по http:

Авторизация: в кодировке Basic 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 Codec

30
ответ дан 28 November 2019 в 04:52
поделиться

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

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

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

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

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);
    }
6
ответ дан 28 November 2019 в 04:52
поделиться

На 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

3
ответ дан 28 November 2019 в 04:52
поделиться

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

1
ответ дан 28 November 2019 в 04:52
поделиться

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

result = urlfetch.fetch("http://www.example.com/comment",
                        headers={"Authorization": 
                                 "Basic %s" % base64.b64encode("username:pass")})
14
ответ дан 28 November 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: