Compartilhar via


Uma API Web que chama as APIs Web: chamar uma API

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

Código do controlador

Ao usar Microsoft.Identity.Web, você tem três cenários de uso:

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

Nesse cenário, você adicionou o pacote NuGet Microsoft.Identity.Web.GraphServiceClient e adicionou .AddMicrosoftGraph() no Startup.cs conforme especificado na Configuração de código e pode injetar diretamente o GraphServiceClient no controlador ou no construtor de página para uso 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;
         }
     }
 }

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

Nesse cenário, você adicionou .AddDownstreamApi() no Startup.cs conforme especificado na Configuração de código e pode injetar diretamente um serviço IDownstreamWebApi no controlador ou construtor de página e usá-lo nas ações:

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

     public TodoListController(IDownstreamWebApi downstreamWebApi)
     {
         _downstreamWebApi = downstreamWebApi;
     }

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

O método CallApiForUserAsync também tem substituições genéricas fortemente tipadas que permitem que você receba diretamente um objeto. Por exemplo, o método a seguir recebeu 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 _downstreamWebApi.CallApiForUserAsync<object, Todo>(
         ServiceName,
         null,
         options =>
         {
             options.HttpMethod = HttpMethod.Get;
             options.RelativePath = $"api/todolist/{id}";
         });
     return View(value);
 }

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

Se você decidiu obter um cabeçalho de autorização usando a interface IAuthorizationHeaderProvider, o código a seguir continua no código de exemplo mostrado em Uma API Web que chama as APIs Web: adquira um token para o aplicativo. O código é chamado nas ações dos controladores de API. Ele chama uma API downstream nomeada todolist.

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

private async Task CallTodoListService(string accessToken)
{
  // After the token has been returned by Microsoft.Identity.Web, add it to the HTTP authorization header before making the call to access the todolist service.
  authorizationHeader = await authorizationHeaderProvider.GetAuthorizationHeaderForUserAsync(scopes);
  _httpClient.DefaultRequestHeaders["Authorization"] = authorizationHeader;

  // Call the todolist service.
  HttpResponseMessage response = await _httpClient.GetAsync(TodoListBaseAddress + "/api/todolist");
  // ...
}

Próximas etapas

  • Saiba mais criando um aplicativo Web ASP.NET Core que conecta usuários na série de tutoriais de várias partes a seguir

  • Explorar os exemplos de API Web da plataforma de identidade da Microsoft