web-dev-qa-db-ja.com

Java Webサービスクライアントの基本認証

基本的なHTTP認証を必要とするGlassfishの上にJAX-WS Webサービスを作成しました。

そのWebサービス用のスタンドアロンJavaアプリケーションクライアントを作成したいのですが、ユーザー名とパスワードを渡す方法の手がかりがありません。

EclipseのWeb Service Explorerで動作し、これを見つけたワイヤを調べます。

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コードを使用して、この「Authorization」ヘッダーでユーザー名とパスワードを渡すにはどうすればよいですか?ハッシュ化されているのですか、それともそのようなものですか?アルゴリズムとは何ですか?

セキュリティが関与しない場合、動作するスタンドアロンJavaクライアントがあります。

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

私が望んでいたことを達成するためのシンプルで標準的な方法があることがわかりました:

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も使用しています。

45
German

基本認証の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();
63

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");
...
9
Avil

基本認証について追加のコンテキストがあり、キーと値のペアを含むヘッダーで構成されます。

認証:基本的なZ2VybWFuOmdlcm1hbg ==

ここで、「Authorization "はヘッダーキーであり、ヘッダー値には文字列があります(" Basic "Word plus blank space) 「Z2VybWFuOmdlcm1hbg ==」に連結します。これはベースのユーザーとパスワードですダブルドットによる64ジョイント

String name = "username";
String password = "secret";
String authString = name + ":" + password;
String authStringEnc = new BASE64Encoder().encode(authString.getBytes());
...
objectXXX.header("Authorization", "Basic " + authStringEnc);

Metro Web Servicesなど、クライアントにJAX-WS実装を使用している場合、次のコードは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を使用してのみエンコードされるため、セキュリティを強化するために、クライアント証明書などの他の追加メカニズムを使用することをお勧めします。

これは私のために働いた:

 BindingProvider bp = (BindingProvider) port;
 Map<String, Object> map = bp.getRequestContext();
 map.put(BindingProvider.USERNAME_PROPERTY, "aspbbo");
 map.put(BindingProvider.PASSWORD_PROPERTY, "9FFFN6P");
2
Rolando F.

あなたの人生をsimplerにするために、Apache CXFやApache Axis2などのJAX-WSフレームワークの使用を検討することをお勧めします。

Apache CXF用のWS-Securityのセットアップ方法を説明するリンクを次に示します-> http://cxf.Apache.org/docs/ws-security.html

EDITところで、Authorizationフィールドは単純なBase64エンコードを使用します。これ( http://www.motobit.com/util/base64-decoder-encoder.asp )によると、デコードされた値はgerman:germanです。

JAX-WSを使用している場合、次のように機能します。

    //Get Web service Port
    WSTestService wsService = new WSTestService();
    WSTest wsPort = wsService.getWSTestPort();

    // Add username and password for Basic Authentication
    Map<String, Object> reqContext = ((BindingProvider) 
         wsPort).getRequestContext();
    reqContext.put(BindingProvider.USERNAME_PROPERTY, "username");
        reqContext.put(BindingProvider.PASSWORD_PROPERTY, "password");
0
Winter MC