[1. Introduction] ## Configurare il progettoSet up your project Se si preferisce scaricare il progetto Android Studio di questo esempio,Do you want to download this sample's Android Studio project instead? scaricare un progetto e andare direttamente al passaggio della configurazione per configurare il codice di esempio prima di eseguirlo.Download a project, and skip to the Configuration step to configure the code sample before you execute it. ### Creare un nuovo progettoCreate a new project 1. Aprire Android Studio e quindi selezionare File > New (Nuovo) > New Project (Nuovo progetto).Open Android Studio, and then select File > New > New Project. 2. Assegnare un nome all'applicazione e quindi selezionare Next (Avanti).Name your application, and then select Next. 3. Selezionare API 21 or newer (Android 5.0) (API 21 o più recente - Android 5.0) e fare clic su Next (Avanti).Select API 21 or newer (Android 5.0), and then select Next. 4. Lasciare invariata l'opzione Empty Activity (Attività vuota) e selezionare Next (Avanti) e quindi Finish (Fine).Leave Empty Activity as it is, select Next, and then select Finish. ### Aggiungere MSAL al progettoAdd MSAL to your project 1. In Android Studio selezionare Gradle Scripts (Script Gradle) > build.gradle (Module: app).In Android Studio, select Gradle Scripts > build.gradle (Module: app). 2. In Dependencies incollare il codice seguente:Under Dependencies, paste the following code: ruby compile ('com.microsoft.identity.client:msal:0.1.+') { exclude group: 'com.android.support', module: 'appcompat-v7' } compile 'com.android.volley:volley:1.0.0' ### Informazioni sul pacchettoAbout this package Il pacchetto nel codice precedente installa Microsoft Authentication Library.The package in the preceding code installs Microsoft Authentication Library. MSAL gestisce l'acquisizione, la memorizzazione nella cache e l'aggiornamento dei token utente usati per accedere alle API protette dall'endpoint di Azure Active Directory v2.MSAL handles acquiring, caching and refreshing user tokens that are used to access the APIs that are protected by the Azure Active Directory v2 endpoint. ## Creare l'interfaccia utente dell'applicazioneCreate the application UI 1. Passare a res > layout e quindi aprire activity_main.xml.Go to res > layout, and then open activity_main.xml. 2. Modificare il layout di attività da android.support.constraint.ConstraintLayout o altro a LinearLayout.Change the activity layout from android.support.constraint.ConstraintLayout or other to LinearLayout. 3. Aggiungere la proprietà android:orientation="vertical" al nodo LinearLayout.Add the android:orientation="vertical" property to the LinearLayout node. 4. Incollare il codice seguente nel nodo LinearLayout, sostituendo il contenuto corrente:Paste the following code into the LinearLayout node, replacing the current content: xml <TextView android:text="Welcome, " android:textColor="#3f3f3f" android:textSize="50px" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="15dp" android:id="@+id/welcome" android:visibility="invisible"/> <Button android:id="@+id/callGraph" android:text="Call Microsoft Graph" android:textColor="#FFFFFF" android:background="#00a1f1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="200dp" android:textAllCaps="false" /> <TextView android:text="Getting Graph Data..." android:textColor="#3f3f3f" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:id="@+id/graphData" android:visibility="invisible"/> <LinearLayout android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" android:gravity="center|bottom" android:orientation="vertical" > <Button android:text="Sign Out" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="15dp" android:textColor="#FFFFFF" android:background="#00a1f1" android:textAllCaps="false" android:id="@+id/clearCache" android:visibility="invisible" /> </LinearLayout> ## Usare MSAL per ottenere un token per l'API Microsoft GraphUse MSAL to get a token for the Microsoft Graph API 1. In app > java > {dominio}.{nomeapp} aprire MainActivity.Under app > java > {domain}.{appname}, open MainActivity. 2. Aggiungere le importazioni seguenti:Add the following imports: java import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.android.volley.*; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.Volley; import org.json.JSONObject; import java.util.HashMap; import java.util.List; import java.util.Map; import com.microsoft.identity.client.*; 3. Sostituire la classe MainActivity con il codice seguente:Replace the MainActivity class with following code: java public class MainActivity extends AppCompatActivity { final static String CLIENT_ID = "[Enter the application Id here]"; final static String SCOPES [] = {"https://graph.microsoft.com/User.Read"}; final static String MSGRAPH_URL = "https://graph.microsoft.com/v1.0/me"; /* UI & Debugging Variables */ private static final String TAG = MainActivity.class.getSimpleName(); Button callGraphButton; Button signOutButton; /* Azure AD Variables */ private PublicClientApplication sampleApp; private AuthenticationResult authResult; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); callGraphButton = (Button) findViewById(R.id.callGraph); signOutButton = (Button) findViewById(R.id.clearCache); callGraphButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { onCallGraphClicked(); } }); signOutButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { onSignOutClicked(); } }); /* Configure your sample app and save state for this activity */ sampleApp = null; if (sampleApp == null) { sampleApp = new PublicClientApplication( this.getApplicationContext(), CLIENT_ID); } /* Attempt to get a user and acquireTokenSilent * If this fails we do an interactive request */ List<User> users = null; try { users = sampleApp.getUsers(); if (users != null && users.size() == 1) { /* We have 1 user */ sampleApp.acquireTokenSilentAsync(SCOPES, users.get(0), getAuthSilentCallback()); } else { /* We have no user */ /* Let's do an interactive request */ sampleApp.acquireToken(this, SCOPES, getAuthInteractiveCallback()); } } catch (MsalClientException e) { Log.d(TAG, "MSAL Exception Generated while getting users: " + e.toString()); } catch (IndexOutOfBoundsException e) { Log.d(TAG, "User at this position does not exist: " + e.toString()); } } // // App callbacks for MSAL // ====================== // getActivity() - returns activity so we can acquireToken within a callback // getAuthSilentCallback() - callback defined to handle acquireTokenSilent() case // getAuthInteractiveCallback() - callback defined to handle acquireToken() case // public Activity getActivity() { return this; } /* Callback method for acquireTokenSilent calls * Looks if tokens are in the cache (refreshes if necessary and if we don't forceRefresh) * else errors that we need to do an interactive request. */ private AuthenticationCallback getAuthSilentCallback() { return new AuthenticationCallback() { @Override public void onSuccess(AuthenticationResult authenticationResult) { /* Successfully got a token, call Graph now */ Log.d(TAG, "Successfully authenticated"); /* Store the authResult */ authResult = authenticationResult; /* call graph */ callGraphAPI(); /* update the UI to post call Graph state */ updateSuccessUI(); } @Override public void onError(MsalException exception) { /* Failed to acquireToken */ Log.d(TAG, "Authentication failed: " + exception.toString()); if (exception instanceof MsalClientException) { /* Exception inside MSAL, more info inside MsalError.java */ } else if (exception instanceof MsalServiceException) { /* Exception when communicating with the STS, likely config issue */ } else if (exception instanceof MsalUiRequiredException) { /* Tokens expired or no session, retry with interactive */ } } @Override public void onCancel() { /* User cancelled the authentication */ Log.d(TAG, "User cancelled login."); } }; } /* Callback used for interactive request. If succeeds we use the access * token to call the Microsoft Graph. Does not check cache */ private AuthenticationCallback getAuthInteractiveCallback() { return new AuthenticationCallback() { @Override public void onSuccess(AuthenticationResult authenticationResult) { /* Successfully got a token, call graph now */ Log.d(TAG, "Successfully authenticated"); Log.d(TAG, "ID Token: " + authenticationResult.getIdToken()); /* Store the auth result */ authResult = authenticationResult; /* call Graph */ callGraphAPI(); /* update the UI to post call Graph state */ updateSuccessUI(); } @Override public void onError(MsalException exception) { /* Failed to acquireToken */ Log.d(TAG, "Authentication failed: " + exception.toString()); if (exception instanceof MsalClientException) { /* Exception inside MSAL, more info inside MsalError.java */ } else if (exception instanceof MsalServiceException) { /* Exception when communicating with the STS, likely config issue */ } } @Override public void onCancel() { /* User cancelled the authentication */ Log.d(TAG, "User cancelled login."); } }; } /* Set the UI for successful token acquisition data */ private void updateSuccessUI() { callGraphButton.setVisibility(View.INVISIBLE); signOutButton.setVisibility(View.VISIBLE); findViewById(R.id.welcome).setVisibility(View.VISIBLE); ((TextView) findViewById(R.id.welcome)).setText("Welcome, " + authResult.getUser().getName()); findViewById(R.id.graphData).setVisibility(View.VISIBLE); } /* Use MSAL to acquireToken for the end-user * Callback will call Graph api w/ access token & update UI */ private void onCallGraphClicked() { sampleApp.acquireToken(getActivity(), SCOPES, getAuthInteractiveCallback()); } /* Handles the redirect from the System Browser */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { sampleApp.handleInteractiveRequestRedirect(requestCode, resultCode, data); } } ### Altre informazioniMore information #### Ottenere un token utente in modo interattivoGet a user token interactively Chiamando il metodo AcquireTokenAsync viene visualizzata una finestra in cui viene chiesto agli utenti di eseguire l'accesso.Calling the AcquireTokenAsync method results in a window that prompts users to sign in. Le applicazioni in genere richiedono agli utenti di eseguire l'accesso in modo interattivo quando devono accedere per la prima volta a una risorsa protetta.Applications usually require users to sign in interactively the first time they need to access a protected resource. Potrebbe essere necessario eseguire l'accesso anche quando un'operazione invisibile all'utente per l'acquisizione di un token ha esito negativo, ad esempio a causa della scadenza della password di un utente.They might also need to sign in when a silent operation to acquire a token fails (for example, when a user’s password is expired). #### Ottenere un token utente in modo automaticoGet a user token silently Il metodo AcquireTokenSilentAsync gestisce le acquisizioni e i rinnovi dei token senza alcuna interazione da parte dell'utente.The AcquireTokenSilentAsync method handles token acquisitions and renewals without any user interaction. Dopo la prima esecuzione di AcquireTokenAsync, per le chiamate successive il metodo generalmente usato per ottenere i token per accedere alle risorse protette è AcquireTokenSilentAsync, perché le chiamate per richiedere o rinnovare i token vengono effettuate in modo invisibile all'utente.After AcquireTokenAsync is executed for the first time, AcquireTokenSilentAsync is the usual method to use to obtain tokens that access protected resources for subsequent calls, because calls to request or renew tokens are made silently. Il metodo AcquireTokenSilentAsync avrà infine esito negativo,Eventually, the AcquireTokenSilentAsync method will fail. ad esempio perché l'utente ha effettuato la disconnessione o ha modificato la propria password su un altro dispositivo.Reasons for failure might be that the user has either signed out or changed their password on another device. Se MSAL rileva che il problema può essere risolto richiedendo un'azione interattiva, viene attivata un'eccezione MsalUiRequiredException.When MSAL detects that the issue can be resolved by requiring an interactive action, it fires an MsalUiRequiredException exception. L'applicazione può gestire questa eccezione in due modi:Your application can handle this exception in two ways: * Può eseguire immediatamente una chiamata a AcquireTokenAsyncIt can make a call against AcquireTokenAsync immediately. e richiedere così all'utente di eseguire l'accesso.This call results in prompting the user to sign in. Questo modello viene usato in genere nelle applicazioni online in cui non è disponibile contenuto offline per l'utente.This pattern is usually used in online applications where there is no available offline content for the user. L'esempio generato in questa configurazione guidata segue questo modello, il cui funzionamento può essere osservato la prima volta che si esegue l'esempio.The sample generated by this guided setup follows this pattern, which you can see in action the first time you execute the sample. * Dato che nessun utente ha usato l'applicazione, PublicClientApp.Users.FirstOrDefault() contiene un valore Null e viene generata un'eccezione MsalUiRequiredException.Because no user has used the application, PublicClientApp.Users.FirstOrDefault() contains a null value, and an MsalUiRequiredException exception is thrown. * Il codice dell'esempio gestisce quindi l'eccezione chiamando AcquireTokenAsync e richiedendo così all'utente di eseguire l'eccesso.The code in the sample then handles the exception by calling AcquireTokenAsync, which results in prompting the user to sign in. * Può presentare un'indicazione visiva per informare gli utenti che è necessario un accesso interattivo e consentire così di scegliere il momento opportuno per accedere.It can instead present a visual indication to users that an interactive sign-in is required, so that they can select the right time to sign in. In alternativa, l'applicazione può riprovare a eseguire AcquireTokenSilentAsync in un secondo momento.Or the application can retry AcquireTokenSilentAsync later. Questo modello viene in genere adottato quando gli utenti possono usare altre funzionalità dell'applicazione senza interruzioni, ad esempio quando nell'applicazione è disponibile contenuto offline.This pattern is frequently used when users can use other application functionality without disruption--for example, when offline content is available in the application. In questo caso, gli utenti possono decidere se vogliono eseguire l'accesso per accedere alla risorsa protetta oppure aggiornare le informazioni obsolete.In this case, users can decide when they want to sign in to either access the protected resource or refresh the outdated information. In alternativa, l'applicazione può decidere di riprovare a eseguire AcquireTokenSilentAsync quando la rete viene ripristinata dopo essere stata temporaneamente non disponibile.Alternatively, the application can decide to retry AcquireTokenSilentAsync when the network is restored after having been temporarily unavailable. ## Chiamare l'API Microsoft Graph usando il token appena ottenutoCall the Microsoft Graph API by using the token you just obtained Aggiungere i metodi seguenti alla classe MainActivity:Add the following methods into the MainActivity class: java /* Use Volley to make an HTTP request to the /me endpoint from MS Graph using an access token */ private void callGraphAPI() { Log.d(TAG, "Starting volley request to graph"); /* Make sure we have a token to send to graph */ if (authResult.getAccessToken() == null) {return;} RequestQueue queue = Volley.newRequestQueue(this); JSONObject parameters = new JSONObject(); try { parameters.put("key", "value"); } catch (Exception e) { Log.d(TAG, "Failed to put parameters: " + e.toString()); } JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, MSGRAPH_URL, parameters,new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { /* Successfully called graph, process data and send to UI */ Log.d(TAG, "Response: " + response.toString()); updateGraphUI(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d(TAG, "Error: " + error.toString()); } }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<>(); headers.put("Authorization", "Bearer " + authResult.getAccessToken()); return headers; } }; Log.d(TAG, "Adding HTTP GET to Queue, Request: " + request.toString()); request.setRetryPolicy(new DefaultRetryPolicy( 3000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); queue.add(request); } /* Sets the Graph response */ private void updateGraphUI(JSONObject graphResponse) { TextView graphText = (TextView) findViewById(R.id.graphData); graphText.setText(graphResponse.toString()); } ### Altre informazioni sull'esecuzione di una chiamata REST a un'API protettaMore information about making a REST call against a protected API In questa applicazione di esempio, callGraphAPI chiama getAccessToken e quindi effettua una richiesta HTTP GET a una risorsa che richiede un token e restituisce il contenuto.In this sample application, callGraphAPI calls getAccessToken and then makes an HTTP GET request against a resource that requires a token and returns the content. Questo metodo aggiunge il token acquisito nell'intestazione di autorizzazione HTTP.This method adds the acquired token in the HTTP Authorization header. Per questo esempio, la risorsa è l'endpoint me dell'API Microsoft Graph, che visualizza le informazioni del profilo dell'utente.For this sample, the resource is the Microsoft Graph API me endpoint, which displays the user's profile information. ## Configurare la disconnessioneSet up sign-out Aggiungere i metodi seguenti alla classe MainActivity:Add the following methods into the MainActivity class: java /* Clears a user's tokens from the cache. * Logically similar to "sign out" but only signs out of this app. */ private void onSignOutClicked() { /* Attempt to get a user and remove their cookies from cache */ List<User> users = null; try { users = sampleApp.getUsers(); if (users == null) { /* We have no users */ } else if (users.size() == 1) { /* We have 1 user */ /* Remove from token cache */ sampleApp.remove(users.get(0)); updateSignedOutUI(); } else { /* We have multiple users */ for (int i = 0; i < users.size(); i++) { sampleApp.remove(users.get(i)); } } Toast.makeText(getBaseContext(), "Signed Out!", Toast.LENGTH_SHORT) .show(); } catch (MsalClientException e) { Log.d(TAG, "MSAL Exception Generated while getting users: " + e.toString()); } catch (IndexOutOfBoundsException e) { Log.d(TAG, "User at this position does not exist: " + e.toString()); } } /* Set the UI for signed-out user */ private void updateSignedOutUI() { callGraphButton.setVisibility(View.VISIBLE); signOutButton.setVisibility(View.INVISIBLE); findViewById(R.id.welcome).setVisibility(View.INVISIBLE); findViewById(R.id.graphData).setVisibility(View.INVISIBLE); ((TextView) findViewById(R.id.graphData)).setText("No Data"); } ### Altre informazioni sulla disconnessione degli utentiMore information about user sign-out Il metodo onSignOutClicked nel codice precedente rimuove gli utenti dalla cache utente di MSAL. In questo modo, MSAL dimentica l'utente corrente e una futura richiesta di acquisizione di un token avrà esito positivo solo se eseguita in modo interattivo.The onSignOutClicked method in the preceding code removes users from the MSAL user cache, which effectively tells MSAL to forget the current user so that a future request to acquire a token will succeed only if it is made to be interactive. Nonostante l'applicazione in questo esempio supporti singoli utenti, MSAL supporta anche scenari con accesso contemporaneo di più account,Although the application in this sample supports single users, MSAL supports scenarios where multiple accounts can be signed in at the same time. ad esempio un'applicazione di posta elettronica in cui un utente ha più account.An example is an email application where a user has multiple accounts. ## Registrare l'applicazioneRegister your application È possibile registrare l'applicazione in uno dei due modi descritti nelle due sezioni successive.You can register your application in either of two ways, as described in the next two sections. ### Opzione 1: Modalità rapidaOption 1: Express mode È possibile registrare rapidamente l'applicazione seguendo questa procedura:You can quickly register your application by doing the following: 1. Passare al portale di registrazione delle applicazioni Microsoft.Go to the Microsoft Application Registration Portal. 2. Nella casella Application Name (Nome applicazione) immettere un nome per l'applicazione.In the Application Name box, enter a name for your application. 3. Verificare che la casella di controllo Guided Setup (Configurazione guidata) sia selezionata e quindi selezionare Create (Crea).Ensure that the Guided Setup check box is selected, and then select Create. 4. Seguire le istruzioni per ottenere l'ID applicazione e incollarlo nel codice.Follow the instructions for obtaining the application ID, and paste it into your code. ### Opzione 2: Modalità avanzataOption 2: Advanced mode Per registrare l'applicazione e aggiungere le relative informazioni di registrazione alla soluzione, seguire questa procedura:To register your application and add your application registration information to your solution, do the following: 1. Se l'applicazione non è ancora stata registrata, passare al portale di registrazione delle applicazioni Microsoft.If you haven't already registered your application, go to the Microsoft Application Registration Portal. 2. Nella casella Application Name (Nome applicazione) immettere un nome per l'applicazione.In the Application Name box, enter a name for your application. 3. Verificare che la casella di controllo Guided Setup (Configurazione guidata) sia deselezionata e quindi selezionare Create (Crea).Ensure that the Guided Setup check box is cleared, and then select Create. 4. Selezionare Aggiungi piattaforma, Applicazione nativa e quindi Salva.Select Add Platform, select Native Application, and then select Save. 5. In app > java > {host}.{spazionomi} aprire MainActivity.Under app > java > {host}.{namespace}, open MainActivity. 6. Sostituire [Enter the application Id here] nella riga seguente con l'ID applicazione appena registrato:Replace [Enter the application Id here] in the following line with the application ID that you just registered: java final static String CLIENT_ID = "[Enter the application Id here]"; 7. In app > manifests aprire il file AndroidManifest.xml.Under app > manifests, open the AndroidManifest.xml file. 8. Nel nodo manifest\application aggiungere l'attività seguente.In the manifest\application node, add the following activity. In questo modo viene registrata un'attività BrowserTabActivity che consente al sistema operativo di riavviare l'applicazione dopo il completamento dell'autenticazione:Doing so registers a BrowserTabActivity activity that allows the OS to resume your application after it completes the authentication: xml <!--Intent filter to capture System Browser calling back to our app after sign-in--> <activity android:name="com.microsoft.identity.client.BrowserTabActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!--Add in your scheme/host from registered redirect URI--> <!--By default, the scheme should be similar to 'msal[appId]' --> <data android:scheme="msal[Enter the application Id here]" android:host="auth" /> </intent-filter> </activity> 9. Nel nodo BrowserTabActivity sostituire [Enter the application Id here] con l'ID applicazione.In the BrowserTabActivity node, replace [Enter the application Id here] with the application ID. ## Testare il codiceTest your code 1. Distribuire il codice nel dispositivo/emulatore.Deploy your code to your device/emulator. 2. Quando si è pronti per testare l'applicazione, usare un account Azure Active Directory (aziendale o dell'istituto di istruzione) o un account Microsoft (ad esempio live.com o outlook.com) per eseguire l'accesso.When you're ready to test your application, use an Azure Active Directory account (work or school account) or a Microsoft account (live.com, outlook.com) to sign in. Testare l'applicazione Test your application

Immettere nome utente e passwordEnter username and password ### Specificare il consenso per l'accesso all'applicazioneProvide consent for application access Al primo accesso all'applicazione viene richiesto anche di specificare il consenso per permettere all'applicazione di accedere al profilo e di completare l'accesso per l'utente, come mostrato di seguito:The first time that you sign in to your application, you're also prompted to provide consent to allow the application to access your profile and sign you in, as shown here: Specificare il consenso per l'accesso all'applicazione ### Visualizzare i risultati dell'applicazioneView application results Dopo l'accesso dovrebbero essere visualizzati i risultati restituiti dalla chiamata all'API Microsoft Graph.After you sign in, you should see the results that are returned by the call to the Microsoft Graph API. La chiamata all'endpoint me dell'API Microsoft Graph restituisce il profilo utente.The call to the Microsoft Graph API me endpoint returns the user profile. Per un elenco di endpoint di Microsoft Graph comuni, vedere la documentazione per sviluppatori dell'API Microsoft Graph.For a list of common Microsoft Graph endpoints, see Microsoft Graph API developer documentation. ### Altre informazioni sugli ambiti e sulle autorizzazioni delegateMore information about scopes and delegated permissions L'API Microsoft Graph richiede l'ambito user.read per leggere il profilo dell'utente.The Microsoft Graph API requires the user.read scope to read a user's profile. Per impostazione predefinita, questo ambito viene aggiunto automaticamente in ogni applicazione registrata nel portale di registrazione dell'applicazione.This scope is automatically added by default in every application that's registered in the Application Registration Portal. Altre API per Microsoft Graph e le API personalizzate per il server di back-end potrebbero richiedere anche altri ambiti.Other APIs for Microsoft Graph, as well as custom APIs for your back-end server, might require additional scopes. L'API Microsoft Graph richiede l'ambito Calendars.Read per elencare i calendari dell'utente.The Microsoft Graph API requires the Calendars.Read scope to list the user’s calendars. Per accedere ai calendari dell'utente nel contesto di un'applicazione, aggiungere l'autorizzazione delegata Calendars.Read alle informazioni di registrazione dell'applicazione.To access the user’s calendars in the context of an application, add the Calendars.Read delegated permission to the application registration information. Aggiungere quindi l'ambito Calendars.Read alla chiamata acquireTokenSilent.Then, add the Calendars.Read scope to the acquireTokenSilent call. >[!NOTE] >Con l'aumentare del numero di ambiti è possibile che all'utente venga chiesto di esprimere anche altri tipi di consenso.The user might be prompted for additional consents as you increase the number of scopes. ## Guida e supportoHelp and support Se è necessaria assistenza, se si vuole segnalare un problema o si vogliono ottenere altre informazioni sulle opzioni di supporto, vedere l'articolo seguente:If you need help, want to report an issue, or want to learn more about your support options, see the following article: > [!div class="nextstepaction"] > Assistenza e supporto per gli sviluppatoriHelp and support for developers
1. Introduction] ## Configurare il progettoSet up your project Se si preferisce scaricare il progetto Android Studio di questo esempio,Do you want to download this sample's Android Studio project instead? scaricare un progetto e andare direttamente al passaggio della configurazione per configurare il codice di esempio prima di eseguirlo.Download a project, and skip to the Configuration step to configure the code sample before you execute it. ### Creare un nuovo progettoCreate a new project 1. Aprire Android Studio e quindi selezionare File > New (Nuovo) > New Project (Nuovo progetto).Open Android Studio, and then select File > New > New Project. 2. Assegnare un nome all'applicazione e quindi selezionare Next (Avanti).Name your application, and then select Next. 3. Selezionare API 21 or newer (Android 5.0) (API 21 o più recente - Android 5.0) e fare clic su Next (Avanti).Select API 21 or newer (Android 5.0), and then select Next. 4. Lasciare invariata l'opzione Empty Activity (Attività vuota) e selezionare Next (Avanti) e quindi Finish (Fine).Leave Empty Activity as it is, select Next, and then select Finish. ### Aggiungere MSAL al progettoAdd MSAL to your project 1. In Android Studio selezionare Gradle Scripts (Script Gradle) > build.gradle (Module: app).In Android Studio, select Gradle Scripts > build.gradle (Module: app). 2. In Dependencies incollare il codice seguente:Under Dependencies, paste the following code: ruby compile ('com.microsoft.identity.client:msal:0.1.+') { exclude group: 'com.android.support', module: 'appcompat-v7' } compile 'com.android.volley:volley:1.0.0' ### Informazioni sul pacchettoAbout this package Il pacchetto nel codice precedente installa Microsoft Authentication Library.The package in the preceding code installs Microsoft Authentication Library. MSAL gestisce l'acquisizione, la memorizzazione nella cache e l'aggiornamento dei token utente usati per accedere alle API protette dall'endpoint di Azure Active Directory v2.MSAL handles acquiring, caching and refreshing user tokens that are used to access the APIs that are protected by the Azure Active Directory v2 endpoint. ## Creare l'interfaccia utente dell'applicazioneCreate the application UI 1. Passare a res > layout e quindi aprire activity_main.xml.Go to res > layout, and then open activity_main.xml. 2. Modificare il layout di attività da android.support.constraint.ConstraintLayout o altro a LinearLayout.Change the activity layout from android.support.constraint.ConstraintLayout or other to LinearLayout. 3. Aggiungere la proprietà android:orientation="vertical" al nodo LinearLayout.Add the android:orientation="vertical" property to the LinearLayout node. 4. Incollare il codice seguente nel nodo LinearLayout, sostituendo il contenuto corrente:Paste the following code into the LinearLayout node, replacing the current content: xml <TextView android:text="Welcome, " android:textColor="#3f3f3f" android:textSize="50px" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="15dp" android:id="@+id/welcome" android:visibility="invisible"/> <Button android:id="@+id/callGraph" android:text="Call Microsoft Graph" android:textColor="#FFFFFF" android:background="#00a1f1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="200dp" android:textAllCaps="false" /> <TextView android:text="Getting Graph Data..." android:textColor="#3f3f3f" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:id="@+id/graphData" android:visibility="invisible"/> <LinearLayout android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" android:gravity="center|bottom" android:orientation="vertical" > <Button android:text="Sign Out" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="15dp" android:textColor="#FFFFFF" android:background="#00a1f1" android:textAllCaps="false" android:id="@+id/clearCache" android:visibility="invisible" /> </LinearLayout> ## Usare MSAL per ottenere un token per l'API Microsoft GraphUse MSAL to get a token for the Microsoft Graph API 1. In app > java > {dominio}.{nomeapp} aprire MainActivity.Under app > java > {domain}.{appname}, open MainActivity. 2. Aggiungere le importazioni seguenti:Add the following imports: java import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.android.volley.*; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.Volley; import org.json.JSONObject; import java.util.HashMap; import java.util.List; import java.util.Map; import com.microsoft.identity.client.*; 3. Sostituire la classe MainActivity con il codice seguente:Replace the MainActivity class with following code: java public class MainActivity extends AppCompatActivity { final static String CLIENT_ID = "[Enter the application Id here]"; final static String SCOPES [] = {"https://graph.microsoft.com/User.Read"}; final static String MSGRAPH_URL = "https://graph.microsoft.com/v1.0/me"; /* UI & Debugging Variables */ private static final String TAG = MainActivity.class.getSimpleName(); Button callGraphButton; Button signOutButton; /* Azure AD Variables */ private PublicClientApplication sampleApp; private AuthenticationResult authResult; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); callGraphButton = (Button) findViewById(R.id.callGraph); signOutButton = (Button) findViewById(R.id.clearCache); callGraphButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { onCallGraphClicked(); } }); signOutButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { onSignOutClicked(); } }); /* Configure your sample app and save state for this activity */ sampleApp = null; if (sampleApp == null) { sampleApp = new PublicClientApplication( this.getApplicationContext(), CLIENT_ID); } /* Attempt to get a user and acquireTokenSilent * If this fails we do an interactive request */ List<User> users = null; try { users = sampleApp.getUsers(); if (users != null && users.size() == 1) { /* We have 1 user */ sampleApp.acquireTokenSilentAsync(SCOPES, users.get(0), getAuthSilentCallback()); } else { /* We have no user */ /* Let's do an interactive request */ sampleApp.acquireToken(this, SCOPES, getAuthInteractiveCallback()); } } catch (MsalClientException e) { Log.d(TAG, "MSAL Exception Generated while getting users: " + e.toString()); } catch (IndexOutOfBoundsException e) { Log.d(TAG, "User at this position does not exist: " + e.toString()); } } // // App callbacks for MSAL // ====================== // getActivity() - returns activity so we can acquireToken within a callback // getAuthSilentCallback() - callback defined to handle acquireTokenSilent() case // getAuthInteractiveCallback() - callback defined to handle acquireToken() case // public Activity getActivity() { return this; } /* Callback method for acquireTokenSilent calls * Looks if tokens are in the cache (refreshes if necessary and if we don't forceRefresh) * else errors that we need to do an interactive request. */ private AuthenticationCallback getAuthSilentCallback() { return new AuthenticationCallback() { @Override public void onSuccess(AuthenticationResult authenticationResult) { /* Successfully got a token, call Graph now */ Log.d(TAG, "Successfully authenticated"); /* Store the authResult */ authResult = authenticationResult; /* call graph */ callGraphAPI(); /* update the UI to post call Graph state */ updateSuccessUI(); } @Override public void onError(MsalException exception) { /* Failed to acquireToken */ Log.d(TAG, "Authentication failed: " + exception.toString()); if (exception instanceof MsalClientException) { /* Exception inside MSAL, more info inside MsalError.java */ } else if (exception instanceof MsalServiceException) { /* Exception when communicating with the STS, likely config issue */ } else if (exception instanceof MsalUiRequiredException) { /* Tokens expired or no session, retry with interactive */ } } @Override public void onCancel() { /* User cancelled the authentication */ Log.d(TAG, "User cancelled login."); } }; } /* Callback used for interactive request. If succeeds we use the access * token to call the Microsoft Graph. Does not check cache */ private AuthenticationCallback getAuthInteractiveCallback() { return new AuthenticationCallback() { @Override public void onSuccess(AuthenticationResult authenticationResult) { /* Successfully got a token, call graph now */ Log.d(TAG, "Successfully authenticated"); Log.d(TAG, "ID Token: " + authenticationResult.getIdToken()); /* Store the auth result */ authResult = authenticationResult; /* call Graph */ callGraphAPI(); /* update the UI to post call Graph state */ updateSuccessUI(); } @Override public void onError(MsalException exception) { /* Failed to acquireToken */ Log.d(TAG, "Authentication failed: " + exception.toString()); if (exception instanceof MsalClientException) { /* Exception inside MSAL, more info inside MsalError.java */ } else if (exception instanceof MsalServiceException) { /* Exception when communicating with the STS, likely config issue */ } } @Override public void onCancel() { /* User cancelled the authentication */ Log.d(TAG, "User cancelled login."); } }; } /* Set the UI for successful token acquisition data */ private void updateSuccessUI() { callGraphButton.setVisibility(View.INVISIBLE); signOutButton.setVisibility(View.VISIBLE); findViewById(R.id.welcome).setVisibility(View.VISIBLE); ((TextView) findViewById(R.id.welcome)).setText("Welcome, " + authResult.getUser().getName()); findViewById(R.id.graphData).setVisibility(View.VISIBLE); } /* Use MSAL to acquireToken for the end-user * Callback will call Graph api w/ access token & update UI */ private void onCallGraphClicked() { sampleApp.acquireToken(getActivity(), SCOPES, getAuthInteractiveCallback()); } /* Handles the redirect from the System Browser */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { sampleApp.handleInteractiveRequestRedirect(requestCode, resultCode, data); } } ### Altre informazioniMore information #### Ottenere un token utente in modo interattivoGet a user token interactively Chiamando il metodo AcquireTokenAsync viene visualizzata una finestra in cui viene chiesto agli utenti di eseguire l'accesso.Calling the AcquireTokenAsync method results in a window that prompts users to sign in. Le applicazioni in genere richiedono agli utenti di eseguire l'accesso in modo interattivo quando devono accedere per la prima volta a una risorsa protetta.Applications usually require users to sign in interactively the first time they need to access a protected resource. Potrebbe essere necessario eseguire l'accesso anche quando un'operazione invisibile all'utente per l'acquisizione di un token ha esito negativo, ad esempio a causa della scadenza della password di un utente.They might also need to sign in when a silent operation to acquire a token fails (for example, when a user’s password is expired). #### Ottenere un token utente in modo automaticoGet a user token silently Il metodo AcquireTokenSilentAsync gestisce le acquisizioni e i rinnovi dei token senza alcuna interazione da parte dell'utente.The AcquireTokenSilentAsync method handles token acquisitions and renewals without any user interaction. Dopo la prima esecuzione di AcquireTokenAsync, per le chiamate successive il metodo generalmente usato per ottenere i token per accedere alle risorse protette è AcquireTokenSilentAsync, perché le chiamate per richiedere o rinnovare i token vengono effettuate in modo invisibile all'utente.After AcquireTokenAsync is executed for the first time, AcquireTokenSilentAsync is the usual method to use to obtain tokens that access protected resources for subsequent calls, because calls to request or renew tokens are made silently. Il metodo AcquireTokenSilentAsync avrà infine esito negativo,Eventually, the AcquireTokenSilentAsync method will fail. ad esempio perché l'utente ha effettuato la disconnessione o ha modificato la propria password su un altro dispositivo.Reasons for failure might be that the user has either signed out or changed their password on another device. Se MSAL rileva che il problema può essere risolto richiedendo un'azione interattiva, viene attivata un'eccezione MsalUiRequiredException.When MSAL detects that the issue can be resolved by requiring an interactive action, it fires an MsalUiRequiredException exception. L'applicazione può gestire questa eccezione in due modi:Your application can handle this exception in two ways: * Può eseguire immediatamente una chiamata a AcquireTokenAsyncIt can make a call against AcquireTokenAsync immediately. e richiedere così all'utente di eseguire l'accesso.This call results in prompting the user to sign in. Questo modello viene usato in genere nelle applicazioni online in cui non è disponibile contenuto offline per l'utente.This pattern is usually used in online applications where there is no available offline content for the user. L'esempio generato in questa configurazione guidata segue questo modello, il cui funzionamento può essere osservato la prima volta che si esegue l'esempio.The sample generated by this guided setup follows this pattern, which you can see in action the first time you execute the sample. * Dato che nessun utente ha usato l'applicazione, PublicClientApp.Users.FirstOrDefault() contiene un valore Null e viene generata un'eccezione MsalUiRequiredException.Because no user has used the application, PublicClientApp.Users.FirstOrDefault() contains a null value, and an MsalUiRequiredException exception is thrown. * Il codice dell'esempio gestisce quindi l'eccezione chiamando AcquireTokenAsync e richiedendo così all'utente di eseguire l'eccesso.The code in the sample then handles the exception by calling AcquireTokenAsync, which results in prompting the user to sign in. * Può presentare un'indicazione visiva per informare gli utenti che è necessario un accesso interattivo e consentire così di scegliere il momento opportuno per accedere.It can instead present a visual indication to users that an interactive sign-in is required, so that they can select the right time to sign in. In alternativa, l'applicazione può riprovare a eseguire AcquireTokenSilentAsync in un secondo momento.Or the application can retry AcquireTokenSilentAsync later. Questo modello viene in genere adottato quando gli utenti possono usare altre funzionalità dell'applicazione senza interruzioni, ad esempio quando nell'applicazione è disponibile contenuto offline.This pattern is frequently used when users can use other application functionality without disruption--for example, when offline content is available in the application. In questo caso, gli utenti possono decidere se vogliono eseguire l'accesso per accedere alla risorsa protetta oppure aggiornare le informazioni obsolete.In this case, users can decide when they want to sign in to either access the protected resource or refresh the outdated information. In alternativa, l'applicazione può decidere di riprovare a eseguire AcquireTokenSilentAsync quando la rete viene ripristinata dopo essere stata temporaneamente non disponibile.Alternatively, the application can decide to retry AcquireTokenSilentAsync when the network is restored after having been temporarily unavailable. ## Chiamare l'API Microsoft Graph usando il token appena ottenutoCall the Microsoft Graph API by using the token you just obtained Aggiungere i metodi seguenti alla classe MainActivity:Add the following methods into the MainActivity class: java /* Use Volley to make an HTTP request to the /me endpoint from MS Graph using an access token */ private void callGraphAPI() { Log.d(TAG, "Starting volley request to graph"); /* Make sure we have a token to send to graph */ if (authResult.getAccessToken() == null) {return;} RequestQueue queue = Volley.newRequestQueue(this); JSONObject parameters = new JSONObject(); try { parameters.put("key", "value"); } catch (Exception e) { Log.d(TAG, "Failed to put parameters: " + e.toString()); } JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, MSGRAPH_URL, parameters,new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { /* Successfully called graph, process data and send to UI */ Log.d(TAG, "Response: " + response.toString()); updateGraphUI(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d(TAG, "Error: " + error.toString()); } }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<>(); headers.put("Authorization", "Bearer " + authResult.getAccessToken()); return headers; } }; Log.d(TAG, "Adding HTTP GET to Queue, Request: " + request.toString()); request.setRetryPolicy(new DefaultRetryPolicy( 3000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); queue.add(request); } /* Sets the Graph response */ private void updateGraphUI(JSONObject graphResponse) { TextView graphText = (TextView) findViewById(R.id.graphData); graphText.setText(graphResponse.toString()); } ### Altre informazioni sull'esecuzione di una chiamata REST a un'API protettaMore information about making a REST call against a protected API In questa applicazione di esempio, callGraphAPI chiama getAccessToken e quindi effettua una richiesta HTTP GET a una risorsa che richiede un token e restituisce il contenuto.In this sample application, callGraphAPI calls getAccessToken and then makes an HTTP GET request against a resource that requires a token and returns the content. Questo metodo aggiunge il token acquisito nell'intestazione di autorizzazione HTTP.This method adds the acquired token in the HTTP Authorization header. Per questo esempio, la risorsa è l'endpoint me dell'API Microsoft Graph, che visualizza le informazioni del profilo dell'utente.For this sample, the resource is the Microsoft Graph API me endpoint, which displays the user's profile information. ## Configurare la disconnessioneSet up sign-out Aggiungere i metodi seguenti alla classe MainActivity:Add the following methods into the MainActivity class: java /* Clears a user's tokens from the cache. * Logically similar to "sign out" but only signs out of this app. */ private void onSignOutClicked() { /* Attempt to get a user and remove their cookies from cache */ List<User> users = null; try { users = sampleApp.getUsers(); if (users == null) { /* We have no users */ } else if (users.size() == 1) { /* We have 1 user */ /* Remove from token cache */ sampleApp.remove(users.get(0)); updateSignedOutUI(); } else { /* We have multiple users */ for (int i = 0; i < users.size(); i++) { sampleApp.remove(users.get(i)); } } Toast.makeText(getBaseContext(), "Signed Out!", Toast.LENGTH_SHORT) .show(); } catch (MsalClientException e) { Log.d(TAG, "MSAL Exception Generated while getting users: " + e.toString()); } catch (IndexOutOfBoundsException e) { Log.d(TAG, "User at this position does not exist: " + e.toString()); } } /* Set the UI for signed-out user */ private void updateSignedOutUI() { callGraphButton.setVisibility(View.VISIBLE); signOutButton.setVisibility(View.INVISIBLE); findViewById(R.id.welcome).setVisibility(View.INVISIBLE); findViewById(R.id.graphData).setVisibility(View.INVISIBLE); ((TextView) findViewById(R.id.graphData)).setText("No Data"); } ### Altre informazioni sulla disconnessione degli utentiMore information about user sign-out Il metodo onSignOutClicked nel codice precedente rimuove gli utenti dalla cache utente di MSAL. In questo modo, MSAL dimentica l'utente corrente e una futura richiesta di acquisizione di un token avrà esito positivo solo se eseguita in modo interattivo.The onSignOutClicked method in the preceding code removes users from the MSAL user cache, which effectively tells MSAL to forget the current user so that a future request to acquire a token will succeed only if it is made to be interactive. Nonostante l'applicazione in questo esempio supporti singoli utenti, MSAL supporta anche scenari con accesso contemporaneo di più account,Although the application in this sample supports single users, MSAL supports scenarios where multiple accounts can be signed in at the same time. ad esempio un'applicazione di posta elettronica in cui un utente ha più account.An example is an email application where a user has multiple accounts. ## Registrare l'applicazioneRegister your application È possibile registrare l'applicazione in uno dei due modi descritti nelle due sezioni successive.You can register your application in either of two ways, as described in the next two sections. ### Opzione 1: Modalità rapidaOption 1: Express mode È possibile registrare rapidamente l'applicazione seguendo questa procedura:You can quickly register your application by doing the following: 1. Passare al portale di registrazione delle applicazioni Microsoft.Go to the Microsoft Application Registration Portal. 2. Nella casella Application Name (Nome applicazione) immettere un nome per l'applicazione.In the Application Name box, enter a name for your application. 3. Verificare che la casella di controllo Guided Setup (Configurazione guidata) sia selezionata e quindi selezionare Create (Crea).Ensure that the Guided Setup check box is selected, and then select Create. 4. Seguire le istruzioni per ottenere l'ID applicazione e incollarlo nel codice.Follow the instructions for obtaining the application ID, and paste it into your code. ### Opzione 2: Modalità avanzataOption 2: Advanced mode Per registrare l'applicazione e aggiungere le relative informazioni di registrazione alla soluzione, seguire questa procedura:To register your application and add your application registration information to your solution, do the following: 1. Se l'applicazione non è ancora stata registrata, passare al portale di registrazione delle applicazioni Microsoft.If you haven't already registered your application, go to the Microsoft Application Registration Portal. 2. Nella casella Application Name (Nome applicazione) immettere un nome per l'applicazione.In the Application Name box, enter a name for your application. 3. Verificare che la casella di controllo Guided Setup (Configurazione guidata) sia deselezionata e quindi selezionare Create (Crea).Ensure that the Guided Setup check box is cleared, and then select Create. 4. Selezionare Aggiungi piattaforma, Applicazione nativa e quindi Salva.Select Add Platform, select Native Application, and then select Save. 5. In app > java > {host}.{spazionomi} aprire MainActivity.Under app > java > {host}.{namespace}, open MainActivity. 6. Sostituire [Enter the application Id here] nella riga seguente con l'ID applicazione appena registrato:Replace [Enter the application Id here] in the following line with the application ID that you just registered: java final static String CLIENT_ID = "[Enter the application Id here]"; 7. In app > manifests aprire il file AndroidManifest.xml.Under app > manifests, open the AndroidManifest.xml file. 8. Nel nodo manifest\application aggiungere l'attività seguente.In the manifest\application node, add the following activity. In questo modo viene registrata un'attività BrowserTabActivity che consente al sistema operativo di riavviare l'applicazione dopo il completamento dell'autenticazione:Doing so registers a BrowserTabActivity activity that allows the OS to resume your application after it completes the authentication: xml <!--Intent filter to capture System Browser calling back to our app after sign-in--> <activity android:name="com.microsoft.identity.client.BrowserTabActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!--Add in your scheme/host from registered redirect URI--> <!--By default, the scheme should be similar to 'msal[appId]' --> <data android:scheme="msal[Enter the application Id here]" android:host="auth" /> </intent-filter> </activity> 9. Nel nodo BrowserTabActivity sostituire [Enter the application Id here] con l'ID applicazione.In the BrowserTabActivity node, replace [Enter the application Id here] with the application ID. ## Testare il codiceTest your code 1. Distribuire il codice nel dispositivo/emulatore.Deploy your code to your device/emulator. 2. Quando si è pronti per testare l'applicazione, usare un account Azure Active Directory (aziendale o dell'istituto di istruzione) o un account Microsoft (ad esempio live.com o outlook.com) per eseguire l'accesso.When you're ready to test your application, use an Azure Active Directory account (work or school account) or a Microsoft account (live.com, outlook.com) to sign in. Testare l'applicazione Test your application

Immettere nome utente e passwordEnter username and password ### Specificare il consenso per l'accesso all'applicazioneProvide consent for application access Al primo accesso all'applicazione viene richiesto anche di specificare il consenso per permettere all'applicazione di accedere al profilo e di completare l'accesso per l'utente, come mostrato di seguito:The first time that you sign in to your application, you're also prompted to provide consent to allow the application to access your profile and sign you in, as shown here: Specificare il consenso per l'accesso all'applicazione ### Visualizzare i risultati dell'applicazioneView application results Dopo l'accesso dovrebbero essere visualizzati i risultati restituiti dalla chiamata all'API Microsoft Graph.After you sign in, you should see the results that are returned by the call to the Microsoft Graph API. La chiamata all'endpoint me dell'API Microsoft Graph restituisce il profilo utente.The call to the Microsoft Graph API me endpoint returns the user profile. Per un elenco di endpoint di Microsoft Graph comuni, vedere la documentazione per sviluppatori dell'API Microsoft Graph.For a list of common Microsoft Graph endpoints, see Microsoft Graph API developer documentation. ### Altre informazioni sugli ambiti e sulle autorizzazioni delegateMore information about scopes and delegated permissions L'API Microsoft Graph richiede l'ambito user.read per leggere il profilo dell'utente.The Microsoft Graph API requires the user.read scope to read a user's profile. Per impostazione predefinita, questo ambito viene aggiunto automaticamente in ogni applicazione registrata nel portale di registrazione dell'applicazione.This scope is automatically added by default in every application that's registered in the Application Registration Portal. Altre API per Microsoft Graph e le API personalizzate per il server di back-end potrebbero richiedere anche altri ambiti.Other APIs for Microsoft Graph, as well as custom APIs for your back-end server, might require additional scopes. L'API Microsoft Graph richiede l'ambito Calendars.Read per elencare i calendari dell'utente.The Microsoft Graph API requires the Calendars.Read scope to list the user’s calendars. Per accedere ai calendari dell'utente nel contesto di un'applicazione, aggiungere l'autorizzazione delegata Calendars.Read alle informazioni di registrazione dell'applicazione.To access the user’s calendars in the context of an application, add the Calendars.Read delegated permission to the application registration information. Aggiungere quindi l'ambito Calendars.Read alla chiamata acquireTokenSilent.Then, add the Calendars.Read scope to the acquireTokenSilent call. >[!NOTE] >Con l'aumentare del numero di ambiti è possibile che all'utente venga chiesto di esprimere anche altri tipi di consenso.The user might be prompted for additional consents as you increase the number of scopes. ## Guida e supportoHelp and support Se è necessaria assistenza, se si vuole segnalare un problema o si vogliono ottenere altre informazioni sulle opzioni di supporto, vedere l'articolo seguente:If you need help, want to report an issue, or want to learn more about your support options, see the following article: > [!div class="nextstepaction"] > Assistenza e supporto per gli sviluppatoriHelp and support for developers