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
- Opção 2: chamar uma API Web downstream com a classe auxiliar
- Opção 3: chamar uma API Web downstream sem a classe auxiliar
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