Here is a demo for your reference, We access SharePoint online and use REST API to upload a file in JAVA.
1.Get the security token from Microsoft authentication portal:
public String receiveSecurityToken() throws TransformerException, URISyntaxException {
RequestEntity<String> requestEntity =
new RequestEntity<>(buildSecurityTokenRequestEnvelope(),
HttpMethod.POST,
new URI("https://login.microsoftonline.com/extSTS.srf"));
ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class);
DOMResult result = new DOMResult();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new StringSource(responseEntity.getBody()), result);
Document definitionDocument = (Document) result.getNode();
String securityToken = xPathExpression.evaluateAsString(definitionDocument);
if (StringUtils.isBlank(securityToken)) {
throw new SharePointAuthenticationException("Unable to authenticate: empty token");
}
return securityToken;
}
The envelope that is sent to the portal has the following format:
<s:Envelope
xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">https://login.microsoftonline.com/extSTS.srf</a:To>
<o:Security s:mustUnderstand="1"
xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<o:UsernameToken>
<o:Username>[username]</o:Username>
<o:Password>[password]</o:Password>
</o:UsernameToken>
</o:Security>
</s:Header>
<s:Body>
<t:RequestSecurityToken
xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust">
<wsp:AppliesTo
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<a:EndpointReference>
<a:Address>[SharePoint domain address]</a:Address>
</a:EndpointReference>
</wsp:AppliesTo>
<t:KeyType>http://schemas.xmlsoap.org/ws/2005/05/identity/NoProofKey</t:KeyType>
<t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</t:RequestType>
<t:TokenType>urn:oasis:names:tc:SAML:1.0:assertion</t:TokenType>
</t:RequestSecurityToken>
</s:Body>
</s:Envelope>
2.Get the cookies from the SharePoint Online server:
public List<String> getSignInCookies(String securityToken) throws TransformerException, URISyntaxException {
RequestEntity<String> requestEntity =
new RequestEntity<>(securityToken,
HttpMethod.POST,
new URI("[SharePoint domain address]/_forms/default.aspx?wa=wsignin1.0"));
ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class);
HttpHeaders headers = responseEntity.getHeaders();
List<String> cookies = headers.get("Set-Cookie");
if (CollectionUtils.isEmpty(cookies)) {
throw new SharePointSignInException("Unable to sign in: no cookies returned in response");
}
return cookies;
}
3.Get the signature(FormDigestValue) for requests to the SharePoint Online server:
public String getFormDigestValue(List<String> cookies) throws IOException, URISyntaxException,
TransformerException, JSONException {
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add("Cookie", Joiner.on(';').join(cookies));
headers.add("Accept", "application/json;odata=verbose");
headers.add("X-ClientService-ClientTag", "SDK-JAVA");
RequestEntity<String> requestEntity = new RequestEntity<>(headers,
HttpMethod.POST, new URI("[SharePoint domain address]/_api/contextinfo"));
ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class);
JSONObject json = new JSONObject(responseEntity.getBody());
return json.getJSONObject("d")
.getJSONObject("GetContextWebInformation").getString("FormDigestValue");
}
Finally, we can call REST API to upload the document as below.
url: http://site url/_api/web/GetFolderByServerRelativeUrl('/Folder Name')/Files/add(url='a.txt',overwrite=true)
method: POST
body: "Contents of file"
Headers: Authorization: "Bearer " + accessToken
X-RequestDigest: form digest value
content-length:length of post body
public String performHttpRequest(String path, String json, boolean isUpdate) throws Exception {
String securityToken = receiveSecurityToken();
List<String> cookies = getSignInCookies(securityToken);
String formDigestValue = getFormDigestValue(cookies);
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add("Cookie", Joiner.on(';').join(cookies));
headers.add("Content-type", "application/json;odata=verbose");
headers.add("X-RequestDigest", formDigestValue);
RequestEntity<String> requestEntity = new RequestEntity<>(json,
headers, HttpMethod.POST, new URI(path));
ResponseEntity<String> responseEntity =
restTemplate.exchange(requestEntity, String.class);
return responseEntity.getBody();
}
More information for your reference:
SharePoint Online remote authentication (and Doc upload)
You can refer to my answer:
How to upload files to sharepoint site's document library using Graph API on android