J'ai ici application Java SE 8.
Plate-forme: IntelliJ et Mac OS.
Je m'authentifie avec l'application Web Microsoft SharePoint
sur sa page d'accueil en utilisant le schéma d'authentification NTLM
. Je fais cela en utilisant l'API de réseau Core Java. J'ai essayé d'autres bibliothèques, comme celles d'Apache, mais en quelque sorte l'authentification ne réussit qu'avec les méthodes Core Java.
Bon, ici il vient code auth, qui fonctionne:
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();
Les en-têtes sur l'objet conn
sur la réponse:
{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]}
Maintenant, le code ci-dessus authentifié l'application, le client, avec le système distant. Maintenant, je veux communiquer avec le service de type REST sur le même système, afin d'obtenir une réponse à la demande de service.
L'URL devient ceci:
final String urlService = "https://domainSample.com/api/birds/getAllBirds";
Le code correspondant est ici:
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();
De toute évidence, je reçois en réponse le:
HTTP 401 : Unauthorized
Parce que je suis une nouvelle objet de connexion, qui est maintenant basé HTTPS.
Le système utilise un certificat de sécurité personnalisé, que j'ai ajouté auparavant au fichier de clés sur le JRE. Donc, je veux conserver les données d'authentification et les transférer sur l'objet HttpsURLConnection. Alors que j'effectue l'authentification au tout début du processus, puis continuer avec plusieurs appels sur le système de service réel. Maintenant, quand vous regardez les en-têtes, qui viennent en réponse à une authentification réussie (HTTP 200), je n'y vois rien d'utile que je pourrais réutiliser pour un tel cas d'utilisation. Par exemple, je ne reçois même pas un Cookie
.
J'ai essayé le URLConnection
au lieu de l'objet HttpURLConnection
lors de l'authentification, mais aucun cookie entre en jeu. Je utiliser relevent paires clé-valeur de cookies pour me identifier comme déjà authentifié et le transmettre à chaque demande ultérieure.
En ce qui concerne les en-têtes en réponse, ils ont quelque chose appelé:
- demande-id
- SPRequestGuid
qui ressemblent à des identifiants uniques, qui ne servait à rien de les transmettre avec la demande suivante.
Alors,
Qu'en pensez-vous?