Выход с помощью java.net.Authenticator - PullRequest
4 голосов
/ 26 января 2010

Мне было интересно, знает ли кто-нибудь из вас, как выйти из системы базовой аутентификации (BA) с помощью класса java.net.Authenticator. Я знаю, что у BA нет метода выхода из системы, и что вам нужно закрыть и снова открыть браузер, чтобы завершить сеанс. Вопрос в том, как «закрыть и снова открыть браузер» в коде Java? То есть я подключаюсь через java, а не через браузер, так как мне заставить JVM «деаутентифицировать» себя?

Контекст: я пишу приложение для публикации твитов на нескольких аккаунтах в Твиттере, используя BA. Я могу использовать java.net. *, Чтобы опубликовать твит для одной учетной записи (и вижу, что он вызывает мой класс аутентификатора), но когда я пытаюсь опубликовать твит для второй, я не вижу второго вызова аутентификатора. и твит получен с первого аккаунта.

Можно ли заставить Аутентификатор пройти повторную аутентификацию, или это тупик? Если так, я могу просто использовать вместо этого OAuth.

Большое спасибо заранее за любые идеи, которые вы можете предложить!

Шейн

    static class MyAuthenticator extends Authenticator {

    private String username, password;

    public MyAuthenticator(String user, String pass) {
        username = user;
        password = pass;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        System.out.println("Requesting Host  : " + getRequestingHost());
        System.out.println("Requesting Scheme : " + getRequestingScheme());
        System.out.println("Requesting Site  : " + getRequestingSite());
        return new PasswordAuthentication(username, password.toCharArray());
    }
}

общедоступный твит (AutoTwitterAccount acc, String твит) { Authenticator.setDefault (нуль);

    Authenticator.setDefault(new MyAuthenticator(acc.getUserName(), acc.getPassword()));
    try {
        /* First login the session and fire off tweet*/
        URL url = new URL(AutoTweeter.TWEET_URL);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("User-Agent", "Mozilla/4.0");
        conn.setRequestProperty("User-Agent", AGENT);
        conn.setRequestProperty("Content-Type", TYPE);
        conn.setRequestProperty("Content-Length", "" + tweet.length());
                ...fire off tweet....
        conn.disconnect();

Еще раз спасибо!

Ответы [ 3 ]

4 голосов
/ 26 января 2010

Если аутентификатор действительно не вызывается снова (и даже сброс его на другой не работает, что, по-видимому, имеет место из-за ошибки ), тогда вы можете отказаться от аутентификатора и отправьте HTTP-заголовок Basic Auth вручную :

URL url = new URL("http://www.example.com/comment");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Authorization:",
"Basic "+codec.encodeBase64String(("username:password").getBytes());
0 голосов
/ 30 апреля 2013

Если вы используете Аутентификатор для Прокси, попробуйте следующее:

import org.apache.commons.codec.binary.Base64;
...
StringBuilder auth = new StringBuilder("Basic ");
auth.append(Base64.encodeBase64String((username + ':' + password).getBytes()));
connection.setRequestProperty("Proxy-Authorization", auth.toString());
0 голосов
/ 08 февраля 2010

Я пробовал это, но он все равно не проходил аутентификацию, но я справился с этим, используя вспомогательный класс коллег для самостоятельного создания HTTP-запроса и его прямой записи в сокет, минуя классы Sun Http. Но все равно спасибо за ваш ответ!

...