Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Hooks in MSAL React to funkcje, które umożliwiają korzystanie z funkcji biblioteki MSAL oraz metod stanu i cyklu życia react wewnątrz składników funkcjonalnych. Główne hooki to useAccount, useIsAuthenticated, useMsal i useMsalAuthentication. W tym artykule dowiesz się, jak używać każdego z tych haków.
useAccount Hak
Hook useAccount przyjmuje parametr accountIdentifier i zwraca obiekt AccountInfo dla tego konta, jeśli konto jest zalogowane, lub null, jeśli nie jest. Jeśli nie podano identyfikatora konta, zostanie zwrócone bieżące aktywne konto .
Możesz przeczytać więcej o obiekcie AccountInfo, zwracanym w dokumentacji @azure/msal-browser, w temacie Interfejsy API logowania w bibliotece 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 Hak
Hook useIsAuthenticated zwraca wartość logiczną wskazującą, czy konto jest zalogowane, czy nie. Opcjonalnie akceptuje accountIdentifier obiekt, który można podać, jeśli musisz wiedzieć, czy jest zalogowane określone konto.
Ustal, czy jakiekolwiek konto jest obecnie zalogowane
Poniższy fragment kodu używa hooka useIsAuthenticated z pakietu @azure/msal-react. Składnik następnie warunkowo renderuje komunikat na podstawie tego, czy użytkownik jest zalogowany, czy nie.
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>
);
}
Określanie, czy określony użytkownik jest zalogowany
Poniższy fragment kodu używa hooka useIsAuthenticated z pakietu @azure/msal-react, aby sprawdzić, czy konkretny użytkownik jest zalogowany.
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 Hak
Hook useMsal zwraca kontekst. Można tego użyć, jeśli potrzebujesz dostępu do instancji PublicClientApplication, listy kont, na które użytkownik jest obecnie zalogowany, lub wiedzieć, czy logowanie albo inna interakcja właśnie trwa.
Uwaga: wartość zwracana przez useMsal w accounts będzie aktualizowana tylko wtedy, gdy konta zostaną dodane lub usunięte, i nie będzie aktualizowana, gdy oświadczenia zostaną zaktualizowane. Jeśli potrzebujesz dostępu do zaktualizowanych claimów dla bieżącego użytkownika, użyj hooka useAccount lub zamiast tego wywołaj 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 Hak
Hak useMsalAuthentication zainicjuje logowanie, jeśli użytkownik nie jest jeszcze zalogowany, w przeciwnym razie podejmie próbę uzyskania tokenu.
Parametry wejściowe
Istnieje kilka różnych parametrów wejściowych, które można podać do haka useMsalAuthentication :
- interactionType — (Brak, Wyskakujące, Przekierowanie lub Dyskretne) określa, jak chcesz uzyskać tokeny lub zalogować się, gdy jest wymagana interakcja (pamiętaj, że opcja Dyskretna ma kilka dodatkowych zagadnień opisanych poniżej).
- obiekt żądania — (opcjonalnie) określa dodatkowe parametry, które mają być używane przez wywołanie logowania lub pozyskiwania tokenu
- accountIdentifiers — obiekt służący do określenia, dla którego użytkownika hook powinien wykonać logowanie lub pobrać tokeny
Właściwości zwracane
-
result — wynik ostatniego pomyślnego logowania lub pozyskiwania tokenu. Należy pamiętać, że ten hak podejmuje automatyczną próbę zalogowania się lub uzyskania tokenów tylko raz. To aplikacja odpowiada za wywołanie funkcji
loginlubacquireTokenw razie potrzeby, aby zaktualizować tę wartość. -
error — jeśli podczas logowania lub pozyskiwania tokenu wystąpi błąd, ta właściwość będzie zawierać informacje o błędzie. Możesz użyć funkcji
loginlubacquireToken, zwróconych przez ten hook, aby ponowić próbę. Właściwośćerrorzostanie wyczyszczona przy następnym pomyślnym logowaniu lub uzyskaniu tokenu. -
login- funkcja, która może służyć do ponawiania próby nieudanego logowania. Właściwościresultierrorzostaną zaktualizowane. -
acquireToken— funkcja, która może służyć do uzyskiwania nowego tokenu dostępu przed wywołaniem chronionego interfejsu API. Właściwościresultierrorzostaną zaktualizowane.
Przekazanie typu interakcji „Cicha” spowoduje wywołanie metody ssoSilent, która próbuje otworzyć ukrytą ramkę iframe i ponownie użyć istniejącej sesji z Microsoft Entra ID. Nie będzie to działać w przeglądarkach, które blokują pliki cookie innych firm, takie jak Safari. Ponadto obiekt żądania jest wymagany w przypadku używania typu "Dyskretny". Jeśli masz już dane logowania użytkownika, możesz przekazać jeden z opcjonalnych parametrów loginHint lub sid, aby zalogować konkretne konto. Uwaga: istnieją dodatkowe kwestie — podczas korzystania z ssoSilent bez podawania jakichkolwiek informacji o sesji użytkownika.
przykład ssoSilent
Jeśli używasz trybu cichego, należy przechwycić wszelkie błędy i w razie niepowodzenia spróbować zalogować się interaktywnie.
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;
Przykład określonego użytkownika
Jeśli chcesz upewnić się, że określony użytkownik jest zalogowany, podaj accountIdentifiers obiekt.
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>
);
}
Zobacz także
Dokumentację interfejsów API udostępnianych przez PublicClientApplication w bibliotece MSAL Browser można znaleźć tutaj: