Share via


Aplicativo da Web que chama APIs Web: chamar uma API Web

Agora que você tem um token, é possível chamar uma API Web protegida. Normalmente, você chama uma API downstream do controlador ou das páginas do aplicativo Web.

Chamar uma API Web protegida

Chamar uma API Web protegida depende da linguagem e da estrutura de sua escolha:

Ao usar Microsoft.Identity.Web, você tem três opções para chamar uma API:

Opção 1: chamar o Microsoft Graph com o SDK

Nesse cenário, você chama o Microsoft Graph adicionando o pacote NuGet Microsoft.Identity.Web.GraphServiceClient e incluindo .AddMicrosoftGraph() em Startup.cs conforme especificado em Configuração de código. Em seguida, você pode injetar diretamente o GraphServiceClient em seu controlador ou construtor de página para usá-lo nas ações. A página Razor de exemplo a seguir exibe a foto do usuário conectado.

[Authorize]
[AuthorizeForScopes(Scopes = new[] { "user.read" })]
public class IndexModel : PageModel
{
 private readonly GraphServiceClient _graphServiceClient;

 public IndexModel(GraphServiceClient graphServiceClient)
 {
    _graphServiceClient = graphServiceClient;
 }

 public async Task OnGet()
 {
  var user = await _graphServiceClient.Me.GetAsync();
  try
  {
   using (var photoStream = await _graphServiceClient.Me.Photo.Content.GetAsync())
   {
    byte[] photoByte = ((MemoryStream)photoStream).ToArray();
    ViewData["photo"] = Convert.ToBase64String(photoByte);
   }
   ViewData["name"] = user.DisplayName;
  }
  catch (Exception)
  {
   ViewData["photo"] = null;
  }
 }
}

Para obter uma amostra completa, consulte Aplicativo Web ASP.NET Core que chama o Microsoft Graph.

Opção 2: chamar uma API Web downstream com a classe auxiliar

Você deseja chamar uma API Web diferente do Microsoft Graph. Nesse caso, você adiciona AddDownstreamApi no Startup.cs conforme especificado na Configuração de código e pode injetar diretamente um serviço IDownstreamApi no controlador ou construtor de página e usá-lo nas ações:

[Authorize]
[AuthorizeForScopes(ScopeKeySection = "TodoList:Scopes")]
public class TodoListController : Controller
{
  private IDownstreamApi _downstreamApi;
  private const string ServiceName = "TodoList";

  public TodoListController(IDownstreamApi downstreamApi)
  {
    _downstreamApi = downstreamApi;
  }

  public async Task<ActionResult> Details(int id)
  {
    var value = await _downstreamApi.CallApiForUserAsync(
      ServiceName,
      options =>
      {
        options.RelativePath = $"me";
      });
      return View(value);
  }
}

O CallWebApiForUserAsync também tem substituições genéricas fortemente tipadas que permitem que você receba diretamente um objeto. Por exemplo, o método a seguir recebe uma instância Todo, que é uma declaração fortemente tipada do JSON retornado pela API Web.

    // GET: TodoList/Details/5
    public async Task<ActionResult> Details(int id)
    {
        var value = await _downstreamApi.CallApiForUserAsync<object, Todo>(
            ServiceName,
            null,
            options =>
            {
                options.HttpMethod = HttpMethod.Get;
                options.RelativePath = $"api/todolist/{id}";
            });
        return View(value);
    }

Para obter uma amostra completa, consulte Aplicativo Web ASP.NET Core que chama uma API

Opção 3: chamar uma API Web downstream sem a classe auxiliar

Você decidiu adquirir um token manualmente usando o serviço IAuthorizationHeaderProvider, e agora você precisa usar o token. Nesse caso, o código a seguir continua o código de exemplo mostrado em Um aplicativo Web que chama APIs Web: Adquirir um token do aplicativo. O código é chamado nas ações dos controladores do aplicativo Web.

Depois de adquirir o token, use-o como um token de portador para chamar a API downstream, neste caso, o Microsoft Graph.

public async Task<IActionResult> Profile()
{
  // Acquire the access token.
  string[] scopes = new string[]{"user.read"};
  string authorizationHeader = await IAuthorizationHeaderProvider.GetAuthorizationHeaderForUserAsync(scopes);

  // Use the access token to call a protected web API.
  HttpClient httpClient = new HttpClient();
  client.DefaultRequestHeaders.Add("Authorization", authorizationHeader);

  var response = await httpClient.GetAsync($"{webOptions.GraphApiUrl}/beta/me");

  if (response.StatusCode == HttpStatusCode.OK)
  {
    var content = await response.Content.ReadAsStringAsync();

    dynamic me = JsonConvert.DeserializeObject(content);
    ViewData["Me"] = me;
  }

  return View();
}

Observação

Você pode usar o mesmo princípio para chamar qualquer API Web.

A maioria das APIs Web do Azure fornece um SDK que simplifica a chamada à API, como é o caso do Microsoft Graph.

Próximas etapas