したがって、HttpURLConnectionからHttpsURLConnectionに移動するときに認証に関連するデータを保持する
ここにJava SE 8アプリケーションがあります。
プラットフォーム:IntelliJ、およびMac OS。
私は、Microsoft SharePoint
WebアプリケーションをホームページのNTLM
認証スキーマを使用して認証します。私は、コアJavaネットワーキングAPIを使用してそれを行います。私はApacheなどの他のライブラリを試しましたが、何とかして認証はCore Javaのメソッドだけで成功します。
CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
final String authHost = "http://domainSample.com/one/two";
Authenticator.setDefault(new Authenticator() {
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
clientAuth.getUserAdmin() , clientAuth.getPassword().toCharArray());
}
});
URL URLAuth = new URL(authHost);
HttpURLConnection conn = (HttpURLConnection) URLAuth.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "*/*");
conn.setUseCaches(false);
conn.connect();
conn
オブジェクト上のヘッダーを応答に:
{null=[HTTP/1.1 200 OK], SPIisLatency=[0], Server=[Microsoft-IIS/8.5], X-Content-Type-Options=[nosniff], Persistent-Auth=[true], Last-Modified=[Tue, 27 Jun 2017 16:37:41 GMT], X-FRAME-OPTIONS=[SAMEORIGIN], request-id=[74c9ff9d-4d14-0038-1c59-424a812a2885], Date=[Tue, 27 Jun 2017 16:37:40 GMT], MicrosoftSharePointTeamServices=[15.0.0.4911], X-MS-InvokeApp=[1; RequireReadOnly], SPRequestGuid=[74c9ff9d-4d14-0038-1c59-424a812a2885], Cache-Control=[private, max-age=0], SPRequestDuration=[94], X-AspNet-Version=[4.0.30319], Expires=[Mon, 12 Jun 2017 16:37:41 GMT], Content-Length=[161234], X-Powered-By=[ASP.NET], X-SharePointHealthScore=[0], Content-Type=[text/html; charset=utf-8]}
今、上記のコードはでアプリ、クライアントを認証し
さてさて、ここでそれが動作認証コードを、来ますリモートシステム。今度は、サービス要求に対する応答を得るために、同じシステム上のREST型サービスと通信したいと思います。
final String urlService = "https://domainSample.com/api/birds/getAllBirds";
関連するコードここにある:明らかに
URL URLService = new URL(urlService);
HttpsURLConnection conns = (HttpsURLConnection)URLService.openConnection();
conns.setDoOutput(true);
conns.setDoInput(true);
conns.setRequestMethod("POST");
conns.setRequestProperty("Accept", "*/*");
conns.setChunkedStreamingMode(0);
conns.connect();
、私が応答に入る:
HTTP 401 : Unauthorized
私は新しい上ですので
URLは次のようになり接続オブジェクトは、HTTPSに基づいています。
システムではカスタムセキュリティ証明書が使用されています。これはJREのキーストアで追加したものです。
したがって、認証データを保持し、HttpsURLConnectionオブジェクトに転送します。そのため、プロセスの始めに認証を実行し、実際のサービスシステムで複数の呼び出しを続行するようにします。
ここで、正常な認証(HTTP 200)に応答してくるヘッダーを見ると、そのような場合に再利用できるものは何もありません。たとえば、Cookie
を受け取っていない場合もあります。
私は、認証時にURLConnection
の代わりHttpURLConnection
オブジェクトを試してみましたが、まだクッキーが入って来ない。 私はすでに認証済みとして自分自身を識別するためにクッキーのreleventキーと値のペアを使用し、後続の各要求にそれを渡すでしょう。
それが応答でヘッダに来るとき、彼らはと呼ばれるものを持っている:
- 要求-ID
- はそれらを渡すは良いしなかった一意の識別子、のように見える
をSPRequestGuidその後の要求で
したがって、
あなたはどう思いますか?