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 do Microsoft Graph
- 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ê 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
Saiba mais sobre a compilar de um aplicativo Web ASP.NET Core que conecta usuários na seguinte série de tutoriais de várias partes
Explore as amostras de aplicativo Web da plataforma de identidade da Microsoft