Una API web que llama a las API web: Llamar a una API
Una vez que disponga de un token, puede llamar a una API web protegida. Normalmente, se llama a las API de nivel inferior desde el controlador o las páginas de la API web.
Código del controlador
Cuando se usa Microsoft.Identity.Web, hay tres escenarios de uso:
- Opción 1: Llamada a Microsoft Graph con el SDK
- Opción 2: Llamada a una API web de nivel inferior con la clase auxiliar
- Opción 3: Llamada a una API web de nivel inferior sin la clase auxiliar
Opción 1: Llamada a Microsoft Graph con el SDK
En este escenario, ha agregado .AddMicrosoftGraph()
en el archivo Startup.cs tal y como se especifica en Configuración del código y puede insertar directamente el elemento GraphServiceClient
en el controlador o en el constructor de la página para su uso en las acciones. En la siguiente página de Razor de ejemplo se muestra la foto del usuario que inició sesión.
[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.Request().GetAsync();
try
{
using (var photoStream = await _graphServiceClient.Me.Photo.Content.Request().GetAsync())
{
byte[] photoByte = ((MemoryStream)photoStream).ToArray();
ViewData["photo"] = Convert.ToBase64String(photoByte);
}
ViewData["name"] = user.DisplayName;
}
catch (Exception)
{
ViewData["photo"] = null;
}
}
}
Opción 2: Llamada a una API web de nivel inferior con la clase auxiliar
En este escenario, ha agregado .AddDownstreamWebApi()
en el archivo Startup.cs tal y como se especifica en Configuración del código y puede insertar directamente el servicio IDownstreamWebApi
en el controlador o en el constructor de la página para su uso en las acciones:
[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.CallWebApiForUserAsync(
ServiceName,
options =>
{
options.RelativePath = $"me";
});
return View(value);
}
El método CallWebApiForUserAsync
también tiene invalidaciones genéricas fuertemente tipadas que permiten recibir directamente un objeto. Por ejemplo, el método siguiente ha recibido una instancia de Todo
, que es una representación fuertemente tipada del código JSON devuelto por la API web.
// GET: TodoList/Details/5
public async Task<ActionResult> Details(int id)
{
var value = await _downstreamWebApi.CallWebApiForUserAsync<object, Todo>(
ServiceName,
null,
options =>
{
options.HttpMethod = HttpMethod.Get;
options.RelativePath = $"api/todolist/{id}";
});
return View(value);
}
Opción 3: Llamada a una API web de nivel inferior sin la clase auxiliar
Ha decidido adquirir un token manualmente mediante el servicio ITokenAcquisition
, ahora debe usar el token. En ese caso, el código siguiente continúa el código de ejemplo que se muestra en API web que llama a las API web: Adquisición de un token para la aplicación. El código se llama en las acciones de los controladores de API. Llama a una API de nivel inferior denominada todolist.
Una vez que haya adquirido el token, úselo como token de portador para llamar a la API de nivel inferior.
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.
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
// Call the todolist service.
HttpResponseMessage response = await _httpClient.GetAsync(TodoListBaseAddress + "/api/todolist");
// ...
}
Pasos siguientes
Avance al siguiente artículo de este escenario, Paso a producción.