Aracılığıyla paylaş


Web API'lerini çağıran bir mobil uygulama için belirteç alma

için geçerlidir: beyaz onay işareti simgesine sahip Yeşil daire . Workforce kiracıları gri X simgesiyle Beyaz daire . dış kiracıları (daha fazla bilgi)

Uygulamanızın korumalı web API'lerini çağırabilmesi için bir erişim belirteci gerekir. Bu makalede, Microsoft Kimlik Doğrulama Kitaplığı'nı (MSAL) kullanarak belirteç alma işleminde size yol gösterilir.

Kapsam tanımlama

Jeton istediğinizde bir kapsam tanımlayın. Kapsam, uygulamanızın erişebileceği verileri belirler.

Kapsam tanımlamanın en kolay yolu, istenen web API'lerini App ID URI kapsamıyla .defaultbirleştirmektir. Bu tanım, Microsoft kimlik platformu uygulamanızın portalda ayarlanan tüm kapsamları gerektirdiğini bildirir.

Android

String[] SCOPES = {"https://graph.microsoft.com/.default"};

Ios

let scopes = ["https://graph.microsoft.com/.default"]

Jetonları al

MSAL aracılığıyla belirteç alma

MSAL, uygulamaların sessiz ve etkileşimli bir şekilde belirteç almasına olanak tanır. veya AcquireTokenSilent() veya AcquireTokenInteractive() öğesini çağırdığınızda, MSAL istenen kapsamlar için bir erişim belirteci döndürür. Doğru desen, sessiz bir istekte bulunmak ve sonra etkileşimli bir isteğe geri dönmektir.

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

İlk olarak görünmeden bir belirteç elde etmeyi deneyin.


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
}

Eğer MSAL MSALErrorInteractionRequired geri döndürürse, belirteçleri etkileşimli olarak almayı deneyin.

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
})

iOS ve macOS için MSAL, etkileşimli veya sessiz bir şekilde belirteç almak için çeşitli değiştiricileri destekler:

MSAL.NET'de zorunlu parametreler

AcquireTokenInteractive yalnızca bir zorunlu parametresi vardır: scopes. parametresi, scopes belirtecin gerekli olduğu kapsamları tanımlayan dizeleri numaralandırır. Belirteç Microsoft Graph içinse, gerekli kapsamları her Microsoft Graph API'sinin API başvurusunda bulabilirsiniz. Referans belgelerinde "İzinler" bölümüne gidin.

Örneğin, kullanıcının kişilerini listelemek için "User.Read", "Contacts.Read" kapsamını kullanın. Daha fazla bilgi için, bkz. Microsoft Graph izinleri referansı.

Android'de uygulamayı oluştururken PublicClientApplicationBuilder kullanarak üst etkinliği belirtebilirsiniz. O sırada üst etkinliği belirtmezseniz, daha sonra aşağıdaki bölümde olduğu gibi .WithParentActivityOrWindow yoluyla belirtebilirsiniz. Üst etkinlik belirtirseniz, belirteç etkileşimden sonra bu üst etkinliğe geri döner. Belirtmezseniz, .ExecuteAsync() çağrı bir istisna fırlatır.

MSAL.NET'da belirli isteğe bağlı parametreler

Aşağıdaki bölümlerde, MSAL.NET'daki isteğe bağlı parametreler açıklanmaktadır.

HızlıCevapla

parametresi, WithPrompt() bir istem belirterek kullanıcıyla etkileşimi denetler.

İstem yapısındaki alanları gösteren resim. Bu sabit değerler, WithPrompt() parametresi tarafından görüntülenen istem türünü tanımlayarak kullanıcıyla etkileşimi denetler.

sınıfı aşağıdaki sabitleri tanımlar:

  • SelectAccount , güvenlik belirteci hizmetini (STS) hesap seçimi iletişim kutusunu sunmaya zorlar. İletişim kutusu, kullanıcının oturum açtığı hesapları içerir. Kullanıcının farklı kimlikler arasından seçim yapmasına izin vermek istediğinizde bu seçeneği kullanabilirsiniz. Bu seçenek, MSAL'nin prompt=select_account kimlik sağlayıcısına göndermesini sağlar.

    Sabit SelectAccount varsayılan değerdir ve kullanılabilir bilgilere göre mümkün olan en iyi deneyimi etkili bir şekilde sağlar. Kullanılabilir bilgiler hesap, kullanıcı için bir oturumun varlığı vb. içerebilir. Bunu yapmak için iyi bir nedeniniz yoksa bu varsayılanı değiştirmeyin.

  • Consent daha önce onay verilmiş olsa bile kullanıcıdan onay istemenizi sağlar. Bu durumda, MSAL kimlik sağlayıcısına gönderir prompt=consent .

    Güvenlik odaklı uygulamalarda, kuruluş yönetiminin kullanıcıların uygulamayı her kullandıklarında onay iletişim kutusunu görmesini gerektirdiği durumlarda, Consent sabit değerini kullanmak isteyebilirsiniz.

  • ForceLogin, istem gerekli olmasa bile hizmetin kullanıcının kimlik bilgilerini istemesini sağlar.

    Belirteç alımı başarısız olursa ve kullanıcının yeniden oturum açmasına izin vermek istiyorsanız bu seçenek yararlı olabilir. Bu durumda, MSAL kimlik sağlayıcısına gönderir prompt=login . Bu seçeneği, kuruluşun idaresinin kullanıcının uygulamanın belirli bölümlerine her eriştiğinde oturum açmasını gerektirdiği güvenlik odaklı uygulamalarda kullanmak isteyebilirsiniz.

  • Neveryalnızca .NET 4.5 ve Windows Çalışma Zamanı (WinRT) içindir. Bu sabit değer, kullanıcıya sormaz, ancak gizli yerleşik web görünümünde depolanan çerezi kullanmayı dener. Daha fazla bilgi için bkz . MSAL.NET ile web tarayıcılarını kullanma.

    Bu seçenek başarısız olursa, AcquireTokenInteractive kullanıcı arabirimi etkileşimi gerektiğini bildiren bir özel durum oluşturur. Ardından başka bir Prompt parametre kullanın.

  • NoPrompt kimlik sağlayıcısına istem göndermez.

    Bu seçenek yalnızca Azure Active Directory B2C'deki profil düzenleme ilkeleri için kullanışlıdır. Daha fazla bilgi için bkz . B2C özellikleri.

Ek Yetki Kapsamı ile Onay

Kullanıcının çeşitli kaynaklara WithExtraScopeToConsent ön onay sağlamasını istediğiniz gelişmiş bir senaryoda değiştiriciyi kullanın. Bu değiştiriciyi, normalde MSAL.NET veya Microsoft kimlik platformu ile kullanılan artımlı onayı kullanmak istemediğinizde kullanabilirsiniz. Daha fazla bilgi için bkz . Kullanıcının birkaç kaynak için onayını önceden alma.

İşte bir kod örneği:

var result = await app.AcquireTokenInteractive(scopesForCustomerApi)
                     .WithExtraScopeToConsent(scopesForVendorApi)
                     .ExecuteAsync();
Diğer isteğe bağlı parametreler

için diğer isteğe bağlı parametreler hakkında bilgi edinmek için AcquireTokenInteractiveAcquireTokenInteractiveParameterBuilder başvuru belgelerine bakın.

Protokol aracılığıyla belirteçleri edinme

Belirteçleri almak için protokolü doğrudan kullanmanızı önermeyiz. Bunu yaparsanız uygulama çoklu oturum açma (SSO), cihaz yönetimi ve Koşullu Erişim içeren bazı senaryoları desteklemez.

Mobil uygulamalara yönelik belirteçleri almak için protokolü kullandığınızda iki istekte bulunabilirsiniz:

  • Yetkilendirme kodu alın.
  • Kod karşılığında bir jeton alın.

Yetkilendirme kodu alma

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

Erişim sağla ve belirteci yenile

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

Sonraki adımlar