I want to use REST API with Sharepoint, i'm not here talking about using graph API. 

**I created an Azure Application and selected SHarepoint API to set authorizations:** 
[![enter image description here][1]][1]

I created secret for OAuth 2.0. Here are the authorizations I set for an application. it should not involve any user account ... 
[![enter image description here][2]][2]

**Now in a java application, for authentication, i'm using msal4j dependency:** 

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>msal4j</artifactId>
        <version>1.17.2</version>
    </dependency>


**I also have an AuthProviderRequest object:**

    @Test
    @Order(2)
    void restAuthenticate() throws Exception {
        // HttpConnectionProvider
        IAuthenticationResult result = sharepointManager.authenticate(restGraphProviderRequest);
        System.out.println(result.accessToken());
        String endpoint = "https://{{tenantName}}.sharepoint.com/sites/{{siteName}}/_api/web/lists/GetByTitle('{{libName}}')/items";
        HttpRequest request = HttpRequest.newBuilder().uri(URI.create(endpoint))
                .header(RequestConstants.HTTP_HEADER_AUTHORIZATION,
                        RequestConstants.HTTP_HEADER_AUTHORIZATION_BEARER_PREFIX + result.accessToken()) //
                .build();
        HttpClient client = HttpClient.newBuilder().build();
        HttpResponse<String> response = client.send(request,
                HttpResponse.BodyHandlers.ofString());
        System.out.println(response);
    }



Here my TENANT_AUTHORITY = "https://login.microsoftonline.com/{{ sharepointTenantId }}";
And my SCOPE_MS_GRAPH_DEFAULT = "https://{{ tenantName }}.sharepoint.com/.default";

if i run my unit test i do retrieve a JWT token... I decoded the token to check if it looked correct.. for a Sharepoint graph application aud should be :  "https://graph.microsoft.com",


    {
      "aud": "00000003-0000-0ff1-ce00-000000000000",
      "iss": "https://sts.windows.net/{{ tenantId }}/",
      "iat": 1731857052,
      "nbf": 1731857052,
      "exp": 1731860952,
      "aio": "k2BgYCgvOXulrW5bcsKiANamCU47NKdfuaHRkb3ilVrLSZE73MYA",
      "app_displayname": "sharepointRest ",
      "appid": "3a0aba82-2805-4dd7-b9f9-41c854199262",
      "appidacr": "1",
      "idp": "https://sts.windows.net/{{ tenantId }}/",
      "idtyp": "app",
      "oid": "...",
      "rh": "...",
      "roles": [
        "Sites.Manage.All",
        "Sites.Read.All",
        "Sites.ReadWrite.All",
        "Sites.FullControl.All"
      ],
      "sid": "...",
      "sub": "...",
      "tid": "...",
      "uti": "...",
      "ver": "1.0",
      "xms_idrel": "7 24",
      "xms_pftexp": 1731947352
    }



it seems here that i can do have a valid token i could use with rest API in sharepoint.

  [1]: https://i.sstatic.net/53CiOyEH.png
  [2]: https://i.sstatic.net/odlnD9A4.png

Here is the response: 
* When running unit test i have a 401 response. 
* When testing Url with tokenn i have: Unsupported app only token.

I tried to add authorization to application in Graph Explorer with a POST request to the following endpoint: `https://graph.microsoft.com/v1.0/sites/{{ tenantName }}.sharepoint.com:/sites/{{ siteName }}`

with following payload: 

    {
        "roles": [
            "write",
            "read",
            "delete",
            "owner"
        ],
        "grantee": {
            "@odata.type": "microsoft.graph.aadApplication",
            "id": "3a0aba82-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
        }
    }

After update: 
* When running unit test i have a 401 response. 
* When testing Url with tokenn i have: Unsupported app only token.

I also tried to use OKHttp to authenticate: 


    public class RestAuth {
    	// Azure AD and SharePoint Configurations
    	private static final String CLIENT_ID  = "myClientId";
    	private static final String CLIENT_SECRET  = "myClientSecret";
    	private static final String TENANT_ID  = "myTenantId";
    	private static final String RESOURCE  = "https://myTenantName.sharepoint.com";
    	private static final String SITE_NAME = "mySite";
    	// OkHttp client
    	private static final OkHttpClient client = new OkHttpClient();
    
    
    	public static void main(String[] args) {
    		try {
    			String accessToken = getAccessToken();
    			System.out.println(accessToken);
    			if (accessToken != null) {
    				getSiteLists(accessToken);
    			} else {
    				System.out.println("Failed to fetch the access token.");
    			}
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	// 1. Retrieve an Access Token
    	private static String getAccessToken() throws IOException {
    		String tokenEndpoint = String.format("https://login.microsoftonline.com/%s/oauth2/token", TENANT_ID);
    		RequestBody formBody = new FormBody.Builder()
    				.add("grant_type", "client_credentials")
    				.add("client_id", CLIENT_ID)
    				.add("client_secret", CLIENT_SECRET)
    				.add("resource", RESOURCE)
    				.build();
    
    		Request request = new Request.Builder()
    				.url(tokenEndpoint)
    				.post(formBody)
    				.header("Content-Type", "application/x-www-form-urlencoded")
    				.build();
    
    		try (Response response = client.newCall(request).execute()) {
    			if (response.isSuccessful()) {
    				String responseBody = response.body().string();
    				JSONObject json = new JSONObject(responseBody);
    				return json.getString("access_token"); // Extract the access token
    			} else {
    				System.err.println("Failed to get access token: " + response.code() + " - " + response.message());
    				System.err.println(response.body().string());
    				return null;
    			}
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	// 2. Get the Lists from the SharePoint Site
    	private static void getSiteLists(String accessToken) {
    		String siteUrl = String.format("%s/sites/%s/_api/web/lists", RESOURCE, SITE_NAME);
    
    		Request request = new Request.Builder()
    				.url(siteUrl)
    				.get()
    				.header("Authorization", "Bearer " + accessToken)
    				.header("Accept", "application/json;odata=verbose")
    				.build();
    
    		try (Response response = client.newCall(request).execute()) {
    			if (response.isSuccessful()) {
    				String responseBody = response.body().string();
    				System.out.println("Site Lists: " + responseBody);
    			} else {
    				System.err.println("Failed to fetch site lists: " + response.code() + " - " + response.message());
    				System.err.println(response.body().string());
    			}
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    }

I obtain: Failed to fetch site lists: 401 - 
Unsupported app only token.

the decoded token is absolutelly similar to previous one: same aud, iss, roles...

I checked access control in admin sharepoint center : 
 * for unmanaged devices, i set authorizations
 * i activated access for legacy authentication

i really don't get what is wrong here. thanks