Compartilhar via


Chamar uma API Web em um aplicativo móvel

Aplica-se a: Círculo verde com um símbolo de marca de seleção branca que indica que o conteúdo a seguir se aplica aos locatários da força de trabalho. Locatários da força de trabalho (saiba mais)

Depois que o aplicativo conectar um usuário e receber tokens, a Biblioteca de autenticação da Microsoft (MSAL) expõe as informações sobre o usuário, o ambiente do usuário e os tokens emitidos. Seu aplicativo pode usar esses valores para chamar uma API Web ou exibir uma mensagem de boas-vindas para o usuário.

Neste artigo, primeiro vamos examinar o resultado da MSAL. Em seguida, veremos como usar um token de acesso de AuthenticationResult ou result para chamar uma API Web protegida.

Resultado MSAL

A MSAL fornece os seguintes valores:

  • AccessToken chama APIs Web protegidas em uma solicitação de portador HTTP.
  • IdToken contém informações úteis sobre o usuário conectado. Essas informações incluem o nome do usuário, o locatário inicial e um identificador exclusivo para armazenamento.
  • ExpiresOn é o tempo de expiração do token. O MSAL manipula a atualização automática de um aplicativo.
  • TenantId é o identificador do locatário no qual o usuário se conectou. Para usuários convidados no B2B do Azure Active Directory (AAD), esse valor identifica o locatário no qual o usuário se conectou. O valor não identifica o locatário inicial do usuário.
  • Scopes indica os escopos que foram concedidos com seu token. Os escopos concedidos podem ser um subconjunto dos escopos que você solicitou.

MSAL também fornece uma abstração para um valor Account. Um valor Account representa a conta conectada do usuário atual:

  • HomeAccountIdentifier Identifica o locatário inicial do usuário.
  • UserName é o idioma preferido do nome de usuário. Esse valor pode estar vazio para usuários do Azure AD B2C.
  • AccountIdentifier identifica o usuário conectado. Na maioria dos casos, esse valor é o mesmo que o valor de HomeAccountIdentifier, a menos que o usuário seja um convidado em outro locatário.

Chamar uma API

Depois de ter o token de acesso, é possível chamar uma API da Web. Seu aplicativo usará o token para criar uma solicitação HTTP e, em seguida, executará a solicitação.

Android

        RequestQueue queue = Volley.newRequestQueue(this);
        JSONObject parameters = new JSONObject();

        try {
            parameters.put("key", "value");
        } catch (Exception e) {
            // Error when constructing.
        }
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, MSGRAPH_URL,
                parameters,new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                // Successfully called Graph. Process data and send to UI.
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // Error.
            }
        }) {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> headers = new HashMap<>();

                // Put access token in HTTP request.
                headers.put("Authorization", "Bearer " + authResult.getAccessToken());
                return headers;
            }
        };

        request.setRetryPolicy(new DefaultRetryPolicy(
                3000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        queue.add(request);

MSAL para iOS e macOS

Os métodos para adquirir tokens retornam um objeto MSALResult. MSALResult expõe uma propriedade accessToken. É possível usar accessToken para chamar uma API da Web. Adicione essa propriedade ao cabeçalho de autorização HTTP antes de chamar para acessar a API Web protegida.

NSMutableURLRequest *urlRequest = [NSMutableURLRequest new];
urlRequest.URL = [NSURL URLWithString:"https://contoso.api.com"];
urlRequest.HTTPMethod = @"GET";
urlRequest.allHTTPHeaderFields = @{ @"Authorization" : [NSString stringWithFormat:@"Bearer %@", accessToken] };

NSURLSessionDataTask *task =
[[NSURLSession sharedSession] dataTaskWithRequest:urlRequest
     completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {}];
[task resume];
let urlRequest = NSMutableURLRequest()
urlRequest.url = URL(string: "https://contoso.api.com")!
urlRequest.httpMethod = "GET"
urlRequest.allHTTPHeaderFields = [ "Authorization" : "Bearer \(accessToken)" ]

let task = URLSession.shared.dataTask(with: urlRequest as URLRequest) { (data: Data?, response: URLResponse?, error: Error?) in }
task.resume()

Fazer várias solicitações de API

Se você precisar chamar a mesma API várias vezes ou se precisar chamar várias APIs, considere o seguinte ao compilar seu aplicativo:

  • Alteração incremental: A plataforma de identidade da Microsoft permite que os aplicativos obtenham consentimento do usuário quando forem necessárias permissões em vez de tudo no início. Cada vez que seu aplicativo estiver pronto para chamar uma API, ele deverá solicitar apenas os escopos de que precisa.

  • Acesso condicional: quando várias solicitações de API são feitas, em certos cenários, talvez seja necessário atender aos requisitos adicionais de acesso condicional. Os requisitos podem aumentar dessa forma se a primeira solicitação não tiver políticas de acesso condicional e se o seu aplicativo tentar acessar silenciosamente uma nova API que exija Acesso Condicional. Para lidar com esse problema, não se esqueça de detectar erros de solicitações silenciosas e esteja preparado para fazer uma solicitação interativa. Para obter mais informações, consulte Diretrizes para Acesso Condicional.

Se você precisar chamar várias APIs para o mesmo usuário, depois de adquirir um token para o usuário, será possível evitar a solicitação repetida das credenciais do usuário chamando posteriormente AcquireTokenSilent para obter um token:

var result = await app.AcquireTokenXX("scopeApi1")
                      .ExecuteAsync();

result = await app.AcquireTokenSilent("scopeApi2")
                  .ExecuteAsync();

A interação é necessária quando:

  • O usuário consentiu para a primeira API, mas agora precisa consentir para mais escopos. Nesse caso, use o consentimento incremental.
  • A primeira API não exige autenticação multifator, mas a próxima API exige.
var result = await app.AcquireTokenXX("scopeApi1")
                      .ExecuteAsync();

try
{
 result = await app.AcquireTokenSilent("scopeApi2")
                  .ExecuteAsync();
}
catch(MsalUiRequiredException ex)
{
 result = await app.AcquireTokenInteractive("scopeApi2")
                  .WithClaims(ex.Claims)
                  .ExecuteAsync();
}

Próximas etapas