Een token ophalen voor een mobiele app die web-API's aanroept
Voordat uw app beveiligde web-API's kan aanroepen, heeft deze een toegangstoken nodig. In dit artikel wordt u begeleid bij het ophalen van een token met behulp van de Microsoft Authentication Library (MSAL).
Een bereik definiëren
Wanneer u een token aanvraagt, definieert u een bereik. Het bereik bepaalt tot welke gegevens uw app toegang heeft.
De eenvoudigste manier om een bereik te definiëren, is door de gewenste web-API's App ID URI
te combineren met het bereik .default
. Met deze definitie wordt aan het Microsoft Identity Platform doorgegeven dat uw app alle bereiken vereist die zijn ingesteld in de portal.
Android
String[] SCOPES = {"https://graph.microsoft.com/.default"};
iOS
let scopes = ["https://graph.microsoft.com/.default"]
Tokens ophalen
Tokens ophalen via MSAL
Met MSAL kunnen apps op de achtergrond en interactief tokens ophalen. Wanneer u AcquireTokenSilent()
of AcquireTokenInteractive()
aanroept, retourneert MSAL een toegangstoken voor de aangevraagde bereiken. Het juiste patroon is om een aanvraag op de achtergrond te doen en vervolgens terug te vallen op een interactieve aanvraag.
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) {
// One account found, attempt silent sign-in.
sampleApp.acquireTokenSilentAsync(SCOPES, accounts.get(0), getAuthSilentCallback());
} else if (accounts.isEmpty()) {
// No accounts found. Interactively request a token.
sampleApp.acquireToken(getActivity(), SCOPES, getAuthInteractiveCallback());
} else {
// Multiple accounts found. Handle according to your app logic.
// You may need to prompt the user to select an 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
Probeer eerst een token op de achtergrond op te halen:
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
}
Als MSAL MSALErrorInteractionRequired
retourneert, probeert u interactief tokens op te halen:
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
})
MSAL voor iOS en macOS ondersteunt verschillende modifiers om een token interactief of op de achtergrond op te halen:
- Algemene parameters voor het ophalen van een token
- Parameters voor het ophalen van een interactief token
- Parameters voor het ophalen van een token op de achtergrond
Verplichte parameters in MSAL.NET
AcquireTokenInteractive
heeft slechts één verplichte parameter: scopes
. Met de parameter scopes
worden tekenreeksen opgesomd die de bereiken definiëren waarvoor een token is vereist. Als het token voor Microsoft Graph is, kunt u de vereiste bereiken vinden in de API-verwijzing van elke Microsoft Graph API. Ga in de verwijzing naar de sectie Machtigingen.
Als u bijvoorbeeld de contactpersonen van de gebruiker wilt weergeven, gebruikt u het bereik 'User.Read', 'Contacts.Read'. Raadpleeg Microsoft Graph-machtigingen voor meer informatie.
Op Android kunt u bovenliggende activiteit opgeven wanneer u de app maakt met behulp van PublicClientApplicationBuilder
. Als u de bovenliggende activiteit niet op dat moment opgeeft, kunt u deze later opgeven met behulp van .WithParentActivityOrWindow
, zoals in de volgende sectie. Als u bovenliggende activiteit opgeeft, wordt het token na de interactie teruggezet naar die bovenliggende activiteit. Als u deze niet opgeeft, genereert de aanroep .ExecuteAsync()
een uitzondering.
Specifieke optionele parameters in MSAL.NET
In de volgende secties worden de optionele parameters in MSAL.NET uitgelegd.
WithPrompt
De parameter WithPrompt()
bepaalt de interactiviteit met de gebruiker door een prompt op te geven.
De klasse definieert de volgende constanten:
SelectAccount
dwingt de beveiligingstokenservice (STS) om het dialoogvenster voor accountselectie weer te geven. Het dialoogvenster bevat de accounts waarvoor de gebruiker een sessie heeft. U kunt deze optie gebruiken als u de gebruiker wilt laten kiezen uit verschillende identiteiten. Met deze optie stuurt MSALprompt=select_account
naar de id-provider.De constante
SelectAccount
is de standaardwaarde en biedt de best mogelijke ervaring op basis van de beschikbare informatie. De beschikbare informatie kan account, aanwezigheid van een sessie voor de gebruiker, enzovoort omvatten. Wijzig deze standaardinstelling alleen als u een goede reden hebt om dit te doen.Met
Consent
kunt u de gebruiker om toestemming vragen, zelfs als er eerder toestemming is verleend. In dit geval verzendt MSALprompt=consent
naar de id-provider.Mogelijk wilt u de constante
Consent
gebruiken in beveiligingstoepassingen waarbij aan gebruikers het toestemmingsdialoogvenster bij elk gebruik moet worden weergegeven om aan de governance van de organisatie te voldoen.Met
ForceLogin
kan de service de gebruiker om aanmeldingsgegevens vragen, zelfs als de prompt niet nodig is.Deze optie kan handig zijn als het ophalen van het token mislukt en u de gebruiker zich opnieuw wilt laten aanmelden. In dit geval verzendt MSAL
prompt=login
naar de id-provider. U kunt deze optie gebruiken in beveiligingstoepassingen, waarbij de gebruiker zich elke keer moet aanmelden voor toegang tot specifieke onderdelen van de toepassing om aan de governance van de organisatie te voldoen.Never
is alleen voor .NET 4.5 en Windows Runtime (WinRT). Met deze constante krijgt de gebruiker geen prompt, maar wordt geprobeerd de cookie te gebruiken die is opgeslagen in de verborgen, ingesloten webweergave. Zie Webbrowsers gebruiken met MSAL.NET voor meer informatie.Als deze optie mislukt, genereert
AcquireTokenInteractive
een uitzondering om u te laten weten dat er een gebruikersinterface-interactie nodig is. Gebruik vervolgens een anderePrompt
-parameter.NoPrompt
stuurt geen prompt naar de id-provider.Deze optie is alleen handig voor beleid voor het bewerken van profielen in Azure Active Directory B2C. Zie B2C-details voor meer informatie.
WithExtraScopeToConsent
Gebruik de modifier WithExtraScopeToConsent
in een geavanceerd scenario waarin u wilt dat de gebruiker vooraf toestemming geeft voor verschillende resources. U kunt deze modifier gebruiken wanneer u geen incrementele toestemming wilt gebruiken, die normaal gesproken wordt gebruikt met MSAL.NET of het Microsoft Identity Platform. Zie Gebruikers vooraf toestemming laten geven voor verschillende resources voor meer informatie.
Hier volgt een codevoorbeeld:
var result = await app.AcquireTokenInteractive(scopesForCustomerApi)
.WithExtraScopeToConsent(scopesForVendorApi)
.ExecuteAsync();
Andere optionele parameters
Zie de referentiedocumentatie voor AcquireTokenInteractiveParameterBuilder voor meer informatie over de andere optionele parameters voor AcquireTokenInteractive
.
Tokens ophalen via het protocol
We raden u af om rechtstreeks via het protocol tokens op te halen. Als u dit doet, biedt de app geen ondersteuning voor sommige scenario's waarbij eenmalige aanmelding (SSO), apparaatbeheer en voorwaardelijke toegang zijn betrokken.
Wanneer u het protocol gebruikt om tokens voor mobiele apps op te halen, moet u twee aanvragen indienen:
- Autorisatiecode ophalen.
- Wissel de code voor een token.
Autorisatiecode ophalen
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
Toegang krijgen en het token vernieuwen
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
Volgende stappen
Meer informatie vindt u door een React-toepassing met één pagina (SPA) te bouwen waarmee gebruikers worden aangemeld in de volgende reeks meerdelige zelfstudies.
Voorbeelden van mobiele code van Microsoft Identity Platform verkennen