Базовая аутентификация клиента веб-службы Java - PullRequest
43 голосов
/ 16 августа 2011

Я создал веб-службу JAX-WS поверх Glassfish, для которой требуется базовая HTTP-аутентификация.

Теперь я хочу создать автономный клиент Java-приложения для этой веб-службы, но у меня нет подсказкио том, как передать имя пользователя и пароль.

Он работает с обозревателем веб-служб Eclipse, и, изучив провод, я нашел это:

POST /SnaProvisioning/SnaProvisioningV1_0 HTTP/1.1
Host: localhost:8080
Content-Type: text/xml; charset=utf-8
Content-Length: 311
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: IBM Web Services Explorer
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: ""
Authorization: Basic Z2VybWFuOmdlcm1hbg==
Connection: close

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://ngin.ericsson.com/sna/types/v1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <q0:listServiceScripts/>
  </soapenv:Body>
</soapenv:Envelope>

Как передать имя пользователя и пароль в этомЗаголовок "Авторизация" с использованием кода Java?Это хешируется или что-то в этом роде?Какой алгоритм?

Без обеспечения безопасности у меня есть работающий автономный клиент Java:

SnaProvisioning myPort = new SnaProvisioning_Service().getSnaProvisioningV10Port();
myPort.listServiceScripts();

Ответы [ 7 ]

62 голосов
/ 03 сентября 2012

Способ JAX-WS для базовой аутентификации:

Service s = new Service();
Port port = s.getPort();

BindingProvider prov = (BindingProvider)port;
prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "myusername");
prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "mypassword");

port.call();
44 голосов
/ 17 августа 2011

Оказалось, что есть простой, стандартный способ достижения того, что я хотел:

import java.net.Authenticator;
import java.net.PasswordAuthentication;

Authenticator myAuth = new Authenticator() 
{
    @Override
    protected PasswordAuthentication getPasswordAuthentication()
    {
        return new PasswordAuthentication("german", "german".toCharArray());
    }
};

Authenticator.setDefault(myAuth);

Нет пользовательских классов "sun" или внешних зависимостей, и не нужно ничего кодировать вручную.

Я знаю, что безопасность BASIC не является безопасной, но мы также используем HTTPS.

9 голосов
/ 14 февраля 2012

для Axis2 клиента это может быть полезно

...
serviceStub = new TestBeanServiceStub("<WEB SERVICE URL>"); // Set your value
HttpTransportProperties.Authenticator basicAuthenticator = new HttpTransportProperties.Authenticator();
List<String> authSchemes = new ArrayList<String>();
authSchemes.add(Authenticator.BASIC);
basicAuthenticator.setAuthSchemes(authSchemes); 
basicAuthenticator.setUsername("<UserName>"); // Set your value
basicAuthenticator.setPassword("<Password>"); // Set your value
basicAuthenticator.setPreemptiveAuthentication(true);
serviceStub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE, basicAuthenticator);
serviceStub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED, "false");
...
6 голосов
/ 12 июля 2017

Некоторый дополнительный контекст о базовой аутентификации, он состоит из заголовка, который содержит пару ключ / значение:

Авторизация: Basic Z2VybWFuOmdlcm1hbg ==

, где " Авторизация " - это ключ заголовков, и значение заголовков имеет строку (" Basic " слово плюс пробел ), объединенную с " Z2VybWFuOmdlcm1hbg == ", которые представляют собой пользователя и пароль в соединении base 64 двойной точкой

String name = "username";
String password = "secret";
String authString = name + ":" + password;
String authStringEnc = new BASE64Encoder().encode(authString.getBytes());
...
objectXXX.header("Authorization", "Basic " + authStringEnc);
5 голосов
/ 16 августа 2011

Если вы используете реализацию JAX-WS для своего клиента, например, Metro Web Services, следующий код показывает, как передать имя пользователя и пароль в заголовках HTTP:

 MyService port = new MyService();
 MyServiceWS service = port.getMyServicePort();

 Map<String, List<String>> credentials = new HashMap<String,List<String>>();

 credentials.put("username", Collections.singletonList("username"));
 credentials.put("password", Collections.singletonList("password"));

 ((BindingProvider)service).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, credentials);

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

2 голосов
/ 28 мая 2017

Это сработало для меня:

 BindingProvider bp = (BindingProvider) port;
 Map<String, Object> map = bp.getRequestContext();
 map.put(BindingProvider.USERNAME_PROPERTY, "aspbbo");
 map.put(BindingProvider.PASSWORD_PROPERTY, "9FFFN6P");
1 голос
/ 16 августа 2011

Чтобы упростить свою жизнь , вы можете рассмотреть возможность использования инфраструктуры JAX-WS, такой как Apache CXF или Apache Axis2.

Вот ссылка, которая описывает, как настроить WS-Security для Apache CXF -> http://cxf.apache.org/docs/ws-security.html

EDIT Кстати, поле Authorization просто использует простую кодировку Base64. Согласно этому (http://www.motobit.com/util/base64-decoder-encoder.asp), декодированное значение равно german:german.

...