Jogkivonat lekérése webes API-kat hívó mobilalkalmazáshoz
Mielőtt az alkalmazás meghívhatja a védett webes API-kat, hozzáférési jogkivonatra van szüksége. Ez a cikk végigvezeti a jogkivonatok Microsoft Authentication Library (MSAL) használatával történő lekérésének folyamatán.
Hatókör definiálása
Jogkivonat kérésekor adjon meg egy hatókört. A hatókör határozza meg, hogy az alkalmazás milyen adatokhoz férhet hozzá.
A hatókör meghatározásának legegyszerűbb módja a kívánt webes API-k App ID URI
és a hatókör .default
kombinálása. Ez a definíció azt jelzi a Microsoft Identitásplatform, hogy az alkalmazáshoz a portálon beállított összes hatókörre szükség van.
Android
String[] SCOPES = {"https://graph.microsoft.com/.default"};
iOS
let scopes = ["https://graph.microsoft.com/.default"]
Xamarin
var scopes = new [] {"https://graph.microsoft.com/.default"};
Jogkivonatok lekérése
Jogkivonatok beszerzése MSAL-en keresztül
Az MSAL lehetővé teszi az alkalmazások számára a jogkivonatok csendes és interaktív beszerzését. Híváskor AcquireTokenSilent()
vagy AcquireTokenInteractive()
az MSAL egy hozzáférési jogkivonatot ad vissza a kért hatókörökhöz. A helyes minta egy csendes kérés létrehozása, majd egy interaktív kérésre való visszalépés.
Android
String[] SCOPES = {"https://graph.microsoft.com/.default"};
PublicClientApplication sampleApp = new PublicClientApplication(
this.getApplicationContext(),
R.raw.auth_config);
// Check if there are any accounts we can sign in silently.
// Result is in the silent callback (success or error).
sampleApp.getAccounts(new PublicClientApplication.AccountsLoadedCallback() {
@Override
public void onAccountsLoaded(final List<IAccount> accounts) {
if (accounts.isEmpty() && accounts.size() == 1) {
// TODO: Create a silent callback to catch successful or failed request.
sampleApp.acquireTokenSilentAsync(SCOPES, accounts.get(0), getAuthSilentCallback());
} else {
/* No accounts or > 1 account. */
}
}
});
[...]
// No accounts found. Interactively request a token.
// TODO: Create an interactive callback to catch successful or failed requests.
sampleApp.acquireToken(getActivity(), SCOPES, getAuthInteractiveCallback());
iOS
Először próbálja meg csendesen beszerezni a jogkivonatot:
NSArray *scopes = @[@"https://graph.microsoft.com/.default"];
NSString *accountIdentifier = @"my.account.id";
MSALAccount *account = [application accountForIdentifier:accountIdentifier error:nil];
MSALSilentTokenParameters *silentParams = [[MSALSilentTokenParameters alloc] initWithScopes:scopes account:account];
[application acquireTokenSilentWithParameters:silentParams completionBlock:^(MSALResult *result, NSError *error) {
if (!error)
{
// You'll want to get the account identifier to retrieve and reuse the account
// for later acquireToken calls
NSString *accountIdentifier = result.account.identifier;
// Access token to call the web API
NSString *accessToken = result.accessToken;
}
// Check the error
if (error && [error.domain isEqual:MSALErrorDomain] && error.code == MSALErrorInteractionRequired)
{
// Interactive auth will be required, call acquireTokenWithParameters:error:
return;
}
}];
let scopes = ["https://graph.microsoft.com/.default"]
let accountIdentifier = "my.account.id"
guard let account = try? application.account(forIdentifier: accountIdentifier) else { return }
let silentParameters = MSALSilentTokenParameters(scopes: scopes, account: account)
application.acquireTokenSilent(with: silentParameters) { (result, error) in
guard let authResult = result, error == nil else {
let nsError = error! as NSError
if (nsError.domain == MSALErrorDomain &&
nsError.code == MSALError.interactionRequired.rawValue) {
// Interactive auth will be required, call acquireToken()
return
}
return
}
// You'll want to get the account identifier to retrieve and reuse the account
// for later acquireToken calls
let accountIdentifier = authResult.account.identifier
// Access token to call the web API
let accessToken = authResult.accessToken
}
Ha az MSAL visszatér MSALErrorInteractionRequired
, próbálja meg interaktív módon beszerezni a jogkivonatokat:
UIViewController *viewController = ...; // Pass a reference to the view controller that should be used when getting a token interactively
MSALWebviewParameters *webParameters = [[MSALWebviewParameters alloc] initWithAuthPresentationViewController:viewController];
MSALInteractiveTokenParameters *interactiveParams = [[MSALInteractiveTokenParameters alloc] initWithScopes:scopes webviewParameters:webParameters];
[application acquireTokenWithParameters:interactiveParams completionBlock:^(MSALResult *result, NSError *error) {
if (!error)
{
// You'll want to get the account identifier to retrieve and reuse the account
// for later acquireToken calls
NSString *accountIdentifier = result.account.identifier;
NSString *accessToken = result.accessToken;
}
}];
let viewController = ... // Pass a reference to the view controller that should be used when getting a token interactively
let webviewParameters = MSALWebviewParameters(authPresentationViewController: viewController)
let interactiveParameters = MSALInteractiveTokenParameters(scopes: scopes, webviewParameters: webviewParameters)
application.acquireToken(with: interactiveParameters, completionBlock: { (result, error) in
guard let authResult = result, error == nil else {
print(error!.localizedDescription)
return
}
// Get access token from result
let accessToken = authResult.accessToken
})
Az iOS-hez és macOS-hez készült MSAL különböző módosítókat támogat a jogkivonat interaktív vagy csendes beszerzéséhez:
- A jogkivonat lekérésének gyakori paraméterei
- Interaktív jogkivonat lekérésének paraméterei
- Csendes jogkivonat lekérésének paraméterei
Xamarin
Az alábbi példa azt a minimális kódot mutatja be, amely interaktívan lekér egy jogkivonatot. A példa a Microsoft Graph használatával olvassa be a felhasználó profilját.
string[] scopes = new string[] {"user.read"};
var app = PublicClientApplicationBuilder.Create(clientId).Build();
var accounts = await app.GetAccountsAsync();
AuthenticationResult result;
try
{
result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
.ExecuteAsync();
}
catch(MsalUiRequiredException)
{
result = await app.AcquireTokenInteractive(scopes)
.ExecuteAsync();
}
Kötelező paraméterek a MSAL.NET
AcquireTokenInteractive
csak egy kötelező paramétere van: scopes
. A scopes
paraméter számba adja azokat a sztringeket, amelyek meghatározzák azokat a hatóköröket, amelyekhez jogkivonatra van szükség. Ha a jogkivonat a Microsoft Graphhoz tartozik, a szükséges hatóköröket az egyes Microsoft Graph API-k API-referenciajában találja. A hivatkozásban lépjen az "Engedélyek" szakaszra.
A felhasználó névjegyeinek listázásához például használja a "User.Read", "Contacts.Read" hatókört. További információ: Microsoft Graph-engedélyek referenciája.
Androidon megadhatja a szülőtevékenységet, amikor az alkalmazást a használatával PublicClientApplicationBuilder
hozza létre. Ha nem adja meg a szülőtevékenységet abban az időben, később a következő szakaszban leírtak szerint .WithParentActivityOrWindow
adhatja meg. Ha szülőtevékenységet ad meg, a jogkivonat az interakció után visszakerül a szülőtevékenységhez. Ha nem adja meg, a .ExecuteAsync()
hívás kivételt eredményez.
Adott választható paraméterek a MSAL.NET
Az alábbi szakaszok a MSAL.NET választható paramétereit ismertetik.
WithPrompt
A WithPrompt()
paraméter egy üzenet megadásával szabályozza a felhasználóval való interaktivitást.
Az osztály a következő állandókat határozza meg:
SelectAccount
kényszeríti a biztonsági jogkivonat-szolgáltatást (STS) a fiókválasztási párbeszédpanel megjelenítésére. A párbeszédpanel tartalmazza azokat a fiókokat, amelyeknek a felhasználó munkamenete van. Ezt a lehetőséget akkor használhatja, ha engedélyezni szeretné, hogy a felhasználó válasszon a különböző identitások közül. Ez a beállítás az MSAL-t az identitásszolgáltatónak küldiprompt=select_account
el.Az
SelectAccount
állandó az alapértelmezett érték, és hatékonyan biztosítja a lehető legjobb élményt a rendelkezésre álló információk alapján. A rendelkezésre álló információk közé tartozhat például a fiók, a felhasználó munkamenetének jelenléte stb. Ne módosítsa ezt az alapértelmezett beállítást, hacsak nincs rá jó oka.Consent
lehetővé teszi, hogy kérje a felhasználót a hozzájárulás megadására még akkor is, ha korábban már megadták a hozzájárulást. Ebben az esetben az MSAL elküldiprompt=consent
az identitásszolgáltatónak.Érdemes lehet az állandót használni a
Consent
biztonságra összpontosító alkalmazásokban, ahol a szervezetirányítás megköveteli, hogy a felhasználók minden egyes alkalommal lássák a hozzájárulás párbeszédpanelt, amikor az alkalmazást használják.ForceLogin
lehetővé teszi a szolgáltatás számára, hogy kérje a felhasználótól a hitelesítő adatokat, még akkor is, ha nincs szükség a kérésre.Ez a beállítás akkor lehet hasznos, ha a jogkivonat beszerzése meghiúsul, és engedélyezni szeretné a felhasználónak, hogy újra bejelentkezjen. Ebben az esetben az MSAL elküldi
prompt=login
az identitásszolgáltatónak. Érdemes lehet ezt a beállítást olyan, biztonságra összpontosító alkalmazásokban használni, ahol a szervezetirányítás megköveteli a felhasználótól, hogy minden alkalommal jelentkezzen be, amikor az alkalmazás adott részeihez fér hozzá.Never
csak .NET 4.5 és Windows-futtatókörnyezet (WinRT) esetén használható. Ez az állandó nem kéri a felhasználót, de megpróbálja használni a rejtett beágyazott webes nézetben tárolt cookie-t. További információ: Webböngészők használata MSAL.NET.Ha ez a beállítás nem sikerül, akkor
AcquireTokenInteractive
kivételt küld, amely értesíti Önt arról, hogy felhasználói felületi beavatkozásra van szükség. Ezután használjon egy másikPrompt
paramétert.NoPrompt
nem küld üzenetet az identitásszolgáltatónak.Ez a beállítás csak az Azure Active Directory B2C szerkesztési profilszabályzataiban hasznos. További információ: B2C specifics.
WithExtraScopeToConsent
WithExtraScopeToConsent
A módosító olyan speciális forgatókönyvben használható, amelyben azt szeretné, hogy a felhasználó előzetes hozzájárulást adjon több erőforráshoz. Ezt a módosítót akkor használhatja, ha nem szeretne növekményes hozzájárulást használni, amelyet általában a MSAL.NET vagy a Microsoft Identitásplatform használ. További információ: A felhasználó beleegyezése több erőforrásra vonatkozóan.
Íme egy példa kódra:
var result = await app.AcquireTokenInteractive(scopesForCustomerApi)
.WithExtraScopeToConsent(scopesForVendorApi)
.ExecuteAsync();
Egyéb választható paraméterek
A további választható paraméterekről AcquireTokenInteractive
a AcquireTokenInteractiveParameterBuilder referenciadokumentációjában olvashat.
Jogkivonatok beszerzése a protokollon keresztül
Nem javasoljuk, hogy közvetlenül használja a protokollt a jogkivonatok lekéréséhez. Ha igen, akkor az alkalmazás nem támogatja az egyszeri bejelentkezést (SSO), az eszközkezelést és a feltételes hozzáférést magában foglaló forgatókönyveket.
Amikor a protokollt használja a mobilalkalmazások jogkivonatainak lekéréséhez, két kérést kell intéznie:
- Szerezze be az engedélyezési kódot.
- Cserélje le a kódot egy jogkivonatra.
Engedélyezési kód lekérése
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=<CLIENT_ID>
&response_type=code
&redirect_uri=<ENCODED_REDIRECT_URI>
&response_mode=query
&scope=openid%20offline_access%20https%3A%2F%2Fgraph.microsoft.com%2F.default
&state=12345
Hozzáférés kérése és a jogkivonat frissítése
POST /{tenant}/oauth2/v2.0/token HTTP/1.1
Host: https://login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
client_id=<CLIENT_ID>
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&code=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq3n8b2JRLk4OxVXr...
&redirect_uri=<ENCODED_REDIRECT_URI>
&grant_type=authorization_code
Következő lépések
Lépjen tovább a következő cikkre ebben a forgatókönyvben: Webes API meghívása.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: