Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Gli hook in MSAL React sono funzioni che consentono di usare le funzionalità MSAL e i metodi di stato e ciclo di vita React all'interno di componenti funzionali. Gli hook principali sono useAccount, useIsAuthenticated, useMsale useMsalAuthentication. Questo articolo illustra come usare ognuno di questi hook.
useAccount hook
L'hook useAccount accetta un accountIdentifier parametro e restituisce l'oggetto AccountInfo per tale account se è connesso o null in caso contrario. Se non viene specificato alcun identificatore di account, verrà restituito l'account attivo corrente.
Per altre informazioni sull'oggetto AccountInfo restituito nella @azure/msal-browser documentazione, vedere API di accesso in MSAL.
const accountIdentifier = {
localAccountId: "example-local-account-identifier",
homeAccountId: "example-home-account-identifier"
username: "example-username" // We do not recommend relying only on username
}
const accountInfo = useAccount(accountIdentifier);
useIsAuthenticated hook
L'hook useIsAuthenticated restituisce un valore booleano che indica se un account è connesso o meno. Facoltativamente accetta un accountIdentifier oggetto che è possibile fornire se è necessario sapere se un account specifico è connesso o meno.
Determinare se un account è attualmente connesso
Il frammento di codice seguente usa l'hook useIsAuthenticated del @azure/msal-react pacchetto. Il componente visualizza quindi un messaggio in modo condizionale, a seconda che un utente abbia effettuato l'accesso oppure no.
import React from 'react';
import { useIsAuthenticated } from "@azure/msal-react";
export function App() {
const isAuthenticated = useIsAuthenticated();
return (
<React.Fragment>
<p>Anyone can see this paragraph.</p>
{isAuthenticated && (
<p>At least one account is signed in!</p>
)}
{!isAuthenticated && (
<p>No users are signed in!</p>
)}
</React.Fragment>
);
}
Determinare se un utente specifico ha eseguito l'accesso
Il frammento di codice seguente usa l'hook useIsAuthenticated del @azure/msal-react pacchetto per determinare se un utente specifico ha eseguito l'accesso.
import React from 'react';
import { useIsAuthenticated } from "@azure/msal-react";
export function App() {
const accountIdentifiers = {
localAccountId: "example-local-account-identifier",
homeAccountId: "example-home-account-identifier",
username: "example-username"
}
const isAuthenticated = useIsAuthenticated(accountIdentifiers);
return (
<React.Fragment>
<p>Anyone can see this paragraph.</p>
{isAuthenticated && (
<p>User with specified localAccountId is signed in!</p>
)}
{!isAuthenticated && (
<p>User with specified localAccountId is not signed in!</p>
)}
</React.Fragment>
);
}
useMsal hook
L'hook useMsal restituisce il contesto. Questa opzione può essere usata se è necessario accedere all'istanza PublicClientApplication, all'elenco degli account attualmente connessi oppure sapere se è attualmente in corso un accesso o un'altra interazione.
Nota: il accounts valore restituito da useMsal aggiornerà solo quando gli account vengono aggiunti o rimossi e non verranno aggiornati quando le attestazioni vengono aggiornate. Se hai bisogno di accedere ai claim aggiornati per l'utente corrente, usa l'hook useAccount o chiama invece acquireTokenSilent.
import { useState, useEffect } from "react";
import { useMsal } from "@azure/msal-react";
import { InteractionStatus } from "@azure/msal-browser";
const { instance, accounts, inProgress } = useMsal();
const [loading, setLoading] = useState(false);
const [apiData, setApiData] = useState(null);
useEffect(() => {
if (!loading && inProgress === InteractionStatus.None && accounts.length > 0) {
if (apiData) {
// Skip data refresh if already set - adjust logic for your specific use case
return;
}
const tokenRequest = {
account: accounts[0], // This is an example - Select account based on your app's requirements
scopes: ["User.Read"]
}
// Acquire an access token
instance.acquireTokenSilent(tokenRequest).then((response) => {
// Call your API with the access token and return the data you need to save in state
callApi(response.accessToken).then((data) => {
setApiData(data);
setLoading(false);
});
}).catch(async (e) => {
// Catch interaction_required errors and call interactive method to resolve
if (e instanceof InteractionRequiredAuthError) {
await instance.acquireTokenRedirect(tokenRequest);
}
throw e;
});
}
}, [inProgress, accounts, instance, loading, apiData]);
if (loading || inProgress === InteractionStatus.Login) {
// Render loading component
} else if (apiData) {
// Render content that depends on data from your API
}
useMsalAuthentication Gancio
L'hook useMsalAuthentication avvierà l'accesso se l'utente non ha già effettuato l'accesso; in caso contrario, tenterà di ottenere un token.
Parametri di input
Esistono alcuni parametri di input diversi che è possibile fornire all'hook useMsalAuthentication :
- interactionType : (Nessuno, Popup, Reindirizzamento o Invisibile all'utente) specifica come acquisire i token o l'accesso quando è necessaria l'interazione (si noti che l'opzione Silent include alcune considerazioni aggiuntive illustrate di seguito).
- oggetto richiesta - (facoltativo) specifica i parametri aggiuntivi da utilizzare per la chiamata di accesso o di acquisizione del token
- accountIdentifiers - l'oggetto viene usato per indicare all'hook per quale utente deve effettuare l'accesso o ottenere i token
Proprietà di restituzione
-
result - Il risultato dell'ultimo accesso riuscito o dell'ultima acquisizione del token. Si noti che questo hook tenta solo di accedere o acquisire automaticamente i token una volta. È responsabilità dell'applicazione chiamare la funzione
loginoacquireToken, se necessario, per aggiornare questo valore. -
error : se si verifica un errore durante l'acquisizione di un account di accesso o di token, questa proprietà conterrà informazioni sull'errore. È possibile usare le
loginfunzioni oacquireTokenrestituite da questo hook per riprovare. La proprietàerrorverrà cancellata al successivo accesso riuscito o alla successiva acquisizione riuscita del token. -
login- funzione che può essere utilizzata per ripetere un accesso non riuscito. Leresultproprietà eerrorverranno aggiornate. -
acquireToken: funzione che può essere usata per ottenere un nuovo token di accesso prima di chiamare un'API protetta. Leresultproprietà eerrorverranno aggiornate.
Passando il tipo di interazione "Silent", verrà chiamato ssoSilent, che tenta di aprire un iframe nascosto e riutilizzare una sessione esistente con Microsoft Entra ID. Questo non funzionerà nei browser che bloccano cookie di terze parti come Safari. Inoltre, l'oggetto richiesta è necessario quando si usa il tipo "Silent". Se si dispone già delle informazioni di accesso dell'utente, è possibile passare i loginHint parametri facoltativi o sid per accedere a un account specifico. Nota: quando si usa senza fornire informazioni sulla sessione dell'utente, è necessario tenere presenti ssoSilent.
ssoSilent esempio
Se usi la modalità silent, dovresti intercettare eventuali errori e tentare un accesso interattivo come soluzione di ripiego.
import React, { useEffect } from 'react';
import { AuthenticatedTemplate, UnauthenticatedTemplate, useMsal, useMsalAuthentication } from "@azure/msal-react";
import { InteractionType, InteractionRequiredAuthError } from '@azure/msal-browser';
function App() {
const request = {
loginHint: "name@example.com",
scopes: ["User.Read"]
}
const { login, result, error } = useMsalAuthentication(InteractionType.Silent, request);
useEffect(() => {
if (error instanceof InteractionRequiredAuthError) {
login(InteractionType.Popup, request);
}
}, [error]);
const { accounts } = useMsal();
return (
<React.Fragment>
<p>Anyone can see this paragraph.</p>
<AuthenticatedTemplate>
<p>Signed in as: {accounts[0]?.username}</p>
</AuthenticatedTemplate>
<UnauthenticatedTemplate>
<p>No users are signed in!</p>
</UnauthenticatedTemplate>
</React.Fragment>
);
}
export default App;
Esempio di utente specifico
Se si vuole assicurarsi che un utente specifico sia connesso, specificare un accountIdentifiers oggetto .
import React from 'react';
import { useMsalAuthentication } from "@azure/msal-react";
import { InteractionType } from '@azure/msal-browser';
export function App() {
const accountIdentifiers = {
username: "example-username"
}
const request = {
loginHint: "example-username",
scopes: ["User.Read"]
}
const { login, result, error } = useMsalAuthentication(InteractionType.Popup, request, accountIdentifiers);
return (
<React.Fragment>
<p>Anyone can see this paragraph.</p>
<AuthenticatedTemplate username="example-username">
<p>Example user is signed in!</p>
</AuthenticatedTemplate>
<UnauthenticatedTemplate username="example-username">
<p>Example user is not signed in!</p>
</UnauthenticatedTemplate>
</React.Fragment>
);
}
Vedere anche
È possibile trovare la documentazione per le API PublicClientApplication esposte in MSAL Browser: