Azure Active Directory Permissions Issue: 403 Exception

%3CLINGO-SUB%20id%3D%22lingo-sub-153291%22%20slang%3D%22en-US%22%3EAzure%20Active%20Directory%20Permissions%20Issue%3A%20403%20Exception%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-153291%22%20slang%3D%22en-US%22%3E%3CP%3E%3CSPAN%3EI%20have%20a%20added%20a%20Native%20app%20in%20Azure%20Active%20directory.%20I%20have%20granted%20all%20the%20required%20SharePoint%20permissions%20(to%20my%20knowledge)%20but%20when%20I%20try%20to%20hit%20following%20SharePoint%20REST%20API%2C%20it%20returns%20403%20exception%3C%2FSPAN%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3E%3CSPAN%3E%3CA%20href%3D%22https%3A%2F%2Fmytenant.sharepoint.com%2F_api%2FSP.OAuth.NativeClient%2FAuthenticate%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%20noopener%20noreferrer%22%3Ehttps%3A%2F%2Fmytenant.sharepoint.com%2F_api%2FSP.OAuth.NativeClient%2FAuthenticate%3C%2FA%3E%3C%2FSPAN%3E%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EI'm%20trying%20to%20get%20SharePoint%20Online%20SPOIDCRL%20cookie%20using%20bearer%20token.%20Below%20is%20my%20code%20snippet%3A%3C%2FP%3E%0A%3CPRE%3E%3CCODE%3Eimport%20android.content.Intent%3B%0Aimport%20android.support.v7.app.AppCompatActivity%3B%0Aimport%20android.os.Bundle%3B%0Aimport%20android.util.Log%3B%0A%0Aimport%20com.microsoft.aad.adal.AuthenticationCallback%3B%0Aimport%20com.microsoft.aad.adal.AuthenticationContext%3B%0Aimport%20com.microsoft.aad.adal.AuthenticationResult%3B%0Aimport%20com.microsoft.aad.adal.PromptBehavior%3B%0A%0Aimport%20com.squareup.okhttp.MediaType%3B%0Aimport%20com.squareup.okhttp.OkHttpClient%3B%0Aimport%20com.squareup.okhttp.Request%3B%0Aimport%20com.squareup.okhttp.RequestBody%3B%0Aimport%20com.squareup.okhttp.Response%3B%0Aimport%20com.squareup.okhttp.Headers%3B%0A%0Aimport%20java.net.URL%3B%0Aimport%20java.net.HttpURLConnection%3B%0Aimport%20java.util.Locale%3B%0A%0Apublic%20class%20MainActivity%20extends%20AppCompatActivity%20%7B%0A%0A%20%20%20%20private%20static%20final%20String%20CLIENT_ID%20%3D%20%22%7Bmy_client_id%7D%22%3B%0A%20%20%20%20private%20static%20final%20String%20REDIRECT_URI%20%3D%20%22%7Bmy_redirect_uri%7D%22%3B%0A%20%20%20%20private%20static%20final%20String%20GRAPH_RESOURCE%20%3D%20%22https%3A%2F%2Fgraph.microsoft.com%22%3B%0A%20%20%20%20private%20static%20final%20String%20SHAREPOINT_ONLINE_RESOURCE%20%3D%20%22mytenant.sharepoint.com%22%3B%0A%20%20%20%20private%20static%20final%20String%20AUTHORITY%20%3D%20%22https%3A%2F%2Flogin.microsoftonline.com%2Fmytenant.onmicrosoft.com%22%3B%0A%20%20%20%20private%20static%20final%20String%20LOG_TAG%20%3D%20%22AUTH%22%3B%0A%20%20%20%20private%20static%20String%20accessToken%3B%0A%20%20%20%20private%20static%20String%20userId%3B%0A%0A%20%20%20%20private%20AuthenticationContext%20authenticationContext%3B%0A%0A%0A%20%20%20%20%40Override%0A%20%20%20%20protected%20void%20onCreate(Bundle%20savedInstanceState)%20%7B%0A%20%20%20%20%20%20%20%20super.onCreate(savedInstanceState)%3B%0A%20%20%20%20%20%20%20%20setContentView(R.layout.activity_main)%3B%0A%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Create%20the%20authentication%20context.%0A%20%20%20%20%20%20%20%20%20%20%20%20authenticationContext%20%3D%20new%20AuthenticationContext(MainActivity.this%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20AUTHORITY%2C%20true)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Acquire%20tokens%20using%20necessary%20UI.%0A%20%20%20%20%20%20%20%20%20%20%20%20authenticationContext.acquireToken(MainActivity.this%2C%20GRAPH_RESOURCE%2C%20CLIENT_ID%2C%20REDIRECT_URI%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PromptBehavior.Always%2C%20new%20AuthenticationCallback%3CAUTHENTICATIONRESULT%3E()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%40Override%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20public%20void%20onSuccess(AuthenticationResult%20result)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20String%20idToken%20%3D%20result.getIdToken()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20accessToken%20%3D%20result.getAccessToken()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20userId%20%3D%20result.getUserInfo().getUserId()%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Print%20tokens.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Log.d(LOG_TAG%2C%20%22ID%20Token%3A%20%22%20%2B%20idToken)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Log.d(LOG_TAG%2C%20%22Access%20Token%3A%20%22%20%2B%20accessToken)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20String%20spToken%20%3D%20getEndPointToken(SHAREPOINT_ONLINE_RESOURCE)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%40Override%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20public%20void%20onError(Exception%20exc)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20TODO%3A%20Handle%20error%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%0A%20%20%20%20%20%20%20%20%7D%20catch%20(Exception%20e)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20e.printStackTrace()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%40Override%0A%20%20%20%20protected%20void%20onActivityResult(int%20requestCode%2C%20int%20resultCode%2C%20Intent%20data)%20%7B%0A%20%20%20%20%20%20%20%20super.onActivityResult(requestCode%2C%20resultCode%2C%20data)%3B%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20Pass%20the%20activity%20result%20to%20the%20authentication%20context.%0A%20%20%20%20%20%20%20%20if%20(authenticationContext%20!%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20authenticationContext.onActivityResult(requestCode%2C%20resultCode%2C%20data)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20protected%20void%20getCookies(String%20token)%20%7B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20HttpURLConnection%20connection%20%3D%20(HttpURLConnection)%20new%20URL(%22https%22%2C%20%22mytenant.sharepoint.com%22%2C%20%22_api%2FSP.OAuth.NativeClient%2FAuthenticate%22).openConnection()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20connection.setRequestProperty(Broker.CHALLENGE_RESPONSE_HEADER%2C%20String.format(Locale.ROOT%2C%20%22Bearer%20%25s%22%2C%20new%20Object%5B%5D%7Btoken%7D))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20connection.setRequestMethod(%22POST%22)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20String%20headerField%20%3D%20connection.getHeaderField(%22Set-Cookie%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Log.d(%22COOKIE%22%2C%20headerField)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20connection.disconnect()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20finally%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20connection.disconnect()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%20catch%20(Exception%20e)%20%7B%0A%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20protected%20String%20getEndPointToken%20(String%20resourceUri)%20%7B%0A%20%20%20%20%20%20%20%20String%20token%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20authenticationContext.acquireTokenSilentAsync(resourceUri%2C%20CLIENT_ID%2C%20userId%2C%20new%20AuthenticationCallback%3CAUTHENTICATIONRESULT%3E()%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%40Override%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20public%20void%20onSuccess(AuthenticationResult%20result)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20String%20spAccessToken%20%3D%20result.getAccessToken()%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Log.d(%22SP-AUTH%22%2C%20%22Sharepoint%20Token%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Log.d(%22SP-AUTH%22%2C%20spAccessToken)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getCookies(spAccessToken)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%40Override%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20public%20void%20onError(Exception%20exc)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20TODO%3A%20Handle%20error%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%7D%20catch%20(Exception%20e)%20%7B%0A%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20token%3B%0A%20%20%20%20%7D%0A%7D%0A%3C%2FAUTHENTICATIONRESULT%3E%3C%2FAUTHENTICATIONRESULT%3E%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3EException%3A%3CBR%20%2F%3E%3CCODE%3E%3CERROR%20m%3D%22%26lt%3BA%20href%3D%22%3E%3CCODE%3E-1%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%26gt%3B%3CA%20href%3D%22http%3A%2F%2Fschemas.microsoft.com%2Fado%2F2007%2F08%2Fdataservices%2Fmetadata%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noreferrer%22%3Ehttp%3A%2F%2Fschemas.microsoft.com%2Fado%2F2007%2F08%2Fdataservices%2Fmetadata%3C%2FA%3E%22%26gt%3B%3CCODE%3E-1%2C%20Microsoft.SharePoint.Client.ClientServiceException%3C%2FCODE%3E%3CMESSAGE%20lang%3D%22en-US%22%3EException%20of%20type%20'Microsoft.SharePoint.Client.ClientServiceException'%20was%20thrown.%3C%2FMESSAGE%3E%3C%2FCODE%3E%3C%2FERROR%3E%3C%2FCODE%3E%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-153291%22%20slang%3D%22en-US%22%3E%3CLINGO-LABEL%3EAzure%20AD%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E
Highlighted
Frequent Visitor

I have a added a Native app in Azure Active directory. I have granted all the required SharePoint permissions (to my knowledge) but when I try to hit following SharePoint REST API, it returns 403 exception

 

https://mytenant.sharepoint.com/_api/SP.OAuth.NativeClient/Authenticate

 

I'm trying to get SharePoint Online SPOIDCRL cookie using bearer token. Below is my code snippet:

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.microsoft.aad.adal.AuthenticationCallback;
import com.microsoft.aad.adal.AuthenticationContext;
import com.microsoft.aad.adal.AuthenticationResult;
import com.microsoft.aad.adal.PromptBehavior;

import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import com.squareup.okhttp.Headers;

import java.net.URL;
import java.net.HttpURLConnection;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {

    private static final String CLIENT_ID = "{my_client_id}";
    private static final String REDIRECT_URI = "{my_redirect_uri}";
    private static final String GRAPH_RESOURCE = "https://graph.microsoft.com";
    private static final String SHAREPOINT_ONLINE_RESOURCE = "mytenant.sharepoint.com";
    private static final String AUTHORITY = "https://login.microsoftonline.com/mytenant.onmicrosoft.com";
    private static final String LOG_TAG = "AUTH";
    private static String accessToken;
    private static String userId;

    private AuthenticationContext authenticationContext;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            // Create the authentication context.
            authenticationContext = new AuthenticationContext(MainActivity.this,
                    AUTHORITY, true);

            // Acquire tokens using necessary UI.
            authenticationContext.acquireToken(MainActivity.this, GRAPH_RESOURCE, CLIENT_ID, REDIRECT_URI,
                    PromptBehavior.Always, new AuthenticationCallback<AuthenticationResult>() {
                        @Override
                        public void onSuccess(AuthenticationResult result) {
                            String idToken = result.getIdToken();
                            accessToken = result.getAccessToken();
                            userId = result.getUserInfo().getUserId();

                            // Print tokens.
                            Log.d(LOG_TAG, "ID Token: " + idToken);
                            Log.d(LOG_TAG, "Access Token: " + accessToken);

                            String spToken = getEndPointToken(SHAREPOINT_ONLINE_RESOURCE);
                        }

                        @Override
                        public void onError(Exception exc) {
                            // TODO: Handle error
                        }
                    });

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Pass the activity result to the authentication context.
        if (authenticationContext != null) {
            authenticationContext.onActivityResult(requestCode, resultCode, data);
        }
    }

    protected void getCookies(String token) {
        try {
            HttpURLConnection connection = (HttpURLConnection) new URL("https", "mytenant.sharepoint.com", "_api/SP.OAuth.NativeClient/Authenticate").openConnection();
            try {
                connection.setRequestProperty(Broker.CHALLENGE_RESPONSE_HEADER, String.format(Locale.ROOT, "Bearer %s", new Object[]{token}));
                connection.setRequestMethod("POST");

                String headerField = connection.getHeaderField("Set-Cookie");
                Log.d("COOKIE", headerField);

                connection.disconnect();
            } finally {
                connection.disconnect();
            }
        } catch (Exception e) {

        }
    }

    protected String getEndPointToken (String resourceUri) {
        String token = "";
        try {
            authenticationContext.acquireTokenSilentAsync(resourceUri, CLIENT_ID, userId, new AuthenticationCallback<AuthenticationResult>() {
                @Override
                public void onSuccess(AuthenticationResult result) {
                    String spAccessToken = result.getAccessToken();

                    Log.d("SP-AUTH", "Sharepoint Token");
                    Log.d("SP-AUTH", spAccessToken);
                    getCookies(spAccessToken);
                }

                @Override
                public void onError(Exception exc) {
                    // TODO: Handle error
                }
            });
        } catch (Exception e) {

        }
        return token;
    }
}

Exception:
<?xml version="1.0" encoding="utf-8"?><m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><m:code>-1, Microsoft.SharePoint.Client.ClientServiceException</m:code><m:message xml:lang="en-US">Exception of type 'Microsoft.SharePoint.Client.ClientServiceException' was thrown.</m:message></m:error>

0 Replies